您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 山东大学操作系统实验七
软件学院操作系统实验报告实验题目:实验七、内存页面置换算法实验学号:201100300124日期:2013年05月31日班级:5班姓名:韩俊晓Email:hanjunxiao188@gmail.com实验目的:加深对于存储管理的了解,掌握虚拟存储器的实现原理;观察和了解重要的页面置换算法和置换过程。练习模拟算法的编程技巧,锻炼分析试验数据的能力。实验要求:请在以上示例实验程序中补充“增强二次机会”等置换算法的模拟程序。输入不同的内存页面引用串和实存帧数,观察并分析其页面置换效果和性能,并将其与LRU和FIFO算法进行比较。改进以上示例实验程序,使之能够随机的产生内存页面引用串,以便能动态的观测各种置换算法的性能。硬件环境:实验室计算机软件环境:Ubuntu08.4-Linux操作系统BASH_VERSION='3.2.33(1)-releasegccversion4.1.2gedit2.18.2OpenOffice2.3实验步骤:1.实验说明:1.示例实验程序中模拟两种置换算法:LRU算法和FIFO算法2.能对两种算法给定任意序列不同的页面引用串和任意帧实内存块数的组合测试,显示页置换的过程。3.能统计和报告不同置换算法情况下依次淘汰的页号、缺页次数(页错误数)和缺页率。比较两种置换算法在给定条件下的优劣。4.为了能方便的扩充页面置换算法,更好的描述置换过程,示例实验程序采用了C++语言用Replace类描述了置换算法及其属性。2.调试过程:1)建立vmrp.cc程序,将代码写到程序中;2)再建立以下名为vmrp.h的C语言头文件:#includeiostream#includeiomanip#includemalloc.husingnamespacestd;classReplace{public:Replace();~Replace();voidInitSpace(char*MethodName);//初始化页号记录voidReport(void);//报告算法执行情况voidFifo(void);//先进先出算法voidLru(void);//最近最旧未用算法voidClock(void);//时钟(二次机会)置换算法voidEclock(void);//增强二次机会置换算法voidLfu(void);//最不经常使用置换算法voidMfu(void);//最经常使用置换算法private:int*ReferencePage;//存放要访问到的页号int*EliminatePage;//存放淘汰页号int*PageFrames;//存放当前正在实存中的页号intPageNumber;//访问页数intFrameNumber;//实存帧数intFaultNumber;//失败页数int*Referencebit;//引用位int*count;int*Modifybit;//修改位};3)建立以下项目管理文件Makefilehead=vmrp.hsrcs=vmrp.ccobjs=vmrp.oopts=-w-g-call:vmrpvmrp:$(objs)g++$(objs)-ovmrpvmrp.o:$(srcs)$(head)g++$(opts)$(srcs)clean:rmvmrp*.o4)输入make命令编译连接生成可执行的vmrp程序$gmakeg++-g-cvmrp.ccvmrp.hg++vmrp.o-ovmrp5)执行程序实验代码:#includevmrp.hReplace::Replace(){inti;//设定总得访问页数,并分配相应的引用页号和淘汰页号记录数组空间coutPleaseinputpagenumbers:;cinPageNumber;//存放要访问到的页号ReferencePage=newint[sizeof(int)*PageNumber];//访问页数EliminatePage=newint[sizeof(int)*PageNumber];//存放淘汰页号coutPleaseinputreferencepagestring:;for(i=0;iPageNumber;i++)cinReferencePage[i];coutPleaseinputpageframes:;cinFrameNumber;//实存帧数PageFrames=newint[sizeof(int)*FrameNumber];//存放当前正在实存中的页号Referencebit=newint[sizeof(int)*FrameNumber];//引用位count=newint[sizeof(int)*FrameNumber];Modifybit=newint[sizeof(int)*FrameNumber];//修改位}Replace::~Replace(){}voidReplace::InitSpace(char*MethodName){inti;coutendlMethodNameendl;FaultNumber=0;//失败页数//引用还未开始,-1表示无引用页for(i=0;iPageNumber;i++)EliminatePage[i]=-1;//淘汰页号初始都设为-1for(i=0;iFrameNumber;i++){PageFrames[i]=-1;//存放当前正在实存中的页号Referencebit[i]=0;//未被使用引用位设置为0count[i]=0;//计数Modifybit[i]=0;//修改位初始为0}}//分析统计选择的算法对于当前输入的页面走向的性能voidReplace::Report(void){//报告淘汰页顺序coutendlEliminatepage:;for(inti=0;EliminatePage[i]!=-1;i++)coutEliminatePage[i];//报告缺页数和缺页率coutendlNumberofpagefaults=FaultNumberendl;coutsetw(6)setprecision(3);coutRateofpagefaults=100*(float)FaultNumber/(float)PageNumber%endl;}//最近最旧未用置换算法voidReplace::Lru(void){inti,j,k,l,next;InitSpace(LRU);//初始化页号记录//循环装入引用页for(k=0,l=0;kPageNumber;k++){//l为淘汰页的标记next=ReferencePage[k];//检测引用页当前是否已在实存for(i=0;iFrameNumber;i++){if(next==PageFrames[i]){//与当前正在实存中的页号比较//引用页已在实存将其调整到页记录栈顶next=PageFrames[i];for(j=i;j0;j--)PageFrames[j]=PageFrames[j-1];PageFrames[0]=next;break;}}if(PageFrames[0]==next){//如果引用页已放栈顶,则为不缺页,报告当前内存页号for(j=0;jFrameNumber;j++)if(PageFrames[j]=0)coutPageFrames[j];coutendl;continue;//继续装入下一页}else//如果引用页还未放栈顶,则为缺页,缺页数加1FaultNumber++;//栈底页号记入淘汰页数组中EliminatePage[l]=PageFrames[FrameNumber-1];//向下压栈for(j=FrameNumber-1;j0;j--)PageFrames[j]=PageFrames[j-1];PageFrames[0]=next;//引用页放栈顶//报告当前实存中页号for(j=0;jFrameNumber;j++)if(PageFrames[j]=0)coutPageFrames[j];//报告当前淘汰的页号if(EliminatePage[l]=0)cout-EliminatePage[l++]endl;elsecoutendl;}//分析统计选择的算法对于当前引用的页面走向的性能Report();}//先进先出置换算法voidReplace::Fifo(void){inti,j,k,l,next;InitSpace(FIFO);//循环装入引用页for(k=0,j=l=0;kPageNumber;k++){next=ReferencePage[k];//如果引用页已在实存中,报告实存页号for(i=0;iFrameNumber;i++)if(next==PageFrames[i])break;if(iFrameNumber){for(i=0;iFrameNumber;i++)coutPageFrames[i];coutendl;continue;//继续引用下一页}//引用页不在实存中,缺页数加1FaultNumber++;//最先入页号记入淘汰页数组EliminatePage[l]=PageFrames[j];PageFrames[j]=next;//引用页号放最先入页号处j=(j+1)%FrameNumber;//最先入页号循环下移//报告当前实存页号和淘汰页号for(i=0;iFrameNumber;i++)if(PageFrames[i]=0)coutPageFrames[i];if(EliminatePage[l]=0)cout-EliminatePage[l++]endl;elsecoutendl;}Report();}//时钟(二次机会)置换算法voidReplace::Clock(void){intj,i,k,l,next;InitSpace(Clock);for(k=0,j=l=0;kPageNumber;k++){next=ReferencePage[k];for(i=0;iFrameNumber;i++)//检测引用页当前是否已在实存if(next==PageFrames[i]){Referencebit[i]=1;//引用位设置为1break;}if(iFrameNumber){for(i=0;iFrameNumber;i++)coutPageFrames[i];coutendl;continue;}if(Referencebit[j]==1){//如果引用位为1Referencebit[j]==0;//在判断之后,重新设置成0}EliminatePage[l]=PageFrames[j];//最先入页号记入淘汰页数组PageFrames[j]=next;//引用页号放最先入页号处Referencebit[j]=1;//引用位设置为1FaultNumber++;//缺页数加1j=(j+1)%FrameNumber;//最先入页号循环下移for(i=0;iFrameNumber;i++)if(PageFrames[i]=0)coutPageFrames[i];if(EliminatePage[l]=0)cout-EliminatePage[l++]endl;elsecoutendl;}Report();}//增强二次机会置换算法voidReplace::Eclock(void){intj,i,k,l,next;InitSpace(EClock);for(k=0,j=l=0;kPageNumber;k++){next=ReferencePage[k];//循环装入引用页for(i=0;iFrameNumber;i++)//检测引用页当前是否已在实存if(next==P
本文标题:山东大学操作系统实验七
链接地址:https://www.777doc.com/doc-3219380 .html