操作系统课程设计页面置换算法的模拟实现.docx
《操作系统课程设计页面置换算法的模拟实现.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计页面置换算法的模拟实现.docx(14页珍藏版)》请在冰豆网上搜索。
![操作系统课程设计页面置换算法的模拟实现.docx](https://file1.bdocx.com/fileroot1/2022-12/1/ba3cd033-990a-48f5-a51b-59dea155f595/ba3cd033-990a-48f5-a51b-59dea155f5951.gif)
操作系统课程设计页面置换算法的模拟实现
操作系统课程设计--页面置换算法的模拟实现_
题目:
页面置换算法的模拟实现_
专业计算机科学与技术学生姓名
班级
学号
指导教师
发放日期
信息工程学院
1概述..............................................................................................................................................1
2设计原理......................................................................................................................................1
2.1先进先出(FIFO)算法...........................................................................................................12.2最近最久未使用(LRU)算法...............................................................................................13详细设计与编码..........................................................................................................................23.1模块设计...................................................................................................................................2
3.2系统详细设计...........................................................................................................................24结果与分析..................................................................................................................................4
4.1测试方案...................................................................................................................................4
4.2测试结果...................................................................................................................................5
4.3测试结果分析............................................................................................................................8
5设计小结......................................................................................................................................8
6参考文献......................................................................................................................................9
附录程序代码..............................................................................................................................10
操作系统课程设计(2015)
页面置换算法的模拟实现
1概述
在进程运行过程中,若其所要访问的页面不在内存所需把他们调入内存,但内存已无空闲时,为了保证进程能够正常运行,系统必须从内存中调入一页程序或数据送磁盘的对换区中。
但应将那个页面调出,需要根据一定的算法来确定。
通常,把选择换出页面的算法称为页面置换算法。
置换算法的好坏,将直接影响到系统的性能。
一个好的页面置换算法,应具有较低的页面更换频率。
从理论上将讲,应将那些以后不再访问的页面换出,或把那些较长时间内不再访问的页面调出。
目前存在着不同的算法,他们都试图更接近与理论上的目标。
拥有页面交换机制的操作系统总是把当前进程中急需处理的部分页面换入到内存当中,而把更多暂时不需要处理的页面放置在外存当中。
由于进程需要处理的页面顺序不同,因此必须要在内存与外存之间进行页面交换,页面置换算法也就应运而生。
2设计原理
2.1先进先出(FIFO)算法
这是最早出现的置换算法。
该算法总是淘汰最先进入内存的页面,即选择在内存停留时间最久的给予淘汰。
该算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替代指针,使它总是指向最老的页面。
但该算法与进程实际运行的规律不相适应,因为在incheng中,有些页面经常被访问,比如,含有全局变量,常用函数,例程等方面,FIFO
算法并不能保证这些页面不被淘汰。
当需要选择一个页面淘汰时,总是选择最先进入内存空间的那一个页面。
只要在系统中建立一个FIFO队列,以反映页面的活动情况。
被选择的页面总是处于队首的页面,而最近调入的页面永远存放在队列的尾部。
2.2最近最久未使用(LRU)算法
FIFO置换算法的性能之所以较差,是因为它所依据的条件是各个页面调入内存的时间,而页面调入的先后不能反映页面的使用情况。
最近最久未使用(LRU)的页面置换算法,是根据页面调入内存后的使用情况进行决策的。
由于无法预测各个页面将来的使用情况,只能利用“最近的过去”,作为“最近的将来”的近似。
该算法的基本思想是用最近的过去估计最近的将来。
假定在内存中的某个页面,在最近一段时间内未被使用的时间最长,那么在最近的将来也可能不再被使用。
1
进程调度算法的模拟实现
3详细设计与编码
3.1模块设计
(1)进入系统模块。
进入登陆界面,输入内存页面数和实际页数
(2)页面号打印模块。
打印输入的页面号。
(3)菜单选择模块。
选择相应的页面的置换方式,选择相应的字母,进入相应的功能。
(4)算法模块。
选择相应的页面置换算法。
(5)显现输出模块。
显示页面被置换的情况。
(6)缺页次数和缺页率模块。
计算页面号输入的计算结果。
(7)退出系统模块。
退出置换页面。
3.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;icout<}
查找内存中是否存在要调入的页面
intSearch(inte,Pro*page1){
Pro*page=newPro[N];
page=page1;
for(inti=0;ireturn-1;}
找出离现在时间最长的页面
intMax(Pro*page1){
Pro*page=newPro[N];
2
操作系统课程设计(2015)
page=page1;
inte=page[0].time,i=0;
while(i{if(ei++;
}
for(i=0;ireturn-1;
}
//找到最久不使用的页面
intCompfu(Pro*page1,inti,intt,Prop[M])
{Pro*page=newPro[N];
page=page1;
intcount=0;
for(intj=i;j{if(page[t].num==p[j].num)break;
elsecount++;
}
returncount;
}
(3)FIFO页面置换和缺页次数及缺页率模块实现如下:
if(c=='1')//FIFO页面置换
{n=1;
cout<<"页面置换情况:
"<while(i{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++;
}
}
3
进程调度算法的模拟实现
}
cout<<"缺页次数:
"<"<}
(4)LRU页面置换和缺页次数及缺页率模块实现如下:
if(c=='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;
page[t].time=0;
}
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++;page[0].time++;}
if(k==-1)print(page);
i++;
}
cout<<"缺页次数:
"<"<}
4结果与分析
4.1测试方案
(1)测试方案
(一)
输入可用页面为4,实际页数是10,各个页面号1570510801(课本例题)选择实验要求FIFO页面置换,然后选择LRU算法。
最后选择OPT(对比)。
(2)测试方案
(二)
输入可用页面为4,实际页数是10,各个页面号1391994807选择实验要求
4
操作系统课程设计(2015)
FIFO页面置换,然后选择LRU算法。
最后选择OPT(对比1)
(3)测试方案(三)
输入可用页面为5,实际页数是10,各个页面号1570510801(课本例题)选择实验要求FIFO页面置换,然后选择LRU算法。
最后选择OPT(对比)4.2测试结果
(1)测试方案
(一)结果。
输入可用页面为4,实际页数是10,各个页面号1570510801测试成功。
见图(图4-1输入页面登陆与输入)选择FIFO页面置换时显示页面置换情况、缺页次数和缺页率(见图4-2FIFO页面置换界面)。
图4-1输入页面登陆与输入
图4-2FIFO页面置换界面
选择LRU页面置换时显示页面置换情况、缺页次数和缺页率(见图4-3LRU页面置换界面)
5
进程调度算法的模拟实现
图4-3LRU页面置换界面
(2)测试方案
(二)结果。
输入可用页面为4,实际页数是10,各个页面号1391994807测试成功。
见图(图4-4输入页面登陆与输入)选择FIFO页面置换时显示页面置换情况、缺页次数和缺页率(见图4-5FIFO页面置换界面)
图4-4输入页面登陆与输入
选择LRU页面置换时显示页面置换情况、缺页次数和缺页率(见图4-5LRU页面置换界面)
6
操作系统课程设计(2015)
图4-5LRU页面置换界面
(3)测试方案(三)结果。
输入可用页面为5,实际页数是10,各个页面号1570510801测试成功。
见图(图4-1输入页面登陆与输入)选择FIFO页面置换时显示页面置换情况、缺页次数和缺页率(见图4-6FIFO页面置换界面)
图4-6FIFO页面置换界面
选择LRU页面置换时显示页面置换情况、缺页次数和缺页率(见图4-7LRU页面置换界面)
7
进程调度算法的模拟实现
图4-7LRU页面置换界面
4.3测试结果分析
从上述结果可知,在内存页面为2个页面时,由于用户进程的所有指令基本上都没装入内存,只装入一小部分,从而算法之间的差别比较大。
FIFO算法的访内命中率大致在50,至80,之间变化。
LRU算法的访内命中率大致在50,至70,之间变化。
但是,FIFO算法与LRU算法之间差别一般在10个百分点左右。
比较上述两种算法,以LRU算法的命中率最高,其次是FIFO算法。
5设计小结
一开始选题的时候我并没有考虑太多,原以为题目难度都差不多,于是就选了个冷门的。
但是没想到本题的难度和完成的代码量远远超出了我的预期。
原以为本题看起来很简单,也就不过是一个随机数函数和两种算法实现而已,但是事实证明我彻彻底底的错了。
首先是随机数生成,来回看了好几遍都没弄懂生成方法,最后经同学指点一下才终于明白,然后就是页式管理的原理和页面置换算法等等,很多都忘记了,不得不再次打开课本。
由于个人水平有限,光是理解原理及理清程序结构就已经花费了我很多宝贵的时间,加上本来时间就不充裕,于是我果断选择敏捷软件开发模型用于完成此课程设计。
依照软件工程原则,分析需求,画出程序结构图,将程序模块化,进行概要设计和详细设计,撰写实验报告同时编写程序代码,对编写完模块进行构件化处理,完善好接口,进行功能测试,不断发布可执行程序,然后组装、完善„„历经了5个Beta版本之后,程序终于都大功告成了。
本次实验中体会最深刻的就是运用了构件化的方法来测试模块,否则面对如此可观的代码量,如果每次都是编写完一点功能或者编写完所有功能才进行测试,debug的话都不知道从哪儿找起了,特别是对于编程水平不高的自己来说,这样做无疑是自掘坟墓,程序完成之日将遥遥无期。
总体来说,虽然题目难度远远超出自身预期,但是仍能凭借一个人奋斗完成,我们对于此次课程设计完成的质量以及自身的表现都感到十分的满意。
8
操作系统课程设计(2015)
6参考文献
[1]严蔚敏,吴伟民.数据结构[M].清华大学出版社,1997.[2]张尧学,史美林.计算机操作系统教程[M].清华大学出版社,2000.[3]孙静宇.计算机操作系统课程设计指导书[M].太原理工出版社,2006.
9
进程调度算法的模拟实现
附录程序代码
#include#defineM40
intN;
structPro//结构体
{
intnum,time;
};
intInput(intm,Prop[M])//输入函数
{
cout<<"请输入实际页数:
";
do
{
cin>>m;
if(m>M)cout<<"数目太多,请重试"<}
while
(1);
cout<cin>>p[i].num;
p[i].time=0;
}
returnm;
}
voidprint(Pro*page1)//打印当前的页面{
Pro*page=newPro[N];page=page1;
for(inti=0;icout<}
intSearch(inte,Pro*page1)//查找内存中是否存在要调入的页面
{
Pro*page=newPro[N];page=page1;
for(inti=0;ireturn-1;
}
intMax(Pro*page1)//找出离现在时间最长的页面{
Pro*page=newPro[N];page=page1;
10
操作系统课程设计(2015)
inte=page[0].time,i=0;while(i{
if(ei++;
}
for(i=0;ireturn-1;
}
intCompfu(Pro*page1,inti,intt,Prop[M])//找到最久不使用的页面
{
Pro*page=newPro[N];page=page1;
intcount=0;
for(intj=i;jif(page[t].num==p[j].num)break;
elsecount++;
}
returncount;
}
intmain()
{
cout<<"可用内存页面数"<>N;
Prop[M];
Pro*page=newPro[N];charc;
intm=0,t=0;
floatn=0;
m=Input(m,p);
do{
for(inti=0;ipage[i].num=0;
page[i].time=2-i;}
i=0;
cout<<"f:
FIFO页面置换"<LRU页面置换"<>c;
if(c=='f')//FIFO页面置换
{
n=1;
11
进程调度算法的模拟实现cout<<"页面置换情况:
"<{
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++;
}
}
}
cout<<"缺页次数:
"<"<}
if(c=='l')//LRU页面置换
{n=1;
cout<<"页面置换情况:
"<{
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;page[t].time=0;
}
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++;page[0].time++;}
if(k==-1)print(page);i++;
}
cout<<"缺页次数:
"<"<}
}while(c=='f'||c=='l'||c=='o');
return0;
}
12