页面置换算法模拟程序附代码Word文件下载.docx
《页面置换算法模拟程序附代码Word文件下载.docx》由会员分享,可在线阅读,更多相关《页面置换算法模拟程序附代码Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。
1.2任务分析
首先,定义宏变量,设置所占最大内存长度。
编辑以时间为种子,初始化随即发生器。
进行相关页面输入程序的编写以及页面的打印。
尔后,寻找最近最近最久未使用的页面、记录当前内存块中页面离下次使用间隔长度等相关程序的代码编写。
最后,进行)FIFO、LRU、OPT三种算法的编写。
2.需求分析
1.用随机数方法产生页面走向,页面走向长度为L。
2.根据页面走向,分别采用FIFO和LRU算法进行页面置换,统计缺页率;
为简化操作,在淘汰一页时,只将该页在页表中抹去,而不再判断它是否被改写过,也不将它写回到辅存。
3.假定可用内存块和页表长度(作业的页面数)分别为m和k,初始时,作业页面都不在内存。
随机数产生程序:
inti,j;
j=time(NULL);
//取时钟时间
srand(j);
//以时钟时间x为种子,初始化随机数发生器
cout<
<
"
输出随机数:
;
for(i=0;
i<
m;
i++)
{
p[i].num=rand()%10+1;
//产生1到10之间的随即数放到数组p中
p[i].time=0;
cout<
p[i].num<
}
上述随机数发生函数产生的随机数为0.0~1.0,稍另变化就可得到0~n?
1之间的随机数。
程序开始时,应对变量Seed(实型)赋初值。
根据页面置换算法的理论操作及要求,首先要进行页面长度的确定,定义结构体用以储存数据,进行主界面代码及FIFO、LRU、OPT页面置换算法代码的编写。
3.方案设计
其次,寻找最近最近最久未使用的页面、记录当前内存块中页面离下次使用间隔长度等相关程序的代码编写。
最后,进行FIFO、LRU、OPT三种算法的编写。
.
程序运行平台
VC++6.0
具体操作如下:
在VC++6.0的环境下准备用时钟函数调用库函数(#include<
time.h>
)、取时钟时间并存入t调用库函数(t=time(NULL))、用时间t初始化随机数发生器调用库函数(srand(t)返回一个1~10之间的随机数(x=rand()%10+1)。
编写三种算法。
4.总体设计
4.1程序N-S图
程序开始
输入选择项(进行判断)
页面存在进入下一部操作
此项不存在
输入要输出的结果
输出结果
结束
4.2主要的函数
Input(intm,Prop[L])(打印页面走向状态);
voidprint(Pro*page1)(打印当前的页面);
intSearch(inte,Pro*page1)(寻找内存块中与e相同的块号);
intMax(Pro*page1)(寻找最近最长未使用的页面);
intCount(Pro*page1,inti,intt,Prop[L])(记录当前内存块中页面离下次使用间隔长度);
intmain()(主函数);
.随机数发生器
#include<
stdlib.h>
#include<
//准备用时钟函数调用库函数
t=time(NULL);
//取时钟时间并存入t调用库函数
srand(t);
//用时间t初始化随机数发生器调用库函数
x=rand()%10+1;
//返回一个1~10之间的随机数
4.3主要流程图及代码
4.3.1FIFO(先进先出)
设计原理:
需要进行页面置换,即把内存中装入最早的那个页面淘汰,换入当前的页面。
算法流程图
Y
N
图4-1FIFO算法流程图
代码:
if(c==1)//FIFO页面置换
n=0;
cout<
******************************************"
endl;
cout<
FIFO算法页面置换情况如下:
while(i<
m)
if(Search(p[i].num,page)>
=0)//当前页面在内存中
{cout<
//输出当前页p[i].num
cout<
不缺页"
i++;
//i加1
}
else//当前页不在内存中
if(t==M)t=0;
else
n++;
//缺页次数加1
page[t].num=p[i].num;
//把当前页面放入内存中
cout<
print(page);
//打印当前页面
t++;
//下一个内存块
i++;
//指向下一个页面
缺页次数:
n<
缺页率:
n/m<
4.3.2LRU(最近最久未使用)
当需要淘汰某一页时,选择离当前时间最近的一段时间内最久没有使用过的页先淘汰该算法的主要出发点是,如果某页被访问了,则它可能马上还要被访问。
或者反过来说如果某页很长时间未被访问,则它在最近一段时间也不会被访问。
算法流程图:
YN
图4-2LRU算法流程图
if(c==2)//LRU页面置换
{
LRU算法页面置换情况如下:
inta;
t=Search(p[i].num,page);
if(t>
=0)//如果已在内存块中
{
page[t].time=0;
//把与它相同的内存块的时间置0
for(a=0;
a<
M;
a++)
if(a!
=t)page[a].time++;
//其它的时间加1
}
else//如果不在内存块中
t=Max(page);
//返回最近最久未使用的块号赋值给t
//进行替换
page[t].time=0;
//替换后时间置为0
cout<
print(page);
for(a=0;
i++;
}
}
4.3.3OPT(最佳置换算法)
需要进行页面置换,把内存中以后一段时间都不使用或是使用时间离现在最远的页面换出。
流程图:
图4-3OPT流程图
if(c==3)//OPT页面置换
OPT算法置换情况如下:
if(Search(p[i].num,page)>
{
else//如果不在内存块中
inta=0;
for(t=0;
t<
t++)
if(page[t].num==0)a++;
//记录空的内存块数
if(a!
=0)//有空内存块
{
intq=M;
for(t=0;
if(page[t].num==0&
&
q>
t)q=t;
//把空内存块中块号最小的找出来
page[q].num=p[i].num;
n++;
print(page);
}
else
inttemp=0,s;
t++)//寻找内存块中下次使用离现在最久的页面
if(temp<
Count(page,i,t,p))
{
temp=Count(page,i,t,p);
s=t;
}//把找到的块号赋给s
page[s].num=p[i].num;
}
}
4.4实现结果
程序在运行的情况下,进入主界面输入菜单,如图3-3所示:
输入14:
图4-5输入14后的输出图
输入25:
图5-6输入数据25后输出图
输入数据18:
图5-7输入数据18后的输出图
输入数据:
图5-8输出图
选1,进入FIFO页面置换:
图5-9FIFO的输出图
选2,进入LRU页面置换:
图5-10LRU的输出图
输入3,进入OPT页面置换:
图5-11OPT的输出图
5.程序测试
5.1设计测试数据
A142518;
264;
B1
C2
D3
5.2测试结果及分析
1)测试A结果及分析
进入主菜单后输入14、25,显示输入不满足要求。
输入18显示相关信息;
输入2、6不满足要求,输入4显示出相关信息。
2)测试结果及分析
显示出FIFO页面置换算法的缺页信息及缺页率。
3)测试C结果及分析
显示出LRU页面置换算法的缺页信息及缺页率。
4)测试D结果及分析
显示出OPT页面置换算法的缺页信息及缺页率
结论
通过这次课程设计,不仅让我了解了页面置换算法,开始我一味的进行调试,急切的想侥幸调试出来,但由于没有进行深入的考虑,我调试了很久都没没有成功,我仔细的分析题目,分析材料,在原由的基础上我进行了改正,我最后还是调试成功了,还是经过了一翻努力,这次操作系统实习,不仅让我对操作系统这门课程有了更深入的研究、对很多重要的概念有了巩固和掌握。
通过努力,三个页面置换算法程序都已经完成,此时此刻,我心里多了些成就感。
虽然自己所做的很少也不够完善,但毕竟也是努力的结果。
主要有以下几点收获:
1.通过对上网和看书查阅相关资料,使自己对VC++语言的基本框架有新的了解,加深了对可视化程序的认识。
2.在使用VC++语言来实现功能时,不像以往用的其他语言,它比较简练,更容易理解,实用性很强。
3.先进先出页面置换和LRU以及OPT算法各有特点,但是实践起来却很大,使自己对页面置换算法有了新的认识。
一周半的课程设计就要结束了,不但对专业知识有了更深的理解,更使的自己认识到实践的重要性,理论、实践相结合才能达到很好的学习效果,特别是程序语言的学习。
致谢
本次课程设计能顺利完成,感谢学校的大力支持,感谢数学与计算机学院为我们提供实练的机会,感谢老师的细心教导。
此次的课程设计收获很多,虽然经过了一段漫长而又痛苦的过程,但是自己还是完成了,这是与自己的努力是分不开的,但是自己在调试过程当中遇到的一些问题,自己仍然不懂,是在同学、老师的帮助下完成的,在这里还要再次对他们的付出表示崇高的敬意。
参考文献
《面向对象程序设计与VisualC++6.0教程》陈天华编着
《C程序设计(第三版)》谭浩强编着
《C++入门经典》
《面向对象程序设计与C++实现》刘晋萍编着
《计算机操作系统教程》徐甲同等编着
《操作系统》罗宇等编着
《操作系统实验教程》张丽芬,刘利雄,王全玉编着
《计算机操作系统》梁红兵、哲风屏、汤子瀛编着
《操作系统教程》陈向群、杨芙清编着
iostream.h>
stdio.h>
#defineL20//页面走向长度最大为20
intM;
//内存块
structPro//定义一个结构体
intnum,time;
};
Input(intm,Prop[L])//打印页面走向状态
请输入实际页面走向长度L(15<
=L<
=20):
do
cin>
>
if(m>
20||m<
15)cout<
实际页面长度须在15~20之间;
请重新输入L:
elsebreak;
}while
(1);
returnm;
voidprint(Pro*page1)//打印当前的页面
Pro*page=newPro[M];
page=page1;
for(inti=0;
page[i].num<
intSearch(inte,Pro*page1)//寻找内存块中与e相同的块号
i++)if(e==page[i].num)returni;
//返回i值
return-1;
intMax(Pro*page1)//寻找最近最长未使用的页面
inte=page[0].time,i=0;
M)//找出离现在时间最长的页面
if(e<
page[i].time)e=page[i].time;
i++;
i++)if(e==page[i].time)returni;
//找到离现在时间最长的页面返回其块号
intCount(Pro*page1,inti,intt,Prop[L])//记录当前内存块中页面离下次使用间隔长度
intcount=0;
for(intj=i;
j<
L;
j++)
if(page[t].num==p[j].num)break;
//当前页面再次被访问时循环结束
elsecount++;
//否则count+1
returncount;
//返回count的值
intmain()
intc;
intm=0,t=0;
floatn=0;
Prop[L];
m=Input(m,p);
//调用input函数,返回m值
请输入可用内存页面数m(3~5):
do
{
cin>
if(M>
5||M<
3)
内存块m须在3~5之间,请重新输入m:
elsebreak;
}while
(1);
do{
i++)//初试化页面基本情况
page[i].num=0;
page[i].time=m-1-i;
i=0;
1:
FIFO页面置换"
2:
LRU页面置换"
3:
OPT页面置换"
按其它键结束程序;
c;
system("
cls"
);
f