操作系统实验四模拟页面置换算法.docx

上传人:b****5 文档编号:2840127 上传时间:2022-11-15 格式:DOCX 页数:13 大小:436.05KB
下载 相关 举报
操作系统实验四模拟页面置换算法.docx_第1页
第1页 / 共13页
操作系统实验四模拟页面置换算法.docx_第2页
第2页 / 共13页
操作系统实验四模拟页面置换算法.docx_第3页
第3页 / 共13页
操作系统实验四模拟页面置换算法.docx_第4页
第4页 / 共13页
操作系统实验四模拟页面置换算法.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

操作系统实验四模拟页面置换算法.docx

《操作系统实验四模拟页面置换算法.docx》由会员分享,可在线阅读,更多相关《操作系统实验四模拟页面置换算法.docx(13页珍藏版)》请在冰豆网上搜索。

操作系统实验四模拟页面置换算法.docx

操作系统实验四模拟页面置换算法

实验四实现页面置换算法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;i

M_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;i

scanf("%d",&Access_series[i]);

}

else{//产生随机数,即页面分配情况

for(inti=0;i

Access_series[i]=rand()%total_instruction+1;

}

 

intpc1,pc2;//两个子进程,p1执行FIFO算法,p2执行LRU算法

while((pc1=fork())==-1);

if(pc1==0){

for(inti=0;i

intflag1=0;//页面是否已存在于内存中的标志,1表示存在

page1=Access_series[i];//读入一个逻辑页面

for(intj=0;j

if(page1==M_Frame[j].page_No){

for(inti=0;i

printf("%d",Access_series[i]);

printf("\n");

printf("%dhavefound!

\n",page1);

M_Frame[j].used_time=time1;

for(intk=0;k

printf("%d",M_Frame[k].page_No);

printf("\n\n");

flag1=1;

break;

}

}

if(flag1==0){//若不存在,发生缺页,缺页次数加1

diseffect1++;

if(p1

M_Frame[p1].page_No=page1;//分配一个空的内存页面

M_Frame[p1].time=time1;//新进入的页面要注意记录进入时间

M_Frame[p1].used_time=time1;

p1++;

for(intj=0;j

printf("%d",Access_series[j]);

printf("\n");

printf("%ddiseffect!

\n",page1);

for(intj=0;j

printf("%d",M_Frame[j].page_No);

printf("\n\n");

}

else{//内存中没有,内存又满了,只能使用FIFO算法淘汰内存中最先进入的页面

intmin=999,pos=0;//找到内存中最先进入的页面,其占用的内存页面号为pos

for(intj=0;j

if(M_Frame[j].time

min=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;j

printf("%d",Access_series[j]);

printf("\n");

printf("%ddiseffect!

lose%d\n",page1,temp1);

for(intj=0;j

printf("%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;i

M_Frame[i].page_No=-1;

while((pc2=fork())==-1);

if(pc2==0){

for(inti=0;i

intflag2=0;

page2=Access_series[i];

for(intj=0;j

if(page2==M_Frame[j].page_No){

printf("%dhavefound!

\n",page2);

M_Frame[j].used_time=time2;//用到的页面要注意记录最后一次使用时间

for(intk=0;k

printf("%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;j

printf("%d",Access_series[j]);

printf("\n");

printf("%ddiseffect!

\n",page2);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1