实验六虚拟内存页面置换算法文档格式.docx
《实验六虚拟内存页面置换算法文档格式.docx》由会员分享,可在线阅读,更多相关《实验六虚拟内存页面置换算法文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
实验题目
虚拟内存页面置换算法
小组合作
否
姓名
班级
学号
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<
<
endl;
"
*菜单选择*"
*******************************************************"
*1-FIFO*"
*2-Optimal*"
*3-LRU*"
*0-EXIT*"
cin>
>
menu;
switch(menu)
case1:
FIFO();
break;
case2:
Optimal();
case3:
LRU();
default:
break;
}
if(menu!
=1&
&
menu!
=2&
=3)break;
}
//*/
voidDataInput()
请输入最小物理块数:
;
M;
while(M>
BlockNum)//大于数据个数
物理块数超过预定值,请重新输入:
请输入页面的个数:
N;
while(N>
DataMax)//大于数据个数
页面个数超过预定值,请重新输入:
请输入页面访问序列:
for(inti=0;
i<
i++)
Data[i];
voidDataOutput()
inti,j;
for(i=0;
i++)//对所有数据操作
Data[i]<
"
for(j=0;
j<
j++)
if(DataShowEnable[j][i])
DataShow[j][i]<
else
缺页次数:
ChangeTimes<
缺页率:
ChangeTimes*100/N<
%"
voidFIFO()
boolfind;
intpoint;
inttemp;
//临时变量
ChangeTimes=0;
DataShowEnable[j][i]=false;
//初始化为false,表示没有要显示的数据
count[i]=0;
//大于等于BlockNum,表示块中没有数据,或需被替换掉
//所以经这样初始化(321),每次替换>
=3的块,替换后计数值置1,
//同时其它的块计数值加1,成了(132),见下面先进先出程序段
i++)//对有所数据操作
//增加count
count[j]++;
find=false;
//表示块中有没有该数据
if(Block[j]==Data[i])
find=true;
if(find)continue;
//块中有该数据,判断下一个数据
//块中没有该数据
ChangeTimes++;
//缺页次数++
if((i+1)>
M)//因为i是从0开始记,而M指的是个数,从1开始,所以i+1
//获得要替换的块指针
temp=0;
if(temp<
count[j])
temp=count[j];
point=j;
//获得离的最远的指针
elsepoint=i;
//替换
Block[point]=Data[i];
count[point]=0;
//更新计数值
//保存要显示的数据
DataShow[j][i]=Block[j];
DataShowEnable[i<
M?
(j<
=i?
j:
i):
j][i]=true;
//设置显示数据
//输出信息
endl;
FIFO=>
DataOutput();
voidOptimal()
inti,j,k;
//临时变量,比较离的最远的时候用
//for(i=0;
//{
//count[i]=0;
//
//}
//块中没有该数据,最优算法
//找到下一个值的位置
for(k=i;
k<
k++)
if(Block[j]==Data[k])
count[j]=k;
if(!
find)count[j]=N;
M)//因为i是从0开始记,而BlockNum指的是个数,从1开始,所以i+1
Optimal=>
voidLRU()