一、源代码
#include
#include
#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 { 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、退出时显示现在主存中的页面号(即数组的值)。