页面置换算法.docx
《页面置换算法.docx》由会员分享,可在线阅读,更多相关《页面置换算法.docx(13页珍藏版)》请在冰豆网上搜索。
页面置换算法
操作系统课程设计报告
题目:
页面置换算法
院系:
班级:
姓名
学号:
指导教师
页面置换算法设计报告
一、概述
通过模拟实现请求页式存储管理的几种基本页面置换算法,
了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。
二、设计的基本概念和原理
基于一个虚拟存储区和内存工作区,设计下述算法并计算访问命中率。
1、基本概念
1、先进先出的算法(FIFO)
2、最近最久未使用算法(LRU)
3、缺页次数:
置换页面的次数
4、缺页率=置换页面的次数/总页面
2、基本原理
1、先进先出的算法(FIFO):
优先淘汰最早进入的页面,亦即在内存中驻留时间最久的页面。
2、最近最久未使用算法(LRU):
选择最近最长时间未访问过的页面予以淘汰。
三、总体设计
数据结构:
constintDataMax=100;
constintBlockNum=10;
intDataShow[BlockNum][DataMax];//用于存储要显示的数组
boolDataShowEnable[BlockNum][DataMax];//用于存储数组中的数据是否需要显示
intData[DataMax];//保存数据
intBlock[BlockNum];//物理块
intcount[BlockNum];//计数器
intN;//页面个数
intM;//最小物理块数
intChangeTimes;
voidDataInput();//输入数据的函数
voidDataOutput();
voidFIFO();//FIFO函数
voidLRU();//LRU函数
算法流程:
(1)请输入最小物理块数
(2)请输入页面的个数
(3)请输入页面访问序列:
(4)菜单选择
算法流程图:
四、详细设计
#include
#include
usingnamespacestd;
constintDataMax=100;
constintBlockNum=10;
intDataShow[BlockNum][DataMax];//用于存储要显示的数组
boolDataShowEnable[BlockNum][DataMax];//用于存储数组中的数据是否需要显示
intData[DataMax];//保存数据
intBlock[BlockNum];//物理块
intcount[BlockNum];//计数器
intN;//页面个数
intM;//最小物理块数
intChangeTimes;
voidDataInput();//输入数据的函数
voidDataOutput();
voidFIFO();//FIFO函数
voidLRU();//LRU函数
///*
intmain()
{
DataInput();
intmenu;
while(true)
{
cout<<"*菜单选择*"<cout<<"*******************************************************"<cout<<"*1-FIFO*"<cout<<"*2-LRU*"<cout<<"*0-EXIT*"<cout<<"*******************************************************"<cin>>menu;
switch(menu)
{
case1:
FIFO();
break;
case2:
LRU();
break;
default:
break;
}
if(menu!
=1&&menu!
=2&&menu!
=3)break;
}
}
//*/
voidDataInput()
{
ifstreammyfile("a.txt");
if(!
myfile){
cout<<"Unabletoopenmyfile";
}
cout<<"请输入最小物理块数:
";
myfile>>M;
cout<<"请输入页面的个数:
";
myfile>>N;
cout<<"请输入页面访问序列:
"<for(inti=0;imyfile>>Data[i];
}
voidDataOutput()
{
inti,j;
for(i=0;i{
cout<}
cout<for(j=0;j{
cout<<"";
for(i=0;i{
if(DataShowEnable[j][i])
cout<else
cout<<"";
}
cout<}
cout<<"缺页次数:
"<cout<<"缺页率:
"<}
voidFIFO()
{
inti,j;
boolfind;
intpoint;
inttemp;//临时变量
ChangeTimes=0;
for(j=0;j{
for(i=0;i{
DataShowEnable[j][i]=false;//初始化为false,表示没有要显示的数据
DataShow[j][i]=-1;
}
Block[j]=-1;
}
for(i=0;i{
count[i]=0;
}
for(i=0;i{
//增加count
for(j=0;j{
count[j]++;
cout<}
cout<find=false;//表示块中有没有该数据
for(j=0;j{
if(Block[j]==Data[i])
{
find=true;
}
}
if(find)continue;//块中有该数据,判断下一个数据
//块中没有该数据
ChangeTimes++;//缺页次数++
if((i+1)>M)//因为i是从0开始记,而M指的是个数,从1开始,所以i+1
{
//获得要替换的块指针
temp=0;
for(j=0;j{
if(temp{
temp=count[j];
point=j;//获得离的最远的指针
}
}
}
elsepoint=i;
//替换
Block[point]=Data[i];
count[point]=0;//更新计数值
//保存要显示的数据
for(j=0;j{
DataShow[j][i]=Block[j];
DataShowEnable[i(j<=i?
j:
i):
j][i]=true;//设置显示数据
}
}
//输出信息
cout<cout<<"FIFO=>"<DataOutput();
}
voidLRU()
{
inti,j;
boolfind;
intpoint;
inttemp;//临时变量
ChangeTimes=0;
for(j=0;j{
for(i=0;i{
DataShowEnable[j][i]=false;//初始化为false,表示没有要显示的数据
DataShow[j][i]=-1;
}
Block[j]=-1;
}//初始化为false,表示没有要显示的数据
for(i=0;i{
count[i]=0;
}
for(i=0;i{
//增加count
for(j=0;jcount[j]++;
find=false;//表示块中有没有该数据
for(j=0;j{
if(Block[j]==Data[i])
{
count[j]=0;
find=true;
}
}
if(find)continue;//块中有该数据,判断下一个数据
//块中没有该数据
ChangeTimes++;//缺页次数++
if((i+1)>M)//因为i是从0开始记,而BlockNum指的是个数,从1开始,所以i+1
{
//获得要替换的块指针
temp=0;
for(j=0;j{
if(temp{
temp=count[j];
point=j;//获得离的最远的指针
}
}
}
elsepoint=i;
//替换
Block[point]=Data[i];
count[point]=0;
//保存要显示的数据
for(j=0;j{
DataShow[j][i]=Block[j];
DataShowEnable[i(j<=i?
j:
i):
j][i]=true;//设置显示数据
}
}
//输出信息
cout<cout<<"LRU=>"<DataOutput();
}
5、测试与数据分析
测试数据:
3
20
70120304230321201701
6、完成的情况、简要的使用说明
完成情况:
编写了先进先出的算法(FIFO)、最近最久未使用算法(LRU),得到了正确的结果
使用说明:
根据提示输入数据,可以得到书上的结果。
7、结果分析
运行程序选择1结果如下:
运行程序选择2结果如下:
8、总结
在设计页面置换程序的过程中,我遇到过许多问题,可是也学到了很多东西。
本程序的设计实现主要是用C++语言实现,通过对程序算法的设计优化、输出显示的格式设计、输入过程中的异常处理等一些设计过程中的问题的考虑解决,在C++学习上也有了很大的进步。
程序设计过程中开始遇到的最大的问题是算法的结构设计问题,课本上只给了设计要求及简单的算法,要真正实现还需要考虑很多方面。
在算法的数据结构设计上考虑了很长时间。
在程序设计中先后参考了很多网络资料,也参考了一些别人写的的程序,对一些算法的优越性等也作了一些考虑。
此外考虑最多的就是异常错误处理的设计。
一个好的程序必须能在各种环境下都有其相应的处理方式。
C++语言明显要比c语言好很多,其输入输出流就要比c的输入输出好用很多.其次就是函数的重载,让我的程序代码减少了很多。
方便了设计。
这次课程设计时间很紧,而且考试与课程设计夹杂在一起,所以选择了一个较为简单的课题,但是对于cpu进程调度算法还是认真的看了下,发现时间片轮转算法实现起来不难,最大的难点是进程排队非常麻烦,需要在执行过程中个动态的变化,动态的接受新资源的提交,想要模拟出来难度会非常大。
所以请老师谅解。
谢谢老师的指导。
接下来还有考试,我要加油!
九、参考资料
[1]汤子瀛梁红兵哲凤屏汤子灜.《计算机操作系统(第三版)》.西安:
西安电子科技大学出版社,2007.5.
[2]谭浩强.《C++面向对象程序设计》.北京:
清华大学出版社,2006.01.