OS页面置换算法模拟实现Word文档下载推荐.docx
《OS页面置换算法模拟实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《OS页面置换算法模拟实现Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
假定在内存中的某个页面,在最近一段时间内未被使用的时间最长,那么在最近的将来也可能不再被使用。
3.理想页面置换(OPT)算法
最佳置换算法由Belady于1966年提出,这是一种理想情况下的页面置换算法,但实际上不可能实现。
但人们目前把还无法预知一个进程在内的若干页面中,哪一个页面是未来最长时间内不再被访问,因而该算法无法实现。
基本思想是内存中每个页都用该页面首次被访问前所要执行的指令数进行标记,标记最大的页应该被置换
三、详细设计及编码
1.模块设计
1.进入系统模块。
进入登陆界面,输入内存页面数和实际页数
2.页面号打印模块。
打印输入的页面号。
3.菜单选择模块。
选择相应的页面的置换方式,选择相应的字母,进入相应的功能。
4.算法模块。
选择相应的页面置换算法。
5.显现输出模块。
显示页面被置换的情况。
5.缺页次数和缺页率模块。
计算页面号输入的计算结果。
6.退出系统模块。
退出置换页面。
2.系统详细设计
1.系统主界面设计(包含登陆模块设计)
首先贯穿全局的全局需要一系列的函数来实现本操作系统的各种功能。
需要函数自带的文件stdafx.h和iostream.h首先输入的页数自定义最大值为40程序用#defineM40实现。
为了防止输入的页数太多,超出自定义40个数的范围,通过输入函数实现:
intInput(intm,Prop[M])//输入函数。
2.系统模块。
首先通过打印当前的页面
voidprint(Pro*page1)//打印当前的页面
{
Pro*page=newPro[N];
page=page1;
for(inti=0;
i<
N;
i++)cout<
<
page[i].num<
"
"
;
cout<
endl;
}
查找内存中是否存在要调入的页面
intSearch(inte,Pro*page1){
i++)if(e==page[i].num)returni;
return-1;
}
找出离现在时间最长的页面
intMax(Pro*page1){
inte=page[0].time,i=0;
while(i<
N)
{if(e<
page[i].time)e=page[i].time;
i++;
}
for(i=0;
i++)if(e==page[i].time)returni;
找到最久不使用的页面
intCompfu(Pro*page1,inti,intt,Prop[M])
{Pro*page=newPro[N];
intcount=0;
for(intj=i;
j<
M;
j++)
{if(page[t].num==p[j].num)break;
elsecount++;
returncount;
3.FIFO页面置换和缺页次数及缺页率模块实现如下:
if(c=='
1'
)//FIFO页面置换
{n=1;
cout<
页面置换情况:
while(i<
m)
{if(Search(p[i].num,page)>
=0)i++;
//找到相同的页面
else
{if(t==N)t=0;
else
{n++;
page[t].num=p[i].num;
print(page);
t++;
}
}
}
缺页次数:
n<
缺页率:
n/m<
}
4.LRU页面置换和缺页次数及缺页率模块实现如下:
2'
)//LRU页面置换
{n=1;
cout<
while(i<
{intk;
k=t=Search(p[i].num,page);
if(t>
=0)
page[t].time=0;
else
{n++;
t=Max(page);
page[t].num=p[i].num;
if(t==0){page[t+1].time++;
page[t+2].time++;
if(t==1){page[2].time++;
page[0].time++;
if(t==2){page[1].time++;
if(k==-1)print(page);
i++;
5.OPT页面置换和缺页次数及缺页率模块实现如下(本代码在页面置换中:
3'
)//OPT页面置换
{
n=1;
{
if(Search(p[i].num,page)>
else
{
inttemp=0,cn;
for(t=0;
t<
t++)
{
if(temp<
Compfu(page,i,t,p))
{
temp=Compfu(page,i,t,p);
cn=t;
}
page[cn]=p[i];
n++;
print(page);
i++;
四、结果及分析
1.测试方案
1.测试方案
(一)
输入可用页面为3,实际页数是20,各个页面号70120304230321201701选择实验要求FIFO页面置换,然后选择LRU算法。
最后选择OPT(对比)。
2.测试方案
(二)
输入可用页面为3,实际页数是20,各个页面号10710212230340302107选择实验要求FIFO页面置换,然后选择LRU算法。
最后选择OPT(对比1)
3.测试方案(三)
输入可用页面为4,实际页数是20,各个页面号70120304230321201701(课本例题)选择实验要求FIFO页面置换,然后选择LRU算法。
最后选择OPT(对比)
2.测试结果
1.测试方案
(一)结果。
输入可用页面为3,实际页数是20,各个页面号70120304230321201701测试成功。
见图(图4-1输入页面登陆与输入)选择FIFO页面置换时显示页面置换情况、缺页次数和缺页率(见图4-2FIFO页面置换界面)。
图4-1输入页面登陆与输入
图4-2FIFO页面置换界面
选择LRU页面置换时显示页面置换情况、缺页次数和缺页率(见图4-3LRU页面置换界面)
图4-3LRU页面置换界面
选择OPT页面置换时(对比)显示页面置换情况、缺页次数和缺页率(见图4-4OPT页面置换界面)
图4-43OPT页面置换界面
2.测试方案
(二)结果。
输入可用页面为3,实际页数是20,各个页面号10710212230340302107测试成功。
见图(图4-5输入页面登陆与输入)选择FIFO页面置换时显示页面置换情况、缺页次数和缺页率(见图4-5FIFO页面置换界面)
图4-5输入页面登陆与输入
选择LRU页面置换时显示页面置换情况、缺页次数和缺页率(见图4-6LRU页面置换界面)
选择OPT页面置换时(对比)显示页面置换情况、缺页次数和缺页率(见图4-7OPT页面置换界面)
图4-6LRU页面置换界面图4-7OPT页面置换界面
3.测试方案(三)结果。
见图(图4-1输入页面登陆与输入)选择FIFO页面置换时显示页面置换情况、缺页次数和缺页率(见图4-8FIFO页面置换界面)
图4-8FIFO页面置换界面
选择LRU页面置换时显示页面置换情况、缺页次数和缺页率(见图4-9LRU页面置换界面)
选择OPT页面置换时(对比)显示页面置换情况、缺页次数和缺页率(见图4-10OPT页面置换界面)
图4-9LRU页面置换界面图4-9LRU页面置换界面
3.测试结果分析
从上述结果可知,在内存页面为3个页面时,由于用户进程的所有指令基本上都没装入内存,只装入一小部分,从而算法之间的差别比较大。
三种算法的访内命中率大致在45%至75%之间变化。
但是,FIFO算法与OPT算法之间的差别一般在25个百分点左右。
比较上述三种算法,以OPT算法的命中率最高,LRU算法次之,其次是FIFO算法。
五、设计小结
原以为本题看起来很简单,也就不过是一个随机数函数和三种算法实现而已,但是事实证明我彻彻底底的错了。
首先是随机数生成,来回看了好几遍都没弄懂生成方法,最后经同学指点一下才终于明白,由于个人水平有限,光是理解原理及理清程序结构就已经花费了很多宝贵的时间。
本次实验中体会最深刻的就是运用了构件化的方法来测试模块,否则面对如此可观的代码量,如果每次都是编写完一点功能或者编写完所有功能才进行测试,debug的话都不知道从哪儿找起了,特别对于编程水平不高的自己来说,这样做无疑是自掘坟墓,程序完成之日将遥遥无期。
六、实验代码
#include<
iostream.h>
#defineM40
intN;
structPro//结构体
intnum,time;
};
intInput(intm,Prop[M])//输入函数
cout<
请输入实际页数:
do
cin>
>
m;
if(m>
M)cout<
数目太多,请重试"
elsebreak;
while
(1);
endl<
请输入各页面号"
for(inti=0;
i++)
p[i].num;
p[i].time=0;
returnm;
voidprint(Pro*page1)//打印当前的页面
Pro*page=newPro[N];
page=page1;
intSearch(inte,Pro*page1)//查找内存中是否存在要调入的页面
return-1;
intMax(Pro*page1)//找出离现在时间最长的页面
inte=page[0].time,i=0;
while(i<
if(e<
i++;
for(i=0;
intCompfu(Pro*page1,inti,intt,Prop[M])//找到最久不使用的页面
intcount=0;
for(intj=i;
if(page[t].num==p[j].num)break;
elsecount++;
returncount;
intmain()
可用内存页面数"
Prop[M];
charc;
intm=0,t=0;
floatn=0;
m=Input(m,p);
do{
i++)//初试化页面基本情况
page[i].num=0;
page[i].time=2-i;
i=0;
f:
FIFO页面置换"
l:
LRU页面置换"
o:
OPT页面置换"
按其它键结束"
c;
f'
n=1;
if(Search(p[i].num,page)>
else
if(t==N)t=0;
n++;
//
page[t].num=p[i].num;
print(page);
t++;
l'
{n=1;
intk;
k=t=Search(p[i].num,page);
if(t>
page[t].time=0;
t=Max(page);
if(t==0){page[t+1].time++;
if(t==1){page[2].time++;
if(t==2){page[1].time++;
if(k==-1)print(page);
o'
inttemp=0,cn;
for(t=0;
if(temp<
temp=Compfu(page,i,t,p);
cn=t;
page[cn]=p[i];
}while(c=='
||c=='
);
return0;