版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、齐齐哈尔大学操作系统课程综合实践题目:主界面以灵活选择某算法 班级: 计本093 姓名: 赵明秋 学号: 2009021114 指导教师: 韩金库 2008年 12 月主界面以灵活选择某算法实验摘要:计算机应用专业的学生全面了解和掌握系统软件,一般软件设计方法和技术的必不可少的综合课程,也是了解计算机硬件和软件如何衔接的必经之路。我觉得此次实验最大的亮点以及不同于别人的地方就是将三种页面置换算法按照课本上老师讲的方式直观简便的输出 ,在采用输出算法时,我摒弃了常人所用的一维数组输出法,而别出心裁的采用了二维数组的输出算法,模拟了内存的物理块,清晰直观的表达了页面是如何在外存中被调入内存中的,以
2、及各页面在调入过程中是否命中或在置换时又置换了内存中哪个页面。在软件工程的角度来看,我的系统具有高内聚低耦合的优点,即各种算法之间,并不影响彼此的函数调用,而在各算法的内部,内聚度很高。关键词:设计原理, 设计方案, 流程图,源代码,测试结果,结束语,参考文献课题运行环境操作系统:Windows XP编程环境:Microsoft Visual C+6.01.1 实验内容: 通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。熟悉虚拟存储管理的各种液面置换算法,并辨析恶魔你程序实现请
3、求页式存储管理的页面置换算法。设计一个虚拟存储区和内存工作区,编程序演示下述算法的具体实现过程,并计算访问命中率。设计要求:主界面以灵活选择某算法,且以下算法都要实现1、先进先出算法(FIFO)2、最近最久未使用算法(LRU)3、最佳置换算法(OPT)2.1 运行环境1)操作系统:Windows XP2)编程环境:Microsoft Visual C+6.03.1 设计原理:3.1.1 先进先出算法(FIFO)最简单的页面置换算法是先入先出(FIFO)法。这种算法的实质是,总是选择在主存中停留时间最长(即最老)的一页置换,即先进入内存的页,先退出内存。理由是:最早调入内存的页,其不再被使用的可
4、能性比刚调入内存的可能性大。建立一个FIFO队列,收容所有在内存中的页。被置换页面总是在队列头上进行。当一个页面被放入内存时,就把它插在队尾上。这种算法只是在按线性顺序访问地址空间时才是理想的,否则效率不高。因为那些常被访问的页,往往在主存中也停留得最久,结果它们因变“老”而不得不被置换出去。FIFO的另一个缺点是,它有一种异常现象,即在增加存储块的情况下,反而使缺页中断率增加了。当然,导致这种异常现象的页面走向实际上是很少见的。该算法将所有使用的内存页面构成一个循环列队,每次置换时将队列中的队首唤出,队首指针后移一位即可,算法容易实现牡丹石最先进入内存的野末必将来就不用再到,甚至可能很快就会
5、用到,所以不能保证有效的缺页率,算法性能较差。3.2.2 最近最久未使用算法(LRU)FIFO算法和OPT算法之间的主要差别是,FIFO算法利用页面进入内存后的时间长短作为置换依据,而OPT算法的依据是将来使用页面的时间。如果以最近的过去作为不久将来的近似,那么就可以把过去最长一段时间里不曾被使用的页面置换掉。它的实质是,当需要置换一页时,选择在最近一段时间里最久没有使用过的页面予以置换。这种算法就称为最久未使用算法(Least Recently Used,LRU)。 LRU算法是与每个页面最后使用的时间有关的。当必须置换一个页面时,LRU算法选择过去一段时间里最久未被使用的页面。LRU算法是
6、经常采用的页面置换算法,并被认为是相当好的,但是存在如何实现它的问题。LRU算法需要实际硬件的支持。其问题是怎么确定最后使用时间的顺序,对此有两种可行的办法: (1)计数器。最简单的情况是使每个页表项对应一个使用时间字段,并给CPU增加一个逻辑时钟或计数器。每次存储访问,该时钟都加1。每当访问一个页面时,时钟寄存器的内容就被复制到相应页表项的使用时间字段中。这样我们就可以始终保留着每个页面最后访问的“时间”。在置换页面时,选择该时间值最小的页面。这样做,不仅要查页表,而且当页表改变时(因CPU调度)要维护这个页表中的时间,还要考虑到时钟值溢出的问题。 (2)栈。用一个栈保留页号。每当访问一个页
7、面时,就把它从栈中取出放在栈顶上。这样一来,栈顶总是放有目前使用最多的页,而栈底放着目前最少使用的页。由于要从栈的中间移走一项,所以要用具有头尾指针的双向链连起来。在最坏的情况下,移走一页并把它放在栈顶上需要改动6个指针。每次修改都要有开销,但需要置换哪个页面却可直接得到,用不着查找,因为尾指针指向栈底,其中有被置换页。因实现LRU算法必须有大量硬件支持,还需要一定的软件开销。所以实际实现的都是一种简单有效的LRU近似算法。一种LRU近似算法是最近未使用算法(Not Recently Used,NUR)。它在存储分块表的每一表项中增加一个引用位,操作系统定期地将它们置为0。当某一页被访问时,由
8、硬件将该位置1。过一段时间后,通过检查这些位可以确定哪些页使用过,哪些页自上次置0后还未使用过。就可把该位是0的页淘汰出去,因为在最近一段时间里它未被访问过。3.3.3 最佳置换算法(OPT)最优置换(Optimal Replacement)是在理论上提出的一种算法。其实质是:当调入新的一页而必须预先置换某个老页时,所选择的老页应是将来不再被使用,或者是在最远的将来才被访问。采用这种页面置换算法,保证有最少的缺页率。但是最优页面置换算法的实现是困难的,因为它需要人们预先就知道一个进程整个运行过程中页面走向的全部情况。不过,这个算法可用来衡量(如通过模拟实验分析或理论分析)其他算法的优劣。该算法
9、能保证有最低的缺页率,所以称为最佳置换算法,但是该算法紧紧是一种理想状况下的算法,因为在进程实际运行过程中,将来会执行到那儿页是不可预知的,所以无法选择该置换那个页出去。因此,本算法在实际中无法使用,只能作为一种标准来衡量其他算法的性能4.1 设计方案1)主界面:设置页面产生算法选择界面和页面置换算法选择界面;2)子界面:页面产生算法分为两个界面,分别是随机产生算法和自己输入产生算法。页面置换算法分为三个子界面,分别是先进先出算法界面、最近最久未使用算法界面、最佳置换算法界面。5.1 流程图5.1.1主流程图 图(1)5.1.2 FIFO函数流程图: 图(2)5.1.3 LRU函数流程图: 图
10、(4)5.1.4 OPT函数流程图: 图(5)6.源代码6.1 程序代码#include <iostream>#include <time.h>#include<math.h>#define Bsize 3#define Psize 12#include<string>using namespace std;int QStringPsize;int Num=0;struct pageInfor int content; int timer;class YZ_replacepublic: YZ_replace(); YZ_replace(); in
11、t findSpace(); int findExist(int curpage); int findReplace(); void FIFO(); void OPT(); void BlockClear(); void initia1(int string); pageInfor *block; pageInfor *page; int memory_stateBsizePsize; int s;private:;void P_String(int QString) int i; srand(unsigned)time(NULL); for(i=0;i<Psize;i+) QStrin
12、gi=rand()*9/RAND_MAX+1; cout<<"页面走向:" for(i=0;i<Psize;i+) cout<<QStringi<<" " cout<<endl;YZ_replace:YZ_replace()s=0; block = new pageInforBsize; for(int i=0; i<Bsize; i+) blocki.content = -1; blocki.timer = 0;void YZ_replace:initia1(int QString ) int
13、 j; page = new pageInforPsize; for(int i=0; i<Psize; i+) pagei.content = QStringi; pagei.timer = 0; for(i=0;i<Psize;i+) for(j=0;j<Bsize;j+) memory_stateji=0;YZ_replace:YZ_replace() s=0;int YZ_replace:findSpace() for(int i=0; i<Bsize; i+) if(blocki.content = -1) return i; return -1;int YZ
14、_replace:findExist(int curpage) for(int i=0; i<Bsize; i+) if(blocki.content = pagecurpage.content) return i; return -1;int YZ_replace:findReplace() int pos = 0; for(int i=0; i<Bsize; i+) if(blocki.timer >= blockpos.timer) pos = i; return pos;void YZ_replace:FIFO() int exist,space,position ;
15、 for(int i=0; i<Psize; i+) exist = findExist(i); if(exist != -1) for(int b=0; b<Bsize; b+) memory_statebi=memory_statebi-1; s+; else space = findSpace(); if(space != -1) for(int b=0; b<Bsize; b+) memory_statebi=memory_statebi-1; blockspace = pagei; memory_statespacei=blockspace.content; els
16、e for(int b=0; b<Bsize; b+) memory_statebi=memory_statebi-1; position = findReplace(); blockposition = pagei; memory_statepositioni=blockposition.content; for(int j=0; j<Bsize; j+) blockj.timer+; void YZ_replace:BlockClear() for(int i=0; i<Bsize; i+) blocki.content = -1; blocki.timer = 0; t
17、ypedef struct page int num; int time; Page; Page bBsize;Page callBsize; int cBsizePsize; int queue100; int K; void InitL(Page *b,int cBsizePsize) int i,j; for(i=0;i<Bsize;i+) bi.num=-1; bi.time=Psize-i-1; for(i=0;i<Bsize;i+) for(j=0;j<Psize;j+) cij=-1;int GetMax(Page *b) int i; int max=-1;
18、int tag=0; for(i=0;i<Bsize;i+) if(bi.time>max) max=bi.time; tag=i; return tag;int Equation(int fold,Page *b) int i; for(i=0;i<Bsize;i+) if (fold=bi.num) return i; return -1;void Lru(int fold,Page *b) int i; int val; val=Equation(fold,b); if (val>=0) bval.time=0; for(i=0;i<Bsize;i+) if
19、 (i!=val) bi.time+; else queue+K=fold; val=GetMax(b); bval.num=fold; bval.time=0; for(i=0;i<Bsize;i+) if (i!=val) bi.time+; void YZ_replace:OPT()int exist,space,position ;for(int i=0; i<Psize; i+)exist = findExist(i);if(exist != -1)for(int b=0; b<Bsize; b+)memory_statebi=memory_statebi-1;s+
20、;else space = findSpace();if(space != -1)for(int b=0; b<Bsize; b+)memory_statebi=memory_statebi-1;blockspace = pagei;memory_statespacei=blockspace.content;elsefor(int k=0; k<Bsize; k+)memory_stateki=memory_stateki-1; for(int j=i; j<Psize; j+) if(blockk.content != pagej.content) blockk.timer
21、 = 1000; else blockk.timer = j; break; position = findReplace(); blockposition = pagei; memory_statepositioni=blockposition.content;int decide(string str) for(int i=0;i<str.size();i+) if(stri<'0'|stri>'9')return 0;break;return i;int trans(string str) int sum=0;for(int i=0;i&
22、lt;str.size();i+)sum=sum+(stri-'0')*pow(10,str.size()-i-1);return sum;int put() int a,d;string str;cin>>str;a=decide(str);while(a=0)cout<<"输入错误,请重新输入!"<<endl;cin>>str; a=decide(str); d=trans(str);return d;void Put() cout<<"请选择产生页面的方法 a:随机产生 b:输入产生
23、"<<endl; cout<<"您选择的菜单是:" char F; cin>>F; while(F!='a'&&F!='b')cout<<"输入错误,请重新输入:"cin>>F; if(F='a')P_String(QString) ; if(F='b') cout<<"请输入各页面号:"<<endl;for(int i=0;i<Psize;i+)QStri
24、ngi=put(); cout<<endl; cout<<"|-|"<<endl;void main() cout<<"|-页 面 置 换 算 法-|"<<endl; cout<<"|-|"<<endl; int t=1; while(t) Put(); YZ_replace test1; YZ_replace test3; char select; do cout<<"请选择要应用的算法:<1>FIFO算法 <
25、2>LRU算法 <3>OPT算法 <0>退出"<<endl; int p,q; cout<<"请您输入菜单号:" cin>>select; while(select!='0'&&select!='1'&&select!='2'&&select!='3') cout<<"您的输入无效,请重新输入:"<<endl;cin>>select;
26、 if(select='0') cout<<"您选择的是菜单<0>"<<endl; cout<<"完成退出."<<endl; t=0; if(select='1') cout<<"您选择的是菜单<1>"<<endl; cout<<"FIFO算法状态:"<<endl; test1.initia1(QString); test1.FIFO(); test1.BlockC
27、lear(); cout<<"-"<<endl; for(p=0;p<Bsize;p+) for(q=0;q<Psize;q+) cout<<test1.memory_statepq<<" " cout<<endl; cout<<"-"<<endl; cout<<"命中率:"<<test1.s<<"/"<<Psize<<endl; test1
28、.YZ_replace(); cout<<endl; if(select='2') int i,j; K=-1; InitL(b, c); for(i=0;i<Psize;i+) Lru(QStringi,b); c0i=QStringi; for(j=0;j<Bsize;j+) cji=bj.num; cout<<"您选择的是菜单<2>"<<endl; cout<<"LRU算法状态:"<<endl; cout<<"-"&l
29、t;<endl; for(i=0;i<Bsize;i+) for(j=0;j<Psize;j+) if(cij=-1) cout<<" 0" else cout<<" "<<cij; cout<<" "<<endl; cout<<"-"<<endl; cout<<"命中率:"<<(Psize-(K+1)<<"/"<<Psize;
30、 cout<<'t' cout<<endl; if(select='3') cout<<"您选择的是菜单<3>"<<endl; cout<<"OPT算法状态:"<<endl; test3.initia1(QString); test3.OPT(); test3.BlockClear(); cout<<"-"<<endl; for(p=0;p<Bsize;p+) for(q=0;q<Ps
31、ize;q+) cout<<test3.memory_statepq<<" " cout<<endl; cout<<"-"<<endl; cout<<"命中率:"<<test3.s<<"/"<<Psize<<endl; test3.YZ_replace(); cout<<endl; while(select='1'|select='2'|select='3'); 7.测试结果7.1 页面选择测试: 图(7.1) 图(7.2)分析:页面产生的方法有两种选择,分别是随机产生和自己输入产生,选择菜单的时候有对异常输入的处理,如果输入错误,有错误提示,当输入正确菜单的时候,选择a,自动产生页面走向,如果选择b,自己可以任意输入,如果输入错误,有错误提示。6.2 应用算法选择测试 图(7.3)分析:选择算法时,有异常处理,即如果输入错误,有
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 开题报告:虚拟医学临床诊疗培训云平台设计与应用
- 开题报告:新时代内地西藏班爱国主义教育序列化活动课程实践研究
- 中考地理总复习阶段填图06 中国地理概况(原卷版)
- 2024年广州商务写字楼租赁协议范本版
- 2024年劳动协议安全管理制度样本解析版B版
- 2024年幼儿园中班科学活动教案-好玩的拓印
- 2024年度企业办公设备采购与服务协议版B版
- 建设项目需征占用林地定额计划行政工作计划
- 2024双拥工作总结与计划
- 2024高三化学教师的工作计划
- 2024年江苏省苏州市中考数学试卷含答案
- 软件测试汇报
- 吉林省长春市第一〇八学校2024-2025学年七年级上学期期中历史试题
- 无薪资合同范例
- GB/T 22082-2024预制混凝土衬砌管片
- 充电电缆产品入市调查研究报告
- 初中《孙中山诞辰纪念日》主题班会
- 5.5 跨学科实践:制作望远镜教学设计八年级物理上册(人教版2024)
- 2024年时事政治题库附参考答案(综合题)
- 阿斯伯格综合症自测题汇博教育员工自测题含答案
- 隧道及地下工程基础知识单选题100道及答案解析
评论
0/150
提交评论