实验六虚拟内存页面置换算法.docx
《实验六虚拟内存页面置换算法.docx》由会员分享,可在线阅读,更多相关《实验六虚拟内存页面置换算法.docx(14页珍藏版)》请在冰豆网上搜索。
实验六虚拟内存页面置换算法
甘肃政法学院
本科生实验报告
(六)
姓名:
马晓娟
学院:
公安技术学院
专业:
信息安全
班级:
2013级信息安全
实验课程名称:
实验日期:
2015年12月2日
指导教师及职称:
王云峰
实验成绩:
开课时间:
2015-2016学年第一学期
甘肃政法学院实验管理中心印制
实验题目
虚拟内存页面置换算法
小组合作
否
姓名
马晓娟
班级
2013级信息安全
学号
201383030125
一、实验目的
通过这次实验,加深对虚拟内存页面置换概念的理解,进一步掌握先进先出FIFO,最佳置换OPI和最近最久未使用LRU页面置换算法的实现方法。
二.实验环境
C++环境
三、实验内容与步骤
问题描述:
设计程序模拟先进先出FIFO,最佳置换OPI和最近最久未使用LRU页面置换算法的工作过程。
假设内存中分配给每个进程的最小物理块数为m,在进程运行过程中要访问的页面个数为n,页面访问序列为P1,…,Pn,分别利用不同的页面置换算法调度进程的页面访问序列,给出页面访问序列的置换过程,计算每种算法缺页次数和缺页率。
程序要求如下:
1)利用先进先出FIFO,最佳置换OPI和最近最久未使用LRU三种页面置换算法模拟页面访问过程。
2)模拟三种算法的页面置换过程,给出每个页面访问时的内存分配情况。
3)输入:
最小物理块数m,页面个数n,页面访问序列P1,…,Pn,算法选择1-FIFO,2-OPI,3-LRU。
4)输出:
每种算法的缺页次数和缺页率。
【实验要求】
1)上机前认真复习页面置换算法,熟悉FIFO,OPI,LRU三种页面分配和置换算法的过程;
2)上机时独立编程、调试程序;
3)根据具体实验要求,完成好实验报告(包括实验的目的、内容、要求、源程序、实例运行结果截图)。
【源代码】
#include"iostream.h"
constintDataMax=100;
constintBlockNum=10;
intDataShow[BlockNum][DataMax];//用于存储要显示的数组
boolDataShowEnable[BlockNum][DataMax];//用于存储数组中的数据是否需要显示
//intData[DataMax]={4,3,2,1,4,3,5,4,3,2,1,5,6,2,3,7,1,2,6,1};//测试数据
//intN=20;//输入页面个数
intData[DataMax];//保存数据
intBlock[BlockNum];//物理块
intcount[BlockNum];//计数器
intN;//页面个数
intM;//最小物理块数
intChangeTimes;
voidDataInput();//输入数据的函数
voidDataOutput();
voidFIFO();//FIFO函数
voidOptimal();//Optimal函数
voidLRU();//LRU函数
///*
intmain(intargc,char*argv[])
{
DataInput();//DataInput();
//FIFO();
//Optimal();
//LRU();
//return0;
intmenu;
while(true)
{
cout<cout<<"*菜单选择*"<cout<<"*******************************************************"<cout<<"*1-FIFO*"<cout<<"*2-Optimal*"<cout<<"*3-LRU*"<cout<<"*0-EXIT*"<cin>>menu;
switch(menu)
{
case1:
FIFO();break;
case2:
Optimal();break;
case3:
LRU();break;
default:
break;
}
if(menu!
=1&&menu!
=2&&menu!
=3)break;
}
}
//*/
voidDataInput()
{
cout<<"请输入最小物理块数:
";
cin>>M;
while(M>BlockNum)//大于数据个数
{
cout<<"物理块数超过预定值,请重新输入:
";
cin>>M;
}
cout<<"请输入页面的个数:
";
cin>>N;
while(N>DataMax)//大于数据个数
{
cout<<"页面个数超过预定值,请重新输入:
";
cin>>N;
}
cout<<"请输入页面访问序列:
"<for(inti=0;icin>>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;jfor(i=0;iDataShowEnable[j][i]=false;//初始化为false,表示没有要显示的数据
for(i=0;i{
count[i]=0;//大于等于BlockNum,表示块中没有数据,或需被替换掉
//所以经这样初始化(321),每次替换>=3的块,替换后计数值置1,
//同时其它的块计数值加1,成了(132),见下面先进先出程序段
}
for(i=0;i{
//增加count
for(j=0;jcount[j]++;
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();
}
voidOptimal()
{
inti,j,k;
boolfind;
intpoint;
inttemp;//临时变量,比较离的最远的时候用
ChangeTimes=0;
for(j=0;jfor(i=0;iDataShowEnable[j][i]=false;//初始化为false,表示没有要显示的数据
//for(i=0;i//{
//count[i]=0;//
//}
for(i=0;i{
find=false;//表示块中有没有该数据
for(j=0;j{
if(Block[j]==Data[i])
find=true;
}
if(find)continue;//块中有该数据,判断下一个数据
//块中没有该数据,最优算法
ChangeTimes++;//缺页次数++
for(j=0;j{
//找到下一个值的位置
find=false;
for(k=i;k{
if(Block[j]==Data[k])
{
find=true;
count[j]=k;
break;
}
}
if(!
find)count[j]=N;
}
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];
//保存要显示的数据
for(j=0;j{
DataShow[j][i]=Block[j];
DataShowEnable[i(j<=i?
j:
i):
j][i]=true;//设置显示数据
}
}
//输出信息
cout<cout<<"Optimal=>"<DataOutput();
}
voidLRU()
{
inti,j;
boolfind;
intpoint;
inttemp;//临时变量
ChangeTimes=0;
for(j=0;jfor(i=0;iDataShowEnable[j][i]=false;//初始化为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();
}
【效果截图】
以作业为测试数据:
五、实验总结
通过这次实验,我加深了对虚拟内存页面置换概念的理解,进一步掌握先进先出FIFO,最佳置换OPI和最近最久未使用LRU页面置换算法的实现方法。
在实验的过程中,我发现自己的动手能力还不是很强,没有把理论与实验相结合。
但在同学的帮助下解决了问题,最终做出了实验。
在此次试验中我学到了:
1、多学多问,取长补短,学习他人技能。
2、善于思考,将理论与实践结合,真正地消化知识。
3、实事求是做实验,认真仔细地做好实验记录。