第一篇:页面置换算法实验报告
计算机体系结构
实验报告
班级:计科姓名:张华敏学号:
0902班
0909090814
FIFU算法
一,实验内容:
编写一段程序来模拟页面置换算法中的FIFU算法的实现 二,算法设计:
设置一个产生随机数的函数rand()产生随机数来模拟程序所需访问的页面的标号,如果页面需要被访问则把页面中的一个标志位设为in表示他已经被调入内存,如果再次需要访问此页面是只需检查此页面的标志位是否为in就可判断它是否已经存在在内存中了,如果已经存在则可直接使用,如果不存在则需调入,在调入新页面是先检查内存空间是否已满,如果未满则直接调入,如果已经满了则需选择一个页面将其调出,调出时就把页面的标志位设为out。选择页面的规则是:将进入内存时间最久的页面调出去,为了达到这一目的,在页面中设置一个计数器,每当有新页面调入内存时则将内存中已经存在的页面计数器自动加一,调出页面时就选择那个计数器最大值的页面,调出后重新将计数器设为零。三,遇到的问题及解决方案:
在做此实验时遇到了一些小问题,如在C语言中函数名定义为export()则会报错。在调用有返回值的函数是如果直接int s=use(pag)则会运行出错,要先分开写如:int s,s=use(pag).四,源代码 头文件.cpp #include
int t;//全局变量,用来盛放rand()函数产生的随机数
enum boolean{in,out};//定义一个枚举类型 /////////如果把in,out换成 true,false则会处错误
typedef struct { int num;//页面编号 char content;//页面内容
enum boolean flog;//判断此页面是否页调入,调入为true,否则为false;int count;//页面计数器
int usebit;//使用位,被使用过值为1,否则为0 }page;
FIFU.cpp #include
int capacity=3;//设置内存最多可以容纳的页面数
void initialize(page p[])//初始化页面函数 { for(int i=0;i<5;i++)//初始化页面,页面内容分别为小写字母 abcde,计数器全部为0 {p[i].num=i;p[i].content=i+97;p[i].flog=out;p[i].count=0;} }
int use(page p[]){ t=rand()%5;//产生一个0-5的随机数,if(p[t].flog==in){ printf(“tt%d页面命中n”,t);//for(int i=0;i<5;i++)//调入此页面后其他以在内存中存在的页面计数器加1 // { // if(p[i].flog==in)// p[i].count++;// } return(1);} else return(0);}
void import(page p[])//调入页面的函数 { /* int t=rand()%5;//产生一个0-5的随机数,if(p[t].flog==in)printf(“tt%d页面命中n”,t);*/ // if(p[t].flog==out)//如果此页面未被调入内存则立即调入 p[t].flog=in;capacity--;//调入后内存空间减少一叶
for(int i=0;i<5;i++)//调入此页面后其他以在内存中存在的页面计数器加1 { if(p[i].flog==in&&p[i].num!=t)p[i].count++;} printf(“页面%d被调入内存n”,t);}
void port(page p[])//调出页面的函数,,,,,,,,,,,如果函数名定义为export则处错误 { int x=0,y;//x用来暂时存放计数器 中的最大值,y存放此页面的页面号 for(int i=0;i<5;i++)//寻找计数器值最大的 页面 { if(p[i].count>x){ x=p[i].count;y=i;} }
p[y].flog=out;//修改调入符号 p[y].count=0;capacity++;//调入后内存空间增加一叶 printf(“ttt页面%d被调出内存n”,y);}
main(){ int s;long t3,t1,t2;page pag[5];//定义五个页面,,,,,,,,,,,如果这个定义在子函数之前那么不用通过参数 子函数便可以直接访问 t3=time(NULL);initialize(pag);do { t1=time(NULL);s=use(pag);//,,,,,,,,,,,,,,如果这里写成int s=use(pag)则会运行出错
//printf(“s=%d capacity=%dn”,s,capacity);if(capacity>0&&s==0)import(pag);else { if(capacity==0&&s==0){ port(pag);import(pag);} } t2=time(NULL);while(t2-t1<1){ t2=time(NULL);} }while(t2-t3<20);system(“pause”);}
五,测试结果:
LFU算法
一,实验内容:
编写一段程序来模拟页面置换算法中的LFU算法的实现 二,算法设计:
设置一个产生随机数的函数rand()产生随机数来模拟程序所需访问的页面的标号,如果页面需要被访问则把页面中的一个标志位设为in表示他已经被调入内存,如果再次需要访问此页面是只需检查此页面的标志位是否为in就可判断它是否已经存在在内存中了,如果已经存在则可直接使用,如果不存在则需调入,在调入新页面是先检查内存空间是否已满,如果未满则直接调入,如果已经满了则需选择一个页面将其调出,调出时就把页面的标志位设为out。选择页面的规则是:将最近一段时间未被访问过的页面调出。为了达到这一目的在页面中设置一个标志位,如果页面在近期只要被访问过则将该标志位设置为1(默认为0),在选择调出页面时只需将标志位为0的页面调出即可。三,遇到的问题及解决方案: 未遇到什么问题
四,实验感悟:
遇到问题后上网查资料和有效,及时查不到自己想要的但是也可从相关结果中获得启发给自己灵感来想到解决问题的方法.四,源代码
FLU.cpp #include
int capacity=3;
//设置内存最多可以容纳的页面数
void initialize(page p[])
//初始化页面函数
{
for(int i=0;i<5;i++)
//初始化页面,页面内容分别为小写字母 abcde,计数器全部为0
{p[i].num=i;
p[i].content=i+97;
p[i].flog=out;
p[i].count=0;
p[i].usebit=0;
}
}
int use(page p[]){
t=rand()%5;
//产生一个0-5的随机数,if(p[t].flog==in)
{
printf(“tt%d页面命中n”,t);
p[t].usebit=1;
//for(int i=0;i<5;i++)//调入此页面后其他以在内存中存在的页面计数器加1
//
{
//
if(p[i].flog==in)
//
p[i].count++;
//
}
return(1);
}
else
return(0);
}
void import(page p[])//调入页面的函数
{
int t=rand()%5;
//产生一个0-5的随机数,//if(p[t].flog==in)
// {
//
printf(“tt%d页面命中n”,t);
//
p[t].usebit=1;
// }
// if(p[t].flog==out)
//如果此页面未被调入内存则立即调入
p[t].flog=in;
capacity--;
//调入后内存空间减少一叶
for(int i=0;i<5;i++)//调入此页面后其他以在内存中存在的页面计数器加1
{
if(p[i].flog==in&&p[i].num!=t)
p[i].count++;
}
printf(“页面%d被调入内存n”,t);
}
void port(page p[])
//调出页面的函数
////////////////////////////////如果函数名定义为export则处错误
{
int x=0,y;//x用来暂时存放计数器 中的最大值,y存放此页面的页面号
int z=-1;
//用来判断近期是否有未被访问过的页面
int g=0;
for(int i=0;i<5;i++)//寻找计数器值最大的 页面
{
if(p[i].count>x)
{
x=p[i].count;
y=i;
}
}
for(int i=0;i<5;i++)
{
if(p[i].flog==in&&p[i].usebit==0)
{
z=i;
g++;
}
}
if(z==-1||g==3)//如果所有页面均为1则按照FIFO算法置换页面 //如果g=3则表明页面使用位全为零,此时也按照FIFO算法置换页面
{
p[y].flog=out;//修改调入符号
p[y].count=0;
capacity++;
//调入后内存空间增加一叶
p[y].usebit=0;
for(int i=0;i<5;i++)//将所有页面置0
p[i].usebit=0;
printf(“ttt页面%d被调出内存n”,y);
}
else
//如果有页面为0则将此页面置换出来
{
p[z].flog=out;//修改调入符号
p[z].count=0;
capacity++;
//调入后内存空间增加一叶
printf(“ttt页面%d被调出内存n”,z);
}
}
main(){
int s;
long t3,t1,t2;
page pag[5];//定义五个页面
///////////////////如果这个定义在子函数之前那么不用通过参数 子函数便可以直接访问
t3=time(NULL);
initialize(pag);
do
{
t1=time(NULL);
s=use(pag);
if(capacity>0&&s==0)
import(pag);
else
{
if(capacity==0&&s==0)
{
port(pag);
import(pag);
}
}
t2=time(NULL);
while(t2-t1<1)
{
t2=time(NULL);
}
}while(t2-t3<20);
system(“pause”);}
六,实验结果
总结
通过本次试验我对各种页面置换算法有了更深入的了解,也使得自己认识到平常学习到某些东西觉得懂了会了可是一旦实际动手操作起来就会发现总会存在这样或者那样的错误,只有多动手实际操作才会发现不足发现错误并且改正。查漏补缺提高自己的实际动手能力。
第二篇:页面置换算法实验报告(精选)
《操作系统--页面置换算法》
实验报告
姓
名: 范学升
学
号:1001050903
班
级:电科10-1班
专
业:电子信息科学与技术
一、实验目的
1.通过模拟实现几种基本页面置换的算法,了解虚拟存储技术的特点。
2.掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想,并至少用三种算法来模拟实现。
3.通过对几种置换算法页面的比较,来对比他们的优缺点,并通过比较更换频率来对比它们的效率。
二、实验内容:
设计一个虚拟存储区和内存工作区,并使用下述算法来模拟实现页面的置换: 1.先进先出的算法(FIFO)2.最近最久未使用算法(LRU)3.最佳置换算法(OPT)
三、实验分析
在进程运行过程中,若其所访问的页面不存在内存而需要把它们调入内存,但内存已无空闲时,为了保证该进程能够正常运行,系统必须从内存中调出一页程序或数据送磁盘的对换区中。但应调出哪个页面,需根据一定的算法来确定,算法的好坏,直接影响到系统的性能。
一个好的页面置换算法,应该有较低的页面更换频率。
假设分给一作业的物理块数为3,页面数为20个。页面号为(20个):
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
1.先进先出(FIFO)置换算法的思路
该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程已调入内存的页面,按照先后次序连接成一个队列,并设置一个替换指针,使它总指向最老的页面。
2.最近久未使用(LRU)置换算法的思路
最近久未使用置换算法的替换规则,是根据页面调入内存后的使用情况来进行决策的。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间,当需淘汰一个页面的时候选择现有页面中其时间值最大的进 行淘汰。
3.最佳(OPT)置换算法的思路
其所选择的被淘汰的页面,奖是以后不使用的,或者是在未来时间内不再被访问的页面,采用最佳算法,通常可保证获得最低的缺页率。
4.数据结构
struct pageInfor { int content;//页面号 int timer;//被访问标记 };
class PRA { public:
PRA(void);int findSpace(void);//查找是否有空闲内存
int findExist(int curpage);//查找内存中是否有该页面 int findReplace(void);//查找应予置换的页面 void display(void);//显示 void FIFO(void);//FIFO算法 void LRU(void);//LRU算法
void BlockClear(void);//BLOCK清空,以便用另一种方法重新演示 pageInfor * block;//物理块 pageInfor * page;//页面号串 private: };
5.FIFO页面置换算法
当需要访问一个新的页面时,首先调用findExist(i)函数来查看物理块中是否就有这个页面,若要查看的页面物理块中就有,则调用display函数直接显示,不需要替换页面;如果要查看的页面物理块中没有,就需要寻找空闲物理块放入,若存在有空闲物理块,则将页面放入;若没有空闲物理块,则调用findReplace函数替换页面。并将物理块中所有页面timer++。
6.LRU页面置换算法
当需要访问一个新的页面,首先调用findExist(i)函数查看物理块中是否就有这个页面。
7.OPT页面置换算法
当需要访问一个新的页面,首先调用findExist(i)函数来查看物理块中是否有这个页面。
8.寻找置换页面函数findReplace比较三个物理块中的时间标记timer,找到时间最久的。
四、源程序结构分析
1. 程序结构
程序共有以下九个部分:
int findSpace(void);//查找是否有空闲内存
int findExist(int curpage);//查找内存中是否有该页面 int findReplace(void);//查找应予置换的页面 void display(void);//显示 void FIFO(void);//FIFO算法 void LRU(void);//LRU算法 void OPT(void);//OPT算法;
void BlockClear(void);//BLOCK清空,以便用另一种方法重新演示 int main()
//主程序
五、实验结果
1运行后的初始界面 opt算法
3.FIFO算法
4LRU算法
第三篇:虚拟内存页面置换算法实验报告
软
件
学
院
上
机
实
验
报
告
课程名称:
操作系统原理
实验项目:
虚拟内存页面置换算法
实
验
室:
地狱 018
姓
名 :
死神
学
号:
专业班级 :
实验时间:
2015/12 / 13
实验成绩 评阅教师
一、
实验目得及要求
通过这次实验,加深对虚拟内存页面置换概念得理解,进一步掌握先进先出 FIFO、最佳置换OPI 与最近最久未使用LRU 页面置换算法得实现方法。结合 Linux 得内层得分析方法查瞧内存得分配过程及 linux kernel 得内存管理机制 二、实验性质
设计性 三、实验学时
学时 四、实验环境
实验环境1、实验环境:
C 与C++程序设计学习与实验系统 2、知识准备:(1)使用 Linux得基本命令;(2)了解 Linux vmstat、free、top等命令查瞧linux系统得内存分配情况;(3)
掌握虚拟内存页面置换算法 FIFO 等基本算法理论。
五、
实验内容及步骤
假设有n个进程分别在 T1, … ,Tn时刻到达系统,它们需要得服务时间分别为S1,… ,Sn。分别采用先来先服务 FCFS 与短作业优先 SJF 进程调度算法进行调度,计算每个进程得完成时间、周转时间与带权周转时间,并且统计 n 个进程得平均周转时间与平均带权周转时间。
步骤
通过已知最小物理块数、页面个数、页面访问序列、及采用置换方式可以得出页面置换得缺页次数与缺页率,及每次缺页时物理块中存储。
1.输入得形式
ﻩint
PageOrder[MaxNumber];//页面序列 int
PageNum,LackNum=0,BlockNum;//页面个数,缺页次数,最小物理块数 2、输出得形式 double
LackPageRate//缺页率 缺页个数 每次缺页时物理块中存储
程序所能达到得功能 模拟先进先出 FIFO、最佳置换 OPI与最近最久未使用 LRU页面置换算法得工作过程.假设内存中分配给每个进程得最小物理块数为m,在进程运行过程中要访问得页面个数为 n,页面访问序列为P1, …,Pn,分别利用不同得页面置换算法调度进程得页面访问序列,给出页面访问序列得置换过程,计算每种算法缺页次数与缺页率。测试数据,包括正确得输入及其输出结果与含有错误得输入及其输出结果。
程序中用到得所有抽象数据类型得定义、主程序得流程以及各程序模块之间得层次(调用)关系.int
PageOrder[MaxNumber];//页面序列 int
PageCount[MaxNumber]={0};//计算内存内数据离下一次出现得距离 int
PageNum,LackNum=0,BlockNum;//页面个数,缺页次数,最小物理块数 double
LackPageRate=0; bool found=false;
六、实验数据及结果分析
运行截图:
图6、1
图6、2
图6、3 七、实验总结
这次试验,让我加深了对虚拟内存页面置换算法得理解,进一步掌握先进先出 FIFO、最佳置换 OPI 与最近最久未使用 LRU 页面置换算法得实现方法。熟悉 Linux需要经过大量得实验、改进与思考,在编写代码得过程中遇到了一些问题要积极面对并通过讨论上网或者问老师解决。通过这次试验我了解了虚拟内存置换算法得一些知识,就是我对于所学习得专业知识得到了更好得巩固与提升。
附录 源程序清单 #include <iostream> using namespace std;#define MaxNumber 100 void OPI(int
PageOrder[MaxNumber],int
PageCount[MaxNumber],ﻩ
int
PageNum,int LackNum,int BlockNum,double
LackPageRate,bool found)
{
int module[MaxNumber];
int sum=0;
int i,j,k,m;
for(i=0;i { module[i]=PageOrder[i]; ;++musﻩﻩ)++j;i= cout<〈module[j]<〈” "; ;ldne<〈tuocﻩ } LackNum=BlockNum; for(i=BlockNum;i〈PageNum;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 { ﻩﻩﻩ ﻩ ﻩ if(module[j]!=PageOrder[k]) ﻩﻩ PageCount[j]++; ﻩ esleﻩ ;kaerbﻩ } ﻩ } ;]0[tnuoCegaP=xam tniﻩ int kind=0; 值大最出找//)++j;muNkcolB〈j;0=j(rofﻩ { ﻩ if(PageCount[j]>max) ﻩ { ﻩﻩ ;]j[tnuoCegaP=xamﻩﻩ ﻩ ﻩ kind=j; ﻩ } ﻩ } module[kind]=PageOrder[i]; ﻩ LackNum++;)++m;3 ;” ”<<]m[eludom<〈tuocﻩﻩ ﻩ;ldne< ﻩ } LackPageRate=(LackNum*1、0)/PageNum; cout〈〈“该算法缺页次数为:"<〈LackNum<<endl; cout<<”该算法缺页率为:"〈<LackPageRate*100<〈'%”〈〈endl;} /******************************先进先出置换算法*************************************/ void FIFO(int PageOrder[MaxNumber],int PageCount[MaxNumber],egaPkcaL elbuod ,muNkcolB tni,muNkcaL tni,muNegaP tniﻩRate,bool found){ int module[MaxNumber]; int sum=0; int i,j,m; for(i=0;i〈BlockNum;i++)//将内存填满 { module[i]=PageOrder[i]; ;++musﻩﻩ PageCount[i]=3-i;)++j;i=<j;0=j(rofﻩ cout<<module[j]<<" “; cout<<endl; } LackNum=BlockNum; for(i=BlockNum;i〈PageNum;i++) { found=false; for(j=0;j〈BlockNum;j++)//遍历已存储,判断就是否缺页 { ﻩ if(module[j]==PageOrder[i]) ﻩ { ﻩ ;eurt=dnuofﻩﻩ ﻩ break; } } if(found==false)//缺页,选择替换 { ﻩ ;]0[tnuoCegaP=xam tniﻩ int kind=0; 值大最出找//)++j;muNkcolB〈j;0=j(rofﻩ { ﻩ if(PageCount[j]>max) { ;]j[tnuoCegaP=xamﻩﻩ ﻩﻩ kind=j; } ﻩﻩﻩ } ﻩ for(int k=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++) ﻩ ;” ”<〈]m[eludom〈 ;ldne〈〈tuocﻩﻩ } ﻩ } ﻩ LackPageRate=(LackNum*1、0)/PageNum; cout〈〈“该算法缺页次数为:”<<LackNum< cout<<”该算法缺页率为:"< PageOrder[MaxNumber],int PageCount[MaxNumber],egaPkcaL elbuod,muNkcolB tni,muNkcaL tni,muNegaP tniﻩﻩRate,bool found){ int module[MaxNumber]; int sum=0; int i,j,m; for(i=0;i<BlockNum;i++)//将内存填满 { module[i]=PageOrder[i]; ﻩ sum++; PageCount[i]=3—i;)++j;i=<j;0=j(rofﻩ cout〈〈module[j]〈〈” ”; ;ldne〈<tuocﻩﻩ } LackNum=BlockNum; for(i=BlockNum;i { found=false; for(j=0;j<BlockNum;j++)//遍历已存储,判断就是否缺页 { ﻩ if(module[j]==PageOrder[i]) ﻩﻩ { ﻩ found=true; PageCount[j]=0;//查询后,更改次数 ﻩﻩ for(int k=0;k〈BlockNum;k++) ﻩ { ﻩﻩ ﻩﻩ)j=!k(fiﻩﻩ PageCount[k]++; ﻩ } ﻩ break; ﻩ } ﻩ } ﻩ if(found==false)//缺页,选择替换 { ﻩ ;]0[tnuoCegaP=xam tniﻩﻩ int kind=0; 值大最出找//)++j;muNkcolB ﻩﻩ)xam〉]j[tnuoCegaP(fiﻩﻩ { ﻩ ﻩ;]j[tnuoCegaP=xamﻩ ﻩﻩ kind=j; } ﻩ } ﻩﻩ for(int k=0;k { ﻩ if(k!=kind) PageCount[k]++; ﻩﻩ } ﻩ module[kind]=PageOrder[i]; PageCount[kind]=0;// 替换之后未查询得次数改为0 ;++muNkcaLﻩﻩ for(m=0; m<3;m++) ﻩ cout〈 ”; ﻩ;ldne<〈tuocﻩ } ﻩ } ﻩ LackPageRate=(LackNum*1、0)/PageNum; cout<〈“该算法缺页次数为:"< cout〈<”该算法缺页率为:”〈<LackPageRate*100〈<“%’<<endl;} int main() { int PageOrder[MaxNumber];//页面序列 int PageCount[MaxNumber]={0};//计算内存内数据离下一次出现得距离 int PageNum,LackNum=0,BlockNum;//页面个数,缺页次数,最小物理块数 ;0=etaRegaPkcaL elbuodﻩ bool found=false; ;3ecoihc,2ecoihc,0=1ecoihc tniﻩ int i=0;)0==1ecoihc(elihwﻩ { ;”:入输新重:1,入输不:0;据数入输新重否是就“〈〈tuocﻩ cin〉>chioce2; if(chioce2==1) {ﻩ cout<<”请输入页面个数:”; ;muNegaP >>nicﻩ;“数块理物小最入输请”〈〈tuocﻩ ;muNkcolB>>nicﻩ cout<〈”请输入页面序列:”< for(i=0;i〈PageNum;i++) ;]i[redrOegaP>〉nicﻩ }ﻩ;”:URL-3,IPO—2,OFIF-1:法算择选请"< if(chioce3==1) colB,muNkcaL,muNegaP,tnuoCegaP,redrOegaP(OFIFﻩkNum,LackPageRate,found); else { if(chioce3==2) colB ,muNkcaL,muNegaP,tnuoCegaP,redrOegaP(IPOﻩkNum,LackPageRate, found); esleﻩ ,muNkcolB ,muNkcaL,muNegaP,tnuoCegaP,redrOegaP(URLﻩLackPageRate,found); } *************************************“〈<tuocﻩ****************************”<<endl; ;"束结:1,续继:0:束结是就还续继择选请"< } } 中北大学软件学院 实 验 报 告 专 业 软件工程 课程名称 计算机操作系统 学 号 姓 名 辅导教师 张 静 成绩 实验日期 2015、11、20 实验时间实验名称 :实验四 页面置换算法模拟 2、实验目得(1)了解内存分页管理策略(2)掌握调页策略(3)掌握一般常用得调度算法(4)学会各种存储分配算法得实现方法。 (5)了解页面大小与内存实际容量对命中率得影响。 3、实验要求 编程实现页面置换算法,最少实现两种算法,比较算法得优劣,并将调试结果显示在计算机屏幕上,并检测机算与笔算得一致性。 (1)采用页式分配存储方案,通过分别计算不同算法得命中率来比较算法得优劣,同时也考虑页面大小及内存实际容量对命中率得影响;(2)实现 OPT 算法(最优置换算法)、LRU 算法(Least Recently)、FIFO 算法(First IN First Out)得模拟;(3)使用某种编程语言模拟页面置换算法.4、实验算法描述 (1)FIFO(先进先出) Y N N Y 开始 页面走向存入数组 p[]中,内存块用page[]表示初始化为 0 当前p[]中第i个元素就是否已在内Page[]就是否有空把 page[]中最先装入得页面置换出去、i++ 把 p[i]得内容直接装入最上面一个空内存块,i++ 输出当前内存块状态 i++ 图 4-1FIFO算法流程图 结束 (2) LRU(最近最久未使用) Y N Y N 图 4—2 LRU 算法流程图 开始 页面走向存入数组 p[]中,内存块用 page[]表示初始化为 0 当前 p[]中第 i 个元素就是否已在内存 Page[]就是否有空把 page[]中最近最久未使用得页面置换出去、i++ 把 p[i]得内容直接装入最上面一个空内存块,i++ 输出当前内存块状态 结束 i++ (3)OPT(最佳置换算法) Y N Y N 图4-3 OPT 流程图 开始 页面走向存入数组 p[]中,内存块用 page[]表示初始化为 0 当前 p[]中第 i 个元素就是否已在内存 Page[]就是否有空把 page[]中以后一段时间都不使用或就是使用时间离现在最远得换出、i++ 把 p[i]得内容直接装入最上面一个空内存块,i++ 输出当前内存块状态 结束 i++ 6、实验代码 #include <iostream〉 using namespace std;#define Bsize 3 #define Psize 20 struct pageInfor { 号面页// ;tnetnoc tniﻩ int timer; //被访问标记 };class PRA{ public: PRA(void); 存内闲空有否是就找查// ;)diov(ecapSdnif tniﻩ int findExist(int curpage); //查找内存中就是否有该页面 int findReplace(void); //查找应予置换得页面 void display(void); //显示 法算 OFIF//;)diov(OFIF diovﻩ 法算 URL//;)diov(URL diovﻩ void Optimal(void);//OPTIMAL 算法 void BlockClear(void);//BLOCK 恢复 pageInfor * block;//物理块 pageInfor * page;//页面号串 private: };PRA::PRA(void){ int QString[20]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1}; block = new pageInfor[Bsize];)++i;ezisB<i;0=i tni(rofﻩ { ;1— = tnetnoc、]i[kcolbﻩ ;0 = remit、]i[kcolbﻩﻩ } page = new pageInfor[Psize];)++i;ezisP〈i ;0=i(rofﻩ { ;]i[gnirtSQ = tnetnoc、]i[egapﻩ;0 = remit、]i[egapﻩﻩ }ﻩ} int PRA::findSpace(void) { for(int i=0; i if(block[i]、content == -1) 置位中 KCOLB回返,存内闲空到找//;i nruterﻩ;1— nruterﻩ} int PRA::findExist(int curpage) { for(int i=0;i<Bsize; i++))tnetnoc、]egapruc[egap == tnetnoc、]i[kcolb(fiﻩﻩ 置位中 KCOLB 回返,面页该有中存内到找//;i nruterﻩ ;1— nruterﻩ} int PRA::findReplace(void) { ;0 = sop tniﻩ for(int i=0;i<Bsize; i++))remit、]sop[kcolb => remit、]i[kcolb(fiﻩﻩ ﻩ pos = i;//找到应予置换页面,返回 BLOCK中位置 return pos; } void PRA::display(void) { for(int i=0;i<Bsize; i++) if(block[i]、content!=-1) ﻩ;” ”<〈tnetnoc、]i[kcolb〈〈tuocﻩ ;ldne<<tuocﻩ} void PRA::Optimal(void){ ; noitisop,ecaps,tsixe tniﻩ for(int i=0; i {ﻩ;)i(tsixEdnif = tsixeﻩﻩ)1-=! tsixe(fiﻩ {ﻩ ;ldne〈〈”页缺不“<<tuocﻩ }ﻩﻩ esleﻩ {ﻩﻩ ﻩﻩ space = findSpace(); ﻩ)1— =! ecaps(fiﻩ ﻩ {ﻩ ﻩ ;]i[egap = ]ecaps[kcolbﻩ ﻩ ;)(yalpsidﻩﻩ ﻩ } ﻩ esleﻩ {ﻩﻩ ﻩ)++k ;ezisB<k ;0=k tni(rofﻩ ﻩ for(int j=i; j<Psize; j++) ﻩ {ﻩﻩﻩ ﻩﻩ)tnetnoc、]j[egap =!tnetnoc、]k[kcolb(fiﻩ { 为 REMIT 置设,用会不来将//};0001 = remit、]k[kcolbﻩﻩ一个很大数 ﻩﻩ esleﻩ ﻩﻩ { ﻩﻩ ﻩ ﻩ block[k]、timer = j; ﻩ ﻩﻩ break; } ﻩﻩﻩ }ﻩﻩﻩﻩﻩ ﻩ position = findReplace(); ﻩ ;]i[egap = ]noitisop[kcolbﻩ ;)(yalpsidﻩﻩ }ﻩﻩ ﻩ } }ﻩ} void PRA::LRU(void){ int exist,space,position ; for(int i = 0; i < Psize;i++) {ﻩ ﻩ exist = findExist(i);)1- =! tsixe(fiﻩ { ﻩﻩ cout<<”不缺页”< ﻩ block[exist]、timer = —1;//恢复存在得并刚访问过得BLOCK 中页面 TIMER 为-1 ﻩ } ﻩ else {ﻩ ﻩﻩ space = findSpace();ﻩ)1-=!ecaps(fiﻩ ﻩ {ﻩ;]i[egap = ]ecaps[kcolbﻩﻩ ﻩ ;)(yalpsidﻩ ﻩﻩ } ﻩ esleﻩ {ﻩﻩ ;)(ecalpeRdnif = noitisopﻩﻩ ﻩ block[position] = page[i]; ﻩ ;)(yalpsidﻩ }ﻩﻩ }ﻩ for(int j=0;j〈Bsize;j++) ;++remit、]j[kcolbﻩﻩ }ﻩ} void PRA::FIFO(void) { int exist,space,position ; for(int i=0;i {ﻩ exist = findExist(i); ﻩ if(exist!=-1) {cout<<"不缺页"< esleﻩ { space = findSpace(); ﻩ)1-=! ecaps(fiﻩ ﻩﻩ { ﻩ block[space] = page[i]; ﻩ ﻩ display(); }ﻩﻩ esleﻩﻩ ﻩ { ﻩﻩ position = findReplace(); ﻩﻩ block[position] = page[i]; ;)(yalpsidﻩﻩ ﻩﻩ } }ﻩ)++j;ezisB block[j]、timer++;//BLOCK 中所有页面TIMER++ }ﻩ} void PRA::BlockClear(void){ for(int i=0;i {ﻩ block[i]、content =-1; ﻩ block[i]、timer = 0; } } void main(void){ ;ldne<〈”:法 算 换 置 面 页“<<tuocﻩ cout〈〈”页面号引用串:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1"<〈endl; cout〈〈”选择<1>应用 LRU 算法”〈<endl; cout<<”选择<2〉应用 FIFO 算法”〈 cout<<”选择<3>应用 Optimal 算法“<〈endl; ;ldne<<"出退>0〈择选”〈<tuocﻩ int select; PRA test;ﻩ while(select) { ﻩ cin〉>select;)tceles(hctiwsﻩ {ﻩ :0 esacﻩﻩ;kaerbﻩ :1 esacﻩﻩﻩ;ldne<<“:下如果结法算URL”<〈tuocﻩ ;)(URL、tsetﻩﻩ ;)(raelCkcolB、tsetﻩﻩ;ldne<<”---—-—--—-—--—-—-—-———“< ﻩ break; :2 esacﻩ cout<〈”FIFO 算法结果如下:“<<endl; test、FIFO();ﻩ;)(raelCkcolB、tsetﻩ ﻩ cout<〈”-——-------—-—------—--”<〈endl; ﻩ break; case 3: ;ldne〈<”:下如果结法算 lamitpO”< test、Optimal(); ﻩ ;)(raelCkcolB、tsetﻩﻩ;ldne<<"----—------——--————---"〈〈tuocﻩﻩ;kaerbﻩ default: ﻩ ;ldne〈<”号能功确正入输请“<<tuocﻩ ;kaerbﻩﻩ }ﻩﻩ } } 6、实验结果 7、实验心得 加深了对操作系统得认识,了解了操作系统中各种资源分配算法得实现,特别就是对虚拟存储,页面置换有了深入得了解,并能够用高级语言进行模拟演示。在这短短得两周时间里,通过浏览、阅读有关得资料,学到了很多东西,同时也发现仅仅书本得知识就是远远不够得,需要把知识运用到实践中去,能力才能得到提高。 使用 MFC可视化编程极大得减少了编写得代码量,直观得界面设计,不但便于修改,而且简化了界面程序代码得编写 两种页面置换算法 FIFO 与LRU理解起来相当容易,但在实际编程实现得时候需要注意各种细节,需要耐心细致,实际编程中遇到一些细节上得小问题确实需要仔细考虑才行. 操作系统课程第七次实验报告 姓名 学号 系 计算机 任课教师 指导教师 评阅教师 实验地点 综合楼B102 实验时间 2012-9-26 实验课表现 出勤和个人表现Q1(15+15(组长评分)=30分) 得分: 实验 总分 (Q1+Q2+Q3+Q4) 实验完成情况Q2(45分(组长与教师评分的加权平均)) 得分: 实验编号与实验名称: 实验七、常用页面置换算法模拟实验 实验目的: 通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。 实验内容及要求(详见实验讲义与实验指导书): 要求: 1)要求用你熟悉的程序设计语言编写和调试一个页面置换模拟程序;要求在主函数中测试。 2)实验报告中必须包括:设计思想、数据定义(包括详细说明)、处理流程(详细算法描述和算法流程图)、源代码、运行结果、体会等部分。 3)必须模拟本实验内容中提到的算法中的至少2种页面置换算法。 4) 比较不同页面置换算法的效率 内容:编写一个程序,使用以下页面置换算法中的某2种分别模拟一个分页系统,并统计同一个页面访问序列情况下不同页面置换算法引发的缺页中断次数。 1、第二次机会算法(Second Chance) 2、最近最少使用算法(Least Recently Used,LRU) 3、最不常用算法(Not Frequently Used,NFU) 4、最近未使用算法(Not Recently Used,NRU) 5、时钟页面置换算法 6、老化算法(aging) 页框的数量固定为4,虚拟页面数为8。实验输入为访问页面序列,比如0,1,3,2,7,1 实验用到的软件(:) DevC++,Visio 实验内容及关键步骤(代码)Q3(15分) 得分: 流程图:输入页面访问序列 取访问的页号 查页表 是否缺页? 是 置缺页标志flag为’*’ 按算法不同淘汰一页面 调入所访问的页面 否 FIFO算法流程图 LRU算法流程图: 函数关系解释图: 实现结果: 图1 图2 代码: #include #include #define MEMORY_SIZE /*物理块数*/ #define PROESS_SIZE /*页面号引用串个数*/#include #include /*全局变量*/ int mSIZE=4; int pSIZE=8; static int memery[4]={0}; /*物理块中的页号*/ static int page[8]={0}; /*页面号引用串*/ static int temp[8][4]={0}; /*辅助数组*/ /*置换算法函数*/ void FIFO(); void LRU(); void OPT(); void designBy(); /*辅助函数*/ void print(unsigned int t); /*主函数*/ int main() { int i,k,code; designBy(); system(“color 0A“); puts(“请依次输入页面号(8个):“); for(i=0;i scanf(“%1d“,&page[i]); system(“cls“); system(“color 0E“); do{ puts(“输入的页面号引用串为:“); for(k=0;k<=(pSIZE-1)/20;k++) { for(i=20*k;(i { if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1))) printf(“%d\n“,page[i]); else printf(“%d “,page[i]); } } printf(“* * * * * * * * * * * * * * * * * * * * * * *\n“); printf(“* 请选择页面置换算法:\t\t\t *\n“); printf(“* ----------------------------------------- *\n“); printf(“* 1.先进先出(FIFO) 2.最近最久未使用(LRU) *\n“); printf(“* 3.退出 *\n“); printf(“* * * * * * * * * * * * * * * * * * * * * * *\n“); printf(“请选择操作:[ ]\b\b“); scanf(“%d“,&code); switch(code) { case 1: FIFO(); break; case 2: LRU(); break; case 3: system(“cls“); system(“color 0A“); exit(0); default: printf(“输入错误,请重新输入:“); } printf(“按任意键重新选择置换算法:>>>“); getch(); system(“cls“); }while (code!=3); getch(); } void print(unsigned int t) { int i,j,k,l; int flag; for(k=0;k<=(pSIZE-1)/20;k++) { for(i=20*k;(i { if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1))) printf(“%d\n“,page[i]); else printf(“%d “,page[i]); } for(j=0;j { for(i=20*k;(i if(i>=j) printf(“ |%d|“,temp[i][j]); else printf(“ | |“); } for(i=mSIZE+20*k;(i { for(flag=0,l=0;l if(temp[i][l]==temp[i-1][l]) flag++; if(flag==mSIZE)/*页面在物理块中*/ printf(“ “); else printf(“ |%d|“,temp[i][j]); } /*每行显示20个*/ if(i%20==0) continue; printf(“\n“); } } printf(“----------------------------------------\n“); printf(“缺页次数:%d\t\t“,t+mSIZE); printf(“缺页率:%d/%d\n“,t+mSIZE,pSIZE); printf(“置换次数:%d\t\t“,t); printf(“访问命中率:%d%%\n“,(pSIZE-(t+mSIZE))*100/pSIZE); printf(“----------------------------------------\n“); } /*先进先出页面置换算法*/ void FIFO() { int memery[10]={0}; int time[10]={0}; /*记录进入物理块的时间*/ int i,j,k,m; int max=0; /*记录换出页*/ int count=0; /*记录置换次数*/ /*前mSIZE个数直接放入*/ for(i=0;i { memery[i]=page[i]; time[i]=i; for(j=0;j temp[i][j]=memery[j]; } for(i=mSIZE;i { /*判断新页面号是否在物理块中*/ for(j=0,k=0;j { if(memery[j]!=page[i]) k++; } if(k==mSIZE) /*如果不在物理块中*/ { count++; /*计算换出页*/ max=time[0]第四篇:页面置换算法模拟,实验报告
第五篇:操作系统 七次实验报告 常用页面置换算法模拟实验