虚拟内存页面置换算法实验三.docx
《虚拟内存页面置换算法实验三.docx》由会员分享,可在线阅读,更多相关《虚拟内存页面置换算法实验三.docx(16页珍藏版)》请在冰豆网上搜索。
虚拟内存页面置换算法实验三
软件学院
实验报告
课程名称:
操作系统
实验项目:
虚拟内存页面置换算法
实验室:
姓名:
学号:
专业班级:
实验时间:
实验成绩
评阅教师
一、实验目的及要求
通过这次实验,加深对虚拟内存页面置换概念的理解,进一步掌握先进先出FIFO、最佳置换OPI和最近最久未使用LRU页面置换算法的实现方法。
结合Linux的内层的分析方法查看内存的分配过程及linuxkernel的内存管理机制。
二、实验性质
实验性质:
设计性
3、实验学时
实验学时:
2学时
四、实验环境
1.实验环境:
C与C++程序设计学习与实验系统
2.知识准备:
(1)使用Linux的基本命令;
(2)了解Linuxvmstat、free、top等命令查看linux系统的内存分配情况;
(3)掌握虚拟内存页面置换算法FIFO等基本算法理论。
五、实验内容及步骤
假设有n个进程分别在T1,…,Tn时刻到达系统,它们需要的服务时间分别为S1,…,Sn。
分别采用先来先服务FCFS和短作业优先SJF进程调度算法进行调度,计算每个进程的完成时间、周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。
通过已知最小物理块数、页面个数、页面访问序列、及采用置换方式可以得出页面置换的缺页次数和缺页率,及每次缺页时物理块中存储。
1.输入的形式
intPageOrder[MaxNumber];//页面序列
intPageNum,LackNum=0,BlockNum;//页面个数,缺页次数,最小物理块数
2.输出的形式
doubleLackPageRate//缺页率
缺页个数
每次缺页时物理块中存储
程序所能达到的功能
模拟先进先出FIFO、最佳置换OPI和最近最久未使用LRU页面置换算法的工作过程。
假设内存中分配给每个进程的最小物理块数为m,在进程运行过程中要访问的页面个数为n,页面访问序列为P1,…,Pn,分别利用不同的页面置换算法调度进程的页面访问序列,给出页面访问序列的置换过程,计算每种算法缺页次数和缺页率。
测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。
程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
intPageOrder[MaxNumber];//页面序列
intPageCount[MaxNumber]={0};//计算内存内数据离下一次出现的距离
intPageNum,LackNum=0,BlockNum;//页面个数,缺页次数,最小物理块数
doubleLackPageRate=0;
boolfound=false;
图1-1流程图
六、实验数据及结果分析
1.详细记录在调试过程中出现的问题及解决方法;
在FIFO和LRU中计算每个页面在物理块中所存在的“时间”时总是出错,后来多次调试语句所处位置和计数方法,终于得出正确结果,并且所有算法都没有输出物理块中发生置换后的物理块中的内容,在老师的提醒下更改程序输出其内容。
算法的性能分析(包括基本操作和其它算法的时间复杂度和空间复杂度的分析)及其改进设想;
OPI:
时间复杂度为O(n^2)空间复杂度为:
O
(1)
FIFO:
时间复杂度为O(n^2)空间复杂度为:
O
(1)
LRU:
时间复杂度为O(n^2)空间复杂度为:
O
(1)
2.记录实验执行的结果(运行结果截图)。
图1-2程序运行结果
七、实验总结
通过这次实验我对先进先出FIFO,最佳置换OPI和最近最久未使用LRU页面置换算法的实现方法。
有了更多的了解。
在编程过程中我也通过查阅书籍和复习以前的课本,对C++编程语言进行了复习。
通过这个实验我也体会到思路的重要性,一个程序如果一开始计划的好,结构设计完善,才可能顺利进行。
这次实验模拟出了优先权调度算法,使我更加了解这一算法的调度过程。
以前仅限于知道这一知识点,现在居然能用程序来实现这个过程。
我相信这将是一个很好的学习方法。
我希望以后能够有更多的机会来锻炼自己,通过具体实践来提高自己编程的能力,来进一步掌握和理解在课堂上学到的东西,做到学以致用!
总之,这次综合实验是我收益匪浅,是我明白了实际编程和理论知识间的差异,明白了在学习课本的基础上我们还需要很大的实践扩充才能真正的理解并学好这门课程。
附录源程序清单
#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*"<cout<<"*******************************************************"<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();
}