设计程序对比分析页面置换策略《操作系统》实验报告.docx
- 文档编号:25023493
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:42
- 大小:743.22KB
设计程序对比分析页面置换策略《操作系统》实验报告.docx
《设计程序对比分析页面置换策略《操作系统》实验报告.docx》由会员分享,可在线阅读,更多相关《设计程序对比分析页面置换策略《操作系统》实验报告.docx(42页珍藏版)》请在冰豆网上搜索。
设计程序对比分析页面置换策略《操作系统》实验报告
设计程序对比分析页面置换策略《操作系统》实验报告
年级、专业、班级
2010级信安一班
姓名
黄耿
实验题目
设计程序对比分析页面置换策略
实验时间
2013.5.7
实验地点
主教410
实验成绩
实验性质
□验证性□设计性□综合性
教师评价:
□算法/实验过程正确;□源程序/实验内容提交□程序结构/实验步骤合理;
□实验结果正确;□语法、语义正确;□报告规范;
其他:
评价教师签名:
一、实验目的
1)熟悉常用的页面置换策略的基本原理;
2)通过模拟实验分析不同置换策略的性能差异;
3)理解操作系统关于内存管理的一些方法。
二、实验项目内容
在Windows操作系统上开发一个具备图形界面的程序。
程序功能:
1)动态演示四种页面置换策略(OPT,FIFO,LRU,CLOCK)。
2)能够可视化观察每种置换策略的工作工程。
3)能够输入一个数字表示页执行序列的总长度(不小于1000),能够设置进程的总页数,然后随机产生页执行序列。
4)能够输入一个数字设置操作系统分配给进程的页面数。
5)统计每种置换策略在不同输入数据情况下的页面失效数。
6)根据实验结果分析不同置换策略的性能。
并在实验报告中画出页面失效数与分配的页面数之间的关系曲线。
参考教材图8.17。
7)观察FIFO的belady效应。
三、实验过程或算法(源程序)
1.先进先出(FIFO)算法
先进先出算法(FIFO),总选择作业中最先进入内存的一页淘汰。
较早调入的页往往是经常被访问的页,这些页在FIFO算法下被反复调入和调出。
只有在线性顺序访问地址空间时才是理想的,否则效率不高。
算法流程图:
2、最近最久不用的页面置换算法(LRU)
根据页面调入内存后使用情况进行决策,选择在最近一段时间内最久不用的页面予以淘汰,当页面进入内存时设计一个数组,记录每个页面自上次访问内存以来经历的时间t,淘汰时,总是选择t值最大的页面予以淘汰!
算法流程图:
3、Clock算法
为内存中的每一个页面设置一位访问位,当某页被访问时,其访问位置1。
置换算法在选择一页淘汰时,只需检查页的访问位。
如果是0,就选择将该页换出,若为1,则重新将它置0,暂不换出,而给该页面第二次驻留内存的机会,再按FIFO算法检查下一个页面。
当检查到队列中的最后一个页面时,若其访问位仍为1,则在返回到队首检查第一个页面!
流程图如图:
4、最佳置换算法(Opt)
需要进行页面置换时,把内存中以后一段时间都不使用或是使用时间离现在很远的页面置换出去
流程图如图:
各算法的实现代码见附录。
四、实验结果及分析和(或)源程序调试过程
4.1操作流程
图4-1程序主界面
界面下输入物理块数,置换页面数还有页表长度,点击Random按钮,产生一组页面引用号,如图
图4-2随机产生页面地址序列
在随机产生一组页面引用串后,点击“FIFO”按钮,OPT算法置换过程界面,如图
图4-3FIFO算法的置换过程
清空界面,点击Random按钮随机产生页面引用串,接着点击“LRU”按钮,LRU算法置换过程界面,如图
清空界面,点击Random按钮随机产生一组页面引用串,接着点击“Optimal”按钮,Optimal算法置换过程界面,如图
清空界面,点击Random按钮随机产生一组页面引用串,接着点击“Clock”按钮,Clock算法置换过程界面,如图
通过随机产生一引用串,比较Option算法,FIFO算法,LRU算法,Clock算法的命中率,缺也率。
比较如图
打开“性能模拟”面板:
在“页表长度”输入框中输入页表长度,并单击“生成随机序列”按钮,效果如图:
点击“模拟”按钮,开始算法的模拟,如图:
模拟结果:
四种算法对应不同页框数时页面失效率的比较:
性能比较:
从上图可看出,Optimal算法的性能较优,在先进先出算法(FIFO)——选择装入最早的页面置换的过程中,可以通过链表来表示各页的装入时间先后。
FIFO的性能较差,因为较早调入的页往往是经常被访问的页,这些页在FIFO算法下被反复调入和调出,并且有Belady现象。
所谓Belady现象是指:
采用FIFO算法时,如果对—个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象。
五、心得体会
通过本次实验,我对四种页面置换策略有了更深的了解,理解了操作系统关于内存管理的一些方法,并通过编程实现了Option算法,FIFO算法,LRU算法,Clock算法。
也进一步提高了我们的编程能力,从中学会了很多。
六、附录:
源代码
6.1OPT置换算法实现类
publicclassOPT{
privateintm,n,length;
privateint[]passion;
privateintlack;//缺页数
privatedoublelackf;//缺页率
privateinthit;//命中次数
privatedoublehitf;//命中率
privateintcount[];//存放物理块中现有的页面号
privateintphysics[];
privateintas=0;//置换页面数
privateintm1=0,m_c=0,a;
privatebooleanx;//页面是否需要置换
privateStringstr2,str1;
privateStringm_list="Optimal置换算法";
publicOPT(intmm,intnn,intl,intapp[]){
this.m=mm;
this.n=nn;
this.length=l;
this.passion=newint[nn];
this.physics=newint[nn];
this.count=newint[mm];
this.passion=app;
for(inti=0;i str1=""; str2=""; x=true; for(intk=0;k if(passion[i]==count[k])//判断物理块中的页面是否与当前页面相等 { x=false;//判断物理块中是不是有跟当前须替换的页面 m1++; m_c++; break; } } if(x){ intc=0,d; if((i-m1) a=i-m1; }//当前物理页面未填满时直接装入 else{ for(intk=0;k for(inth=i;h if(count[k]==passion[h])//判断物理块中的页面是否与未来页面相等 { physics[k]=h; break; } if(h==length-1) physics[k]=length; } } d=physics[0]; for(inth=0;h if(d d=physics[h]; c=h; } } a=c;//找出物理块中最久未使用的页面号 } count[a]=passion[i];//将其替换 physics[a]=0; for(intk=0;k if(k! =a) physics[k]=physics[k]+1;//使物理块中的每个未改变页面的时间增一 } physics[a]=0; as++; } for(intj=0;j intb; b=count[j]; str2=String.valueOf(b); str1=str1+""+str2; } m_list=m_list+"\n"+str1; } lack=as; lackf=(double)as/n; hit=m_c; hitf=(double)hit/n; } publicintgetLack(){ returnthis.lack; } publicdoublegetLackf(){ returnthis.lackf; } publicintgetHit(){ returnthis.hit; } publicdoublegetHitf(){ returnthis.hitf; } publicStringgetM_list(){ returnthis.m_list; } } 6.2FIFO算法实现类 publicclassFIFO{ privateintm,n; privateint[]passion; privateintlack;//缺页数 privatedoublelackf;//缺页率 privateinthit;//置换次数 privatedoublehitf;//页面置换率 privateintcount[];//存放物理块中现有的页面号 privateintm1=0,m_c=0,r; privateintas=0,a;//as为置换页面数 privatebooleanx;//页面是否需要置换 privateStringstr1,str2; privateStringm_list="FIFO置换算法"; publicFIFO(intmm,intnn,intapp[]){ this.m=mm; this.n=nn; this.passion=newint[nn]; this.count=newint[mm]; this.passion=app; for(inti=0;i str1=""; str2=""; x=true; for(intk=0;k if(passion[i]==count[k]) { x=false;//判断物理块中是不是有跟当前须替换的页面 m_c++; break; } } if(x){ if((i-m1) { a=i-m1; }//当前物理页面未填满时直接装入 count[0]=passion[i]; for(r=0;r count[r]=count[r+1];//把未替换的元素依次向后移一位,即让最先进入页面的页号始终停留在第一位 count[r]=passion[i]; as++; } intb; for(intj=0;j b=count[j]; str2=String.valueOf(b); str1=str1+""+str2; } m_list=m_list+'\n'+str1; } lack=as; lackf=(double)as/n; hit=m_c; hitf=(double)hit/n; } publicintgetLack(){ returnthis.lack; } publicdoublegetLackf(){ returnthis.lackf; } publicintgetHit(){ returnthis.hit; } publicdoublegetHitf(){ returnthis.hitf; } publicStringgetM_list(){ returnthis.m_list; } } 6.3LRU算法 publicclassLRU{ privateintm,n; privateint[]passion; privateintlack;//缺页数 privatedoublelackf;//缺页率 privateinthit;//命中次数 privatedoublehitf;//命中率 privateintcount[];//存放物理块中现有的页面号 privateintphysics[];//记录进程快中没有被访问的时间 privateintas=0;//置换页面数 privateintm1=0,m_c=0,a;//a为物理块中的页面号 privatebooleanx;//页面是否需要置换 privateStringstr2,str1; privateStringm_list="LUR置换算法"; publicLRU(intmm,intnn,intapp[]){ this.m=mm; this.n=nn; this.passion=newint[nn]; this.physics=newint[nn]; this.count=newint[mm]; this.passion=app; for(inti=0;i str1=""; str2=""; x=true; for(intk=0;k if(passion[i]==count[k])//判断物理块中的页面是否与当前页面相等 { physics[k]=physics[0]; for(intj=0;j if(j! =k) physics[j]=physics[j]+1;//使物理块中的每个未使用页面的时间增一 } x=false;//判断物理块中是不是有跟当前须替换的页面 m1++; m_c++; break; } } if(x){ intc=0,d; if((i-m1) { a=i-m1; }//当前物理页面未填满时直接装入 else{ d=physics[0]; for(inth=0;h if(d { d=physics[h]; c=h; } } a=c;//找出物理块中最久未使用的页面号 } count[a]=passion[i];//将其替换 physics[a]=0; for(intk=0;k { if(k! =a) physics[k]=physics[k]+1;//使物理块中的每个未改变页面的时间增一 } physics[a]=0; as++; } for(intj=0;j { intb; b=count[j]; str2=String.valueOf(b); str1=str1+""+str2; } m_list=m_list+"\n"+str1; } lack=as; lackf=(double)as/n; hit=m_c; hitf=(double)hit/n; } publicintgetLack(){ returnthis.lack; } publicdoublegetLackf(){ returnthis.lackf; } publicintgetHit(){ returnthis.hit; } publicdoublegetHitf(){ returnthis.hitf; } publicStringgetM_list(){ returnthis.m_list; } } 6.4Clock算法实现类 publicclassCLOCK{ privateintm,n; privateint[]passion; privateintlack;//缺页数 privatedoublelackf;//缺页率 privateinthit;//命中次数 privatedoublehitf;//命中率 privateintas=0,m_c=0; privateint[]count; privateint[]index;//页面标志位, privateStringstr1,str2; privateStringm_list="clock置换算法"; privateintpointer=0; publicCLOCK(intmm,intnn,intapp[]){ this.m=mm; this.n=nn; this.passion=newint[nn]; this.index=newint[mm]; this.count=newint[mm]; this.passion=app; for(inti=0;i { str1=""; str2=""; intj=0; for(j=0;j if(count[j]==passion[i]) { index[j]=1;//将标志位置1 m_c++; //as--; break; } if(j continue; as++; while(index[pointer]==1) { index[pointer++]=0; pointer%=m; } count[pointer]=passion[i];//替换最近未用的物理块 index[pointer++]=1; pointer%=m; for(j=0;j intb; b=count[j]; str2=String.valueOf(b); str1=str1+""+str2; } m_list=m_list+"\n"+str1; } lack=as; lackf=(double)as/n; hit=m_c; hitf=(double)hit/n; } publicintgetLack(){ returnthis.lack; } publicdoublegetLackf(){ returnthis.lackf; } publicintgetHit(){ returnthis.hit; } publicdoublegetHitf(){ returnthis.hitf; } publicStringgetM_list(){ returnthis.m_list; } } 6.5系统界面界面,主函数,随机数函数程序 classrandom{ int[]rand(intn,intlength){ int[]rand=newint[n]; for(inti=0;i rand[i]=(int)(Math.random()*1000%length)+1; } returnrand; } } classunderneathextendsJPanel{ JTextFieldjtext1,jtext2,jtext3,jtext4; JPanelpan; JTextAreatextarea; publicunderneath(){ jtext1=newJTextField(3); jtext2=newJTextField(3); jtext3=newJTextField(3); jtext4=newJTextField(3); jtext1.setEditable(false); jtext2.setEditable(false); jtext3.setEditable(false); jtext4.setEditable(false); pan=newJPanel(); pan.setLayout(newGridLayout(4,2)); pan.add(newJLabel("缺页数")); pan.add(jtext1); pan.add(newJLabel("缺页率")); pan.add(jtext2); pan.add(newJLabel("命中次数")); pan.add(jtext3); pan.add(newJLabel("命中率")); pan.add(jtext4); textarea=newJTextArea(); textarea.setEditable(false); JScrollPanescrollPane=newJScr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 设计 程序 对比 分析 页面 置换 策略 实验 报告