操作系统实验四模拟页面置换算法.docx
《操作系统实验四模拟页面置换算法.docx》由会员分享,可在线阅读,更多相关《操作系统实验四模拟页面置换算法.docx(13页珍藏版)》请在冰豆网上搜索。
![操作系统实验四模拟页面置换算法.docx](https://file1.bdocx.com/fileroot1/2022-11/15/4e8a9843-bb52-4314-8006-241976f560f1/4e8a9843-bb52-4314-8006-241976f560f11.gif)
操作系统实验四模拟页面置换算法
实验四实现页面置换算法FIFO和LRU
一、实验目的:
(1)进一步理解父子进程之间的关系;
(2)理解内存页面调度的机理;
(3)掌握页面置换算法的实现方法;
(4)通过实验比较不同调度算法的优劣;
(5)培养综合运用所学知识的能力。
页面置换算法是虚拟存储管理实现的关键,通过本次试验理解内存页面调度的机制,在模拟实现FIFO、LRU等经典页面置换算法的基础上,比较各种置换算法的效率及优缺点,从而了解虚拟存储实现的过程。
将不同的置换算法放在不同的子进程中加以模拟,培养综合运用所学知识的能力。
二、实验内容及要求:
(1)这是一个综合型实验,要求在掌握父子进程并发执行机制和内存页面置换算法的基础上,能综合运用这两方面的知识,自行编制程序;
(2)程序涉及一个父进程和两个子进程。
父进程使用rand()函数随机产生若干随机数,经过处理后,存于一数组Acess_Series[]中,作为内存页面访问的序列。
两个子进程根据这个访问序列,分别采用FIFO和LRU两种不同的页面置换算法对内存页面进行调度。
要求:
(3)每个子进程应能反映出页面置换的过程,并统计页面置换算法的命中或缺页情况。
设缺页的次数为diseffect。
总的页面访问次数为total_instruction。
缺页率=disaffect/total_instruction
命中率=1-disaffect/total_instruction
(4)说明FIFO算法存在的Belady现象。
三、实现:
数据结构
(1)存放页面访问序列的数组:
intAcess_Series[total_instruction];
inttotal_instruction;//进程总的页面数
(2)用一个结构数组M_Frame[]记录为进程分配的内存页面的使用情况:
structone_frame{//记录为进程分配的内存页面情况;
intpage_No;//记录页面号
inttime;//记录页面进入内存时间
intused_time;//记录页面最近使用时间
};
one_frameM_Frame[frame_num];
intframe_num;//驻留集大小
(3)本次实验我并没有采用推荐的数据结构——
structone_frame{
intpage_no;
charflag;
};
structone_frameM_Frame[frame_num];
是因为我认为这个数据结构并没有很好地体现出FIFO依据进入内存时间来置换页面、LRU依据最近使用时间来置换页面。
所以我在自己编写程序时用了我自认为最恰当的数据结构,这也是本程序的大胆创新点。
程序流程图
图1父进程流程图
图2子进程pc1流程图
图3子进程pc3流程图
四、运行结果及说明
上述两幅图为驻留集大小为3的情况
上述两幅图为驻留集大小为4的情况
对比不难发现,FIFO算法随着内存页框的增多,缺页率却随之增加,这就是Belady现象;而LRU算法随着内存页框的增多,缺页率随之下降。
五、源代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
usingnamespacestd;
inttotal_instruction;//进程总的页面数
intframe_num;//驻留集大小
structone_frame{//记录为进程分配的内存页面情况;
intpage_No;//记录页面号
inttime;//记录页面进入内存时间
intused_time;//记录页面最近使用时间
};
intmain(){
inttime1=0,time2=0;//系统时间
intpage1,page2;//每次读入一个逻辑页面
intp1=0,p2=0;//内存页框指针,最大为frame_num
intdiseffect1=0,diseffect2=0;//缺页次数
floatf;//缺页率
printf("PleaseinputthenumberofPageFrames:
\n");
scanf("%d",&frame_num);
one_frameM_Frame[frame_num];
printf("PleaseinputthenumberofPages:
\n");
scanf("%d",&total_instruction);
intAccess_series[total_instruction];
for(inti=0;iM_Frame[i].page_No=-1;
inta=0;
printf("是否随机生成访问页序号?
(1为是)\n");
scanf("%d",&a);
if(a!
=1){
printf("Pleaseinput%d个数字\n",total_instruction);
for(inti=0;iscanf("%d",&Access_series[i]);
}
else{//产生随机数,即页面分配情况
for(inti=0;iAccess_series[i]=rand()%total_instruction+1;
}
intpc1,pc2;//两个子进程,p1执行FIFO算法,p2执行LRU算法
while((pc1=fork())==-1);
if(pc1==0){
for(inti=0;iintflag1=0;//页面是否已存在于内存中的标志,1表示存在
page1=Access_series[i];//读入一个逻辑页面
for(intj=0;jif(page1==M_Frame[j].page_No){
for(inti=0;iprintf("%d",Access_series[i]);
printf("\n");
printf("%dhavefound!
\n",page1);
M_Frame[j].used_time=time1;
for(intk=0;kprintf("%d",M_Frame[k].page_No);
printf("\n\n");
flag1=1;
break;
}
}
if(flag1==0){//若不存在,发生缺页,缺页次数加1
diseffect1++;
if(p1M_Frame[p1].page_No=page1;//分配一个空的内存页面
M_Frame[p1].time=time1;//新进入的页面要注意记录进入时间
M_Frame[p1].used_time=time1;
p1++;
for(intj=0;jprintf("%d",Access_series[j]);
printf("\n");
printf("%ddiseffect!
\n",page1);
for(intj=0;jprintf("%d",M_Frame[j].page_No);
printf("\n\n");
}
else{//内存中没有,内存又满了,只能使用FIFO算法淘汰内存中最先进入的页面
intmin=999,pos=0;//找到内存中最先进入的页面,其占用的内存页面号为pos
for(intj=0;jif(M_Frame[j].timemin=M_Frame[j].time;
pos=j;
}
}
inttemp1=M_Frame[pos].page_No;
M_Frame[pos].page_No=page1;//将所读的页面调入
M_Frame[pos].time=time1;//新进入的页面要注意记录进入时间
M_Frame[pos].used_time=time1;
for(intj=0;jprintf("%d",Access_series[j]);
printf("\n");
printf("%ddiseffect!
lose%d\n",page1,temp1);
for(intj=0;jprintf("%d",M_Frame[j].page_No);
printf("\n\n");
}
}
time1++;//系统时间增加
//cout<<"i"<<""<
}
f=diseffect1/(total_instruction*1.0);//计算缺页率
printf("diseffectrateofFIFO%f\n\n\n",f);
exit(0);
}
wait(0);
for(inti=0;iM_Frame[i].page_No=-1;
while((pc2=fork())==-1);
if(pc2==0){
for(inti=0;iintflag2=0;
page2=Access_series[i];
for(intj=0;jif(page2==M_Frame[j].page_No){
printf("%dhavefound!
\n",page2);
M_Frame[j].used_time=time2;//用到的页面要注意记录最后一次使用时间
for(intk=0;kprintf("%d",M_Frame[k].page_No);
printf("\n\n");
flag2=1;
break;
}
}
if(flag2==0){//没有找到,发生缺页
diseffect2++;
if(p2{
M_Frame[p2].page_No=page2;
M_Frame[p2].time=time2;
M_Frame[p2].used_time=time2;//用到的页面要注意记录最后一次使用时间
p2++;
for(intj=0;jprintf("%d",Access_series[j]);
printf("\n");
printf("%ddiseffect!
\n",page2);