第一篇:请求分页式存储器重硬件的地址转换和缺页中断源程序及结果
一、源代码: #include
struct info//页表 { long textNumber;//页号
bool flag;//标志
long block;//块号
long disk;//在磁盘上的位置
//bool dirty;//修改标志用于调度算法处理缺页中断 }pagelist[SizeOfPage];int num;void init(){ memset(pagelist,0,sizeof(pagelist));
//自定义的页号和其信息 pagelist[0].textNumber=0;pagelist[0].flag=1;pagelist[0].block=5;pagelist[0].disk=11;
pagelist[1].textNumber=1;pagelist[1].flag=1;pagelist[1].block=8;pagelist[1].disk=12;
pagelist[2].textNumber=2;pagelist[2].flag=1;pagelist[2].block=9;pagelist[2].disk=13;
pagelist[3].textNumber=3;pagelist[3].flag=1;pagelist[3].block=1;pagelist[3].disk=21;
pagelist[4].textNumber=4;pagelist[4].flag=0;pagelist[4].disk=22;
pagelist[5].textNumber=5;pagelist[5].flag=0;pagelist[5].disk=23;
pagelist[6].textNumber=6;pagelist[6].flag=0;pagelist[6].disk=121;num=6;} void work(){ bool stop=0;long p,q;char s[128];do {
printf(“请输入指令的页号和单元号:n”);
if(scanf(“%ld%ld”,&p,&q)!=2)
{
scanf(“%s”,s);
if(strcmp(s,“exit”)==0)
{
stop=1;
}
}
else if(q>128)
{
printf(“注意!所输入的单元已经越界!n请继续......n”);
q=-1;
}
else
{
if(pagelist[p].flag)
{
printf(“绝对地址=%ldn”,pagelist[p].block*SizeOfBlock+q);
}
else
{
printf(“* %ldn”,p);
printf(“第%ld页未装入主存的页所占的块号!n”,p);
}
} }while(!stop);}
void printInit(){
init();int i;
printf(“____________________________________________________________________n”);
printf(“|
页号
|
标志
|
主存块号
|在磁盘上的位置n”);
for(i=0;i<=num;i++){
if(pagelist[i].flag==1)
printf(“|
%ld
|
%d
|
%ld
|
%ld
n”,pagelist[i].textNumber,pagelist[i].flag,pagelist[i].block,pagelist[i].disk);
else
printf(“|
%ld
|
%d
|
|
%ld
n”,pagelist[i].textNumber,pagelist[i].flag,pagelist[i].disk);
}
printf(“____________________________________________________________________n”);
}
int main(){ printf(“初始化页表:n”);printInit();work();return 0;}
二、结果如下:
1、初始化页面
2、测试结果
a、当输入已在内寸中的页号时(地址单元越界和不越界两种)
b、当发生缺页时