资源描述
一、 源代码
#include <cstdio>
#include <cstring>
#define SizeOfPage 100
#define SizeOfBlock 128
#define M 4
struct info//页表
{
long textNumber;//页号
bool flag; //标志
long block;//块号
long disk;//在磁盘上的位置
bool dirty;//修改标志
}pagelist[SizeOfPage];
long po;//队列标记
long P[M];
int num;
void init()
{
memset(pagelist,0,sizeof(pagelist));
//根据实验数据初始化
pagelist[0].textNumber=0;
pagelist[0].flag=1;
pagelist[0].block=5;
pagelist[0].dirty=0;
pagelist[0].disk=11;
pagelist[1].textNumber=1;
pagelist[1].flag=1;
pagelist[1].block=8;
pagelist[1].dirty=0;
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].dirty=0;
pagelist[3].disk=21;
pagelist[4].textNumber=4;
pagelist[4].flag=0;
pagelist[4].dirty=0;
pagelist[4].disk=22;
pagelist[5].textNumber=5;
pagelist[5].flag=0;
pagelist[5].dirty=0;
pagelist[5].disk=23;
pagelist[6].textNumber=6;
pagelist[6].flag=0;
pagelist[6].dirty=0;
pagelist[6].disk=121;
num=6;
}
void init_ex2()
{
po=0;
P[0]=0;P[1]=1;P[2]=2;P[3]=3;
init();
}
void work()
{
long p,q,i;
char s[100];
bool stop=0;
do
{
printf("请输入指令的页号、单元号,以及是否为存指令(输入exit结束循环):\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
{
scanf("%s",s);
if (pagelist[p].flag)
{
printf("绝对地址=%ld\n",pagelist[p].block*SizeOfBlock+q);
if (s[0]=='Y' || s[0]=='y')
{
pagelist[p].dirty=1;//已修改过
}
}
else
{
if (pagelist[P[po]].dirty)
{
//将更新后的内容写回外存
pagelist[P[po]].dirty=0;
}
pagelist[P[po]].flag=0;//修改要调出的页标志
printf("调出 %ld 调入 %ld\n",P[po],p); //显示调出调入页面
pagelist[p].block=pagelist[P[po]].block;
pagelist[p].flag=1;//该页被调入内存
P[po]=p;
po=(po+1)%M;
}
}
}while (!stop);
printf("数组P 的值为:\n");
for (i=0;i<M;i++)
{
printf("P[%ld]=%ld\n",i,P[i]);
}
}
void printInit()
{
int i;
printf("____________________________________________________________________\n");
printf("| 页号 | 标志 | 主存块号 | 修改标志 |在磁盘上的位置 \n");
for(i=0;i<=num;i++)
{
if(pagelist[i].flag==1)
printf("| %ld | %d | %ld | %d | %ld \n",pagelist[i].textNumber,pagelist[i].flag,pagelist[i].block,pagelist[i].dirty,pagelist[i].disk);
else
printf("| %ld | %d | | %d | %ld \n",pagelist[i].textNumber,pagelist[i].flag,pagelist[i].dirty,pagelist[i].disk);
}
printf("____________________________________________________________________\n");
}
int main()
{
printf("初始化页表:\n");
init();
//打印页表
printInit();
init_ex2();
work(); //算法分析
return 0;
}
二、 结果如下:
A、初始化页表
B、测试数据
I、未发生缺页中断时
2、发生缺页中断时
3、退出时显示现在主存中的页面号(即数组的值)。
展开阅读全文