文档库 最新最全的文档下载
当前位置:文档库 › FIFO页面调度算法处理缺页中断源代码及结果

FIFO页面调度算法处理缺页中断源代码及结果

FIFO页面调度算法处理缺页中断源代码及结果
FIFO页面调度算法处理缺页中断源代码及结果

一、源代码

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

相关文档
相关文档 最新文档