虚拟内存页面置换算法实验报告.docx
《虚拟内存页面置换算法实验报告.docx》由会员分享,可在线阅读,更多相关《虚拟内存页面置换算法实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
虚拟内存页面置换算法实验报告
软件 学院
上机实验报 告
课程名称:
操作系统原理
实验项目:
虚拟内存页面置换算法
实 验室:
地狱018
姓 名:
死神 学 号:
专业班级:
实验时间:
2015/12/13
实验成绩
评阅教师
一、实验目得及要求
通过这次实验,加深对虚拟内存页面置换概念得理解,进一步掌握先进先出FIFO、最佳置换OPI与最近最久未使用LRU页面置换算法得实现方法。
结合Linux得内层得分析方法查瞧内存得分配过程及linuxkernel得内存管理机制
二、实验性质
设计性
三、实验学时
4学时
四、实验环境
实验环境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];//页面序列
int PageCount[MaxNumber]={0};//计算内存内数据离下一次出现得距离
int PageNum,LackNum=0,BlockNum;//页面个数,缺页次数,最小物理块数
doubleLackPageRate=0;
boolfound=false;
六、实验数据及结果分析
运行截图:
图6。
1
图6。
2
图6、3
七、实验总结
这次试验,让我加深了对虚拟内存页面置换算法得理解,进一步掌握先进先出FIFO、最佳置换OPI与最近最久未使用LRU页面置换算法得实现方法、熟悉Linux需要经过大量得实验、改进与思考,在编写代码得过程中遇到了一些问题要积极面对并通过讨论上网或者问老师解决、通过这次试验我了解了虚拟内存置换算法得一些知识,就是我对于所学习得专业知识得到了更好得巩固与提升。
附录源程序清单
#include <iostream〉
usingnamespacestd;
#define MaxNumber100
voidOPI(intPageOrder[MaxNumber],intPageCount[MaxNumber],
int PageNum,intLackNum,int BlockNum,doubleLackPageRate,boolfound)
{
int module[MaxNumber];
intsum=0;
inti,j,k,m;
for(i=0;i<BlockNum;i++)//将内存填满
{
module[i]=PageOrder[i];
ﻩsum++;
ﻩfor(j=0;j<=i;j++)
cout<<module[j]〈〈" ";
ﻩﻩcout<}
LackNum=BlockNum;
for(i=BlockNum;i{
found=false;
for(j=0;j<BlockNum;j++)//遍历已存储,判断就是否缺页
ﻩ {
ﻩif(module[j]==PageOrder[i])
ﻩ {
ﻩﻩﻩfound=true;
ﻩﻩﻩ break;
}
ﻩﻩ
}
if(found==false)//缺页,选择替换
ﻩ {
ﻩﻩfor(j=0;j<BlockNum;j++)//计算内存内数据离下一次出现得距离
{
PageCount[j]=0;
for(k=i+1;k<PageNum;k++)
ﻩﻩ{
ﻩ if(module[j]!
=PageOrder[k])
ﻩﻩ PageCount[j]++;
ﻩelse
ﻩ break;
ﻩ}
ﻩﻩ }
ﻩ int max=PageCount[0];
ﻩ int kind=0;
ﻩfor(j=0;j〈BlockNum;j++)//找出最大值
ﻩﻩ{
if(PageCount[j]>max)
ﻩ{
ﻩﻩﻩ max=PageCount[j];
ﻩﻩﻩﻩ kind=j;
ﻩﻩﻩ}
ﻩ }
module[kind]=PageOrder[i];
ﻩ LackNum++;
ﻩfor(m=0; m〈3;m++)
ﻩ cout〈ﻩcout<〈endl;
}
ﻩ }
LackPageRate=(LackNum*1、0)/PageNum;
cout<<"该算法缺页次数为:
"<〈LackNum〈cout<〈”该算法缺页率为:
"〈〈LackPageRate*100<〈’%'<<endl;
}
/******************************先进先出置换算法*************************************/
voidFIFO(intPageOrder[MaxNumber],int PageCount[MaxNumber],
ﻩﻩint PageNum,int LackNum,intBlockNum,doubleLackPageRate,bool found)
{
intmodule[MaxNumber];
intsum=0;
inti,j,m;
for(i=0;i〈BlockNum;i++)//将内存填满
{
module[i]=PageOrder[i];
ﻩﻩ sum++;
PageCount[i]=3—i;
ﻩﻩ for(j=0;j<=i;j++)
cout<<module[j]〈〈"";
cout〈〈endl;
}
LackNum=BlockNum;
for(i=BlockNum;i {
found=false;
ﻩ for(j=0;j〈BlockNum;j++)//遍历已存储,判断就是否缺页
{
ﻩﻩif(module[j]==PageOrder[i])
ﻩﻩ {
ﻩfound=true;
ﻩﻩﻩ break;
}
ﻩﻩ
ﻩ }
if(found==false)//缺页,选择替换
{
ﻩﻩ intmax=PageCount[0];
ﻩintkind=0;
ﻩﻩfor(j=0;j<BlockNum;j++)//找出最大值
ﻩ{
ﻩﻩif(PageCount[j]〉max)
{
ﻩﻩﻩﻩ max=PageCount[j];
ﻩﻩﻩﻩ kind=j;
ﻩﻩ }
ﻩ}
ﻩ for(intk=0;k<BlockNum;k++)//不就是最大值,则要+1
ﻩﻩﻩ {
ﻩﻩﻩ if(k!
=kind)
PageCount[k]++;
ﻩﻩ}
module[kind]=PageOrder[i];
PageCount[kind]=0;//替换之后已经查询得次数改为0
ﻩﻩLackNum++;
ﻩfor(m=0;m<3;m++)
ﻩﻩ cout<ﻩ cout<ﻩ}
ﻩ }
LackPageRate=(LackNum*1。
0)/PageNum;
cout<〈”该算法缺页次数为:
”<〈LackNum<<endl;
cout〈〈”该算法缺页率为:
”〈<LackPageRate*100<〈'%’〈<endl;
}
/******************************最近最久未使用置换算法*************************************/
voidLRU(intPageOrder[MaxNumber],int PageCount[MaxNumber],
int PageNum,intLackNum,intBlockNum,double LackPageRate,boolfound)
{
int module[MaxNumber];
int sum=0;
inti,j,m;
for(i=0;i{
module[i]=PageOrder[i];
ﻩsum++;
PageCount[i]=3-i;
for(j=0;j〈=i;j++)
cout〈 cout〈<endl;
}
LackNum=BlockNum;
for(i=BlockNum;i〈PageNum;i++)
{
found=false;
for(j=0;j〈BlockNum;j++)//遍历已存储,判断就是否缺页
{
ﻩﻩﻩ if(module[j]==PageOrder[i])
ﻩﻩ {
ﻩ found=true;
PageCount[j]=0;//查询后,更改次数
ﻩﻩﻩfor(intk=0;k<BlockNum;k++)
ﻩ{
ﻩﻩif(k!
=j)
PageCount[k]++;
ﻩﻩ}
ﻩbreak;
}
ﻩ
ﻩ}
if(found==false)//缺页,选择替换
ﻩ{
ﻩ intmax=PageCount[0];
intkind=0;
ﻩﻩ for(j=0;j〈BlockNum;j++)//找出最大值
ﻩ{
ﻩif(PageCount[j]〉max)
{
ﻩﻩmax=PageCount[j];
ﻩﻩﻩﻩﻩkind=j;
ﻩﻩﻩ}
ﻩﻩ}
for(intk=0;k
ﻩ {
ﻩﻩif(k!
=kind)
PageCount[k]++;
ﻩﻩ }
module[kind]=PageOrder[i];
PageCount[kind]=0;//替换之后未查询得次数改为0
ﻩﻩLackNum++;
for(m=0;m<3;m++)
ﻩcout<ﻩ cout〈<endl;
}
ﻩ}
LackPageRate=(LackNum*1、0)/PageNum;
cout<〈”该算法缺页次数为:
”< cout<〈"该算法缺页率为:
"〈〈LackPageRate*100<〈’%'〈〈endl;
}
intmain()
{
int PageOrder[MaxNumber];//页面序列
ﻩint PageCount[MaxNumber]={0};//计算内存内数据离下一次出现得距离
intPageNum,LackNum=0,BlockNum;//页面个数,缺页次数,最小物理块数
doubleLackPageRate=0;
boolfound=false;
intchioce1=0,chioce2,chioce3;
inti=0;
while(chioce1==0)
{
cout<〈"就是否重新输入数据;0:
不输入,1:
重新输入:
";
cin>>chioce2;
if(chioce2==1)
ﻩ{
cout〈〈"请输入页面个数:
";
cin>〉 PageNum;
cout<<"请输入最小物理块数";
ﻩcin〉〉BlockNum;
ﻩcout<〈"请输入页面序列:
”〈<endl;
ﻩfor(i=0;i<PageNum;i++)
cin>〉PageOrder[i];
}
cout<〈"请选择算法:
1-FIFO,2-OPI,3—LRU:
”;
cin〉>chioce3;
if(chioce3==1)
FIFO(PageOrder,PageCount,PageNum,LackNum,BlockNum,LackPageRate, found);
else
{
if(chioce3==2)
OPI(PageOrder,PageCount,PageNum,LackNum,BlockNum,LackPageRate,found);
ﻩelse
LRU(PageOrder,PageCount,PageNum,LackNum,BlockNum,LackPageRate,found);
}
cout<<"*****************************************************************"〈ﻩcout〈<"请选择继续还就是结束:
0:
继续,1:
结束";
ﻩcin>>chioce1;
}
}