1、齐齐哈尔大学操作系统课程综合实践题目:主界面以灵活选择某算法班级:计本093姓名:赵明秋学号:2009021114指导教师:韩金库2008年12月主界面以灵活选择某算法实验摘要:计算机应用专业的学生全面了解和掌握系统软件,一般软件设计方法和技术的必不可少的综合课程,也是了解计算机硬件和软件如何衔接的必经之路。我觉得此次实验最大的亮点以及不同于别人的地方就是将三种页面置换算法按照课本上老师讲的方式直观简便的输出,在采用输出算法时,我摒弃了常人所用的一维数组输出法,而别出心裁的采用了二维数组的输出算法,模拟了内存的物理块,清晰直观的表达了页面是如何在外存中被调入内存中的,以
2、及各页面在调入过程中是否命中或在置换时又置换了内存中哪个页面。在软件工程的角度来看,我的系统具有高内聚低耦合的优点,即各种算法之间,并不影响彼此的函数调用,而在各算法的内部,内聚度很高。关键词:设计原理,设计方案,流程图,源代码,测试结果,结束语,参考文献课题运行环境操作系统:WindowsXP编程环境:MicrosoftVisualC+6.01.1实验内容:通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。熟悉虚拟存储管理的各种液面置换算法,并辨析恶魔你程序实现请
4、能性比刚调入内存的可能性大。建立一个FIFO队列,收容所有在内存中的页。被置换页面总是在队列头上进行。当一个页面被放入内存时,就把它插在队尾上。这种算法只是在按线性顺序访问地址空间时才是理想的,否则效率不高。因为那些常被访问的页,往往在主存中也停留得最久,结果它们因变“老”而不得不被置换出去。FIFO的另一个缺点是,它有一种异常现象,即在增加存储块的情况下,反而使缺页中断率增加了。当然,导致这种异常现象的页面走向实际上是很少见的。该算法将所有使用的内存页面构成一个循环列队,每次置换时将队列中的队首唤出,队首指针后移一位即可,算法容易实现牡丹石最先进入内存的野末必将来就不用再到,甚至可能很快就会
7、面时,就把它从栈中取出放在栈顶上。这样一来,栈顶总是放有目前使用最多的页,而栈底放着目前最少使用的页。由于要从栈的中间移走一项,所以要用具有头尾指针的双向链连起来。在最坏的情况下,移走一页并把它放在栈顶上需要改动6个指针。每次修改都要有开销,但需要置换哪个页面却可直接得到,用不着查找,因为尾指针指向栈底,其中有被置换页。因实现LRU算法必须有大量硬件支持,还需要一定的软件开销。所以实际实现的都是一种简单有效的LRU近似算法。一种LRU近似算法是最近未使用算法(NotRecentlyUsed,NUR)。它在存储分块表的每一表项中增加一个引用位,操作系统定期地将它们置为0。当某一页被访问时,由
9、能保证有最低的缺页率,所以称为最佳置换算法,但是该算法紧紧是一种理想状况下的算法,因为在进程实际运行过程中,将来会执行到那儿页是不可预知的,所以无法选择该置换那个页出去。因此,本算法在实际中无法使用,只能作为一种标准来衡量其他算法的性能4.1设计方案1)主界面:设置页面产生算法选择界面和页面置换算法选择界面;2)子界面:页面产生算法分为两个界面,分别是随机产生算法和自己输入产生算法。页面置换算法分为三个子界面,分别是先进先出算法界面、最近最久未使用算法界面、最佳置换算法界面。5.1流程图5.1.1主流程图图(1)5.1.2FIFO函数流程图:图(2)5.1.3LRU函数流程图:图
10、(4)5.1.4OPT函数流程图:图(5)6.源代码6.1程序代码#include#include#include#defineBsize3#definePsize12#includeusingnamespacestd;intQStringPsize;intNum=0;structpageInforintcontent;inttimer;classYZ_replacepublic:YZ_replace();YZ_replace();intfindSpace();intfindExist(intcurpage);intfindReplace
11、();voidFIFO();voidOPT();voidBlockClear();voidinitia1(intstring);pageInfor*block;pageInfor*page;intmemory_stateBsizePsize;ints;private:;voidP_String(intQString)inti;srand(unsigned)time(NULL);for(i=0;iPsize;i+)QStringi=rand()*9/RAND_MAX+1;cout页面走向:;for(i=0;iPsize;i+)coutQStr
12、ingi;coutendl;YZ_replace:YZ_replace()s=0;block=newpageInforBsize;for(inti=0;iBsize;i+)blocki.content=-1;blocki.timer=0;voidYZ_replace:initia1(intQString)intj;page=newpageInforPsize;for(inti=0;iPsize;i+)pagei.content=QStringi;pagei.timer=0;for(i=0;iPsize;i+)for(j=
13、0;jBsize;j+)memory_stateji=0;YZ_replace:YZ_replace()s=0;intYZ_replace:findSpace()for(inti=0;iBsize;i+)if(blocki.content=-1)returni;return-1;intYZ_replace:findExist(intcurpage)for(inti=0;iBsize;i+)if(blocki.content=pagecurpage.content)returni;return-1;intYZ_replace:findRep
14、lace()intpos=0;for(inti=0;i=blockpos.timer)pos=i;returnpos;voidYZ_replace:FIFO()intexist,space,position;for(inti=0;iPsize;i+)exist=findExist(i);if(exist!=-1)for(intb=0;bBsize;b+)memory_statebi=memory_statebi-1;s+;elsespace=findSpace();if(space!=-1)for(intb=0
15、;bBsize;b+)memory_statebi=memory_statebi-1;blockspace=pagei;memory_statespacei=blockspace.content;elsefor(intb=0;bBsize;b+)memory_statebi=memory_statebi-1;position=findReplace();blockposition=pagei;memory_statepositioni=blockposition.content;for(intj=0;jBsize;j+)blockj.timer
16、+;voidYZ_replace:BlockClear()for(inti=0;iBsize;i+)blocki.content=-1;blocki.timer=0;typedefstructpageintnum;inttime;Page;PagebBsize;PagecallBsize;intcBsizePsize;intqueue100;intK;voidInitL(Page*b,intcBsizePsize)inti,j;for(i=0;iBsize;i+)bi.num=-1;bi.time=Psize-i-1;
17、for(i=0;iBsize;i+)for(j=0;jPsize;j+)cij=-1;intGetMax(Page*b)inti;intmax=-1;inttag=0;for(i=0;imax)max=bi.time;tag=i;returntag;intEquation(intfold,Page*b)inti;for(i=0;i=0)bval.time=0;for(i=0;iBsize;i+)if(i!=val)bi.time+;elsequeue+K=fold;val=GetMax(b);bval.num=fold;bval.
18、time=0;for(i=0;iBsize;i+)if(i!=val)bi.time+;voidYZ_replace:OPT()intexist,space,position;for(inti=0;iPsize;i+)exist=findExist(i);if(exist!=-1)for(intb=0;bBsize;b+)memory_statebi=memory_statebi-1;s+;elsespace=findSpace();if(space!=-1)for(intb=0;bBsize;b+)memory_statebi=memory
19、_statebi-1;blockspace=pagei;memory_statespacei=blockspace.content;elsefor(intk=0;kBsize;k+)memory_stateki=memory_stateki-1;for(intj=i;jPsize;j+)if(blockk.content!=pagej.content)blockk.timer=1000;elseblockk.timer=j;break;position=findReplace();blockposition=pagei;memory_sta
20、tepositioni=blockposition.content;intdecide(stringstr)for(inti=0;istr.size();i+)if(stri9)return0;break;returni;inttrans(stringstr)intsum=0;for(inti=0;istr;a=decide(str);while(a=0)cout输入错误,请重新输入!str;a=decide(str);d=trans(str);returnd;voidPut()cout请选择产生页面的方法a:随机产生b:输入产生endl;coutF;
21、while(F!=a&F!=b)coutF;if(F=a)P_String(QString);if(F=b)cout请输入各页面号:endl;for(inti=0;iPsize;i+)QStringi=put();coutendl;cout|-|endl;voidmain()cout|-页面置换算法-|endl;cout|-|endl;intt=1;while(t)Put();YZ_replacetest1;YZ_replacetest3;charselect;docout请选择要应用的算法:FIFO算法LRU算法OPT算法退出end
22、l;intp,q;coutselect;while(select!=0&select!=1&select!=2&select!=3)cout您的输入无效,请重新输入:select;if(select=0)cout您选择的是菜单endl;cout完成退出.endl;t=0;if(select=1)cout您选择的是菜单endl;coutFIFO算法状态:endl;test1.initia1(QString);test1.FIFO();test1.BlockClear();cout-endl;for(p=0;pBsize;p+)for(q=0;qPsize;q+
23、)couttest1.memory_statepq;coutendl;cout-endl;cout命中率:test1.s/Psizeendl;test1.YZ_replace();coutendl;if(select=2)inti,j;K=-1;InitL(b,c);for(i=0;iPsize;i+)Lru(QStringi,b);c0i=QStringi;for(j=0;jBsize;j+)cji=bj.num;cout您选择的是菜单endl;coutLRU算法状态:endl;cout-endl;for(i=0;iBsize;i+)for(j=
24、0;jPsize;j+)if(cij=-1)cout0;elsecoutcij;coutendl;cout-endl;cout命中率:(Psize-(K+1)/Psize;coutt;coutendl;if(select=3)cout您选择的是菜单endl;coutOPT算法状态:endl;test3.initia1(QString);test3.OPT();test3.BlockClear();cout-endl;for(p=0;pBsize;p+)for(q=0;qPsize;q+)couttest3.memory_statepq;coute
25、ndl;cout-endl;cout命中率:test3.s/Psizeendl;test3.YZ_replace();coutendl;while(select=1|select=2|select=3);7.测试结果7.1页面选择测试:图(7.1)图(7.2)分析:页面产生的方法有两种选择,分别是随机产生和自己输入产生,选择菜单的时候有对异常输入的处理,如果输入错误,有错误提示,当输入正确菜单的时候,选择a,自动产生页面走向,如果选择b,自己可以任意输入,如果输入错误,有错误提示。6.2应用算法选择测试图(7.3)分析:选择算法时,有异常处理,即如果输入错误,有错误提示。如果选择菜单1,即选择了FIFO算法,展示此算法的置换状态并显示命中率。置换状态以二维数组的形式输出,既直观又清晰。图(7.4)分析:算法一进行完以后,界面自动跳到应用算法的选择界面,即可以再次选择置换算法,选择菜单2,即选择了LRU算法,展示此算法的置换状态并显示命中率,可以和第一个算法进行对比,找出两种算法的不同。图(7.5)分析:算法二进行完以后,界面自动跳到应用算法的选择界面,