请求页式存储管理模拟实验源代码及实验报告.doc
- 文档编号:4875033
- 上传时间:2023-05-07
- 格式:DOC
- 页数:14
- 大小:267.50KB
请求页式存储管理模拟实验源代码及实验报告.doc
《请求页式存储管理模拟实验源代码及实验报告.doc》由会员分享,可在线阅读,更多相关《请求页式存储管理模拟实验源代码及实验报告.doc(14页珍藏版)》请在冰点文库上搜索。
//请求页式存储管理模拟实验源代码及实验报告
//自己写的,程序写得比较简单,只为方便学弟学妹们呵呵^^
//dlnu.
#include
#include
#include
#include
#include
usingnamespacestd;
intyemianliu[32]={0};//全局变量数组,地址流
intp;//全局变量p是一共有多少地址流
voidchushihua()//初始化函数
{
intt;
srand(time(0));//随机产生指令序列
p=12+rand()%32;
cout<<"地址流序列:
";
for(inti=0;i
{
t=1+rand()%9;
yemianliu[i]=t;//将随机产生的指令数存入页面流
cout< } cout< } voidFIFO(intn)//FIFO算法,n是M的值 { inti; intq=p; inte; intqueye=0; intflag; intfifo[32]={0}; while(q--) { flag=0; e=q; for(i=0;i { if(fifo[i]==yemianliu[q]) { flag=1; break; } } if(flag==0) { intm=n-1; intk=m; while(m--) { fifo[k]=fifo[k-1]; k--; } fifo[0]=yemianliu[e]; queye++; } } cout<<"M="< "<<(1-((double)queye/p))*100<<"%"<<""; } voidLRU(intn)//LRU算法 { inti; intq=p; inte; intqueye=0; intflag; intflag1,; inty; intlru[32]={0}; while(q--) { flag=0; e=q; for(i=0;i { if(lru[i]==yemianliu[q]) { flag=1; flag1=i; break; } } if(flag==0) { intm=n-1; intk=m; while(m--) { lru[k]=lru[k-1]; k--; } lru[0]=yemianliu[e]; queye++; } elseif(flag==1) { y=flag1; while(y--) { lru[flag1]=lru[flag1-1]; flag1--; } lru[0]=yemianliu[e]; } } cout<<"M="< "<<(1-((double)queye/p))*100<<"%"< } voidmain() { chushihua(); for(inti=3;i<33;i++) { FIFO(i); LRU(i); } } 报告: ××××大学 计算机科学与工程学院实验报告 实验题目: 请求页式存储管理模拟 课程名称: 计算机操作系统 实验类型: □演示性□验证性□操作性□设计性□综合性 专业: 班级: 姓名: 学号: 实验日期: 2012年5月24日实验地点: 实验学时: 实验成绩: 指导教师签字: 年月日 实验题目: 3 实验要求: 3 一、方案设计 4 1.技术方案: 4 (1)先进先出法(FirstInFirstOut): 4 (2)最近最久未使用(LeastRecentlyUsed): 4 2.功能设计: 4 (1)chushihua()函数的功能: 4 (2)FIFO()的功能: 4 (3)LRU()的功能: 4 二、结构设计 4 1、数据结构设计 4 2、程序结构设计 4 三、程序设计 5 1.FIFO()函数流程图; 5 2.LRU()函数流程图: 6 四、编码调试 7 主要问题及解决方法: 7 五、实验总结 7 六、程序清单 8 源代码: 8 运行结果: 11 实验题目: 请求页式存储管理模拟 实验要求: 设计一个虚拟存储区和内存工作区,并使用下述算法计算访问命中率。 (1)先进先出的算法(FIFO) (2)最近最久未用算法(LRU) (3)最近最不经常使用算法(NUR)*(选做) (4)最佳淘汰算法(OPT)*(选做) (5)最少访问页面算法(LFU)*(选做) 命中率=1-页面失效次数/页面地址流长度 程序设计中,首先用Srand()和Rand()函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,针对不同的算法计算出相应的命中率。 一、方案设计 1.技术方案: (1)先进先出法(FirstInFirstOut): 该算法总是淘汰最先进入内存的页面,既选择在内存中驻留时间最久的页面予以淘汰。 在该算法的模拟过程中,每当页面需要被置换进入内存时,最先进入内存的内容们都依次向底移一位,需要访问的内容存入数组0号单元,即最顶部,这时缺页数加1;当不需要进行页面置换,即所需访问的内容在内存中时,不需要操作,继续读下一条指令。 这样就实现了总是淘汰最先进入内存的页面,选择了在内存中驻留时间最久的页面予以淘汰。 (2)最近最久未使用(LeastRecentlyUsed): 该算法将过去最长一段时间里不曾被使用的页面置换掉。 在该算法的模拟过程中,每当页面需要被置换进入内存时,最先进入内存的内容们都依次向底移一位,需要访问的内容存入数组0号单元,即最顶部,这时缺页数加1;当不需要进行页面置换,即所需访问的内容在内存中时,将要访问的指令移到内存顶部,其他指令依次向下移一位,这样就把最久不用的指令沉到了底部,有必要时淘汰,即实现了总是淘汰最近最久未使用的指令。 2.功能设计: (1)chushihua()函数的功能: 先由Srand()和Rand()函数定义和随机产生指令序列,然后将指令序列变换成相应的页地址流存入地址流数组里。 (2)FIFO()的功能: 实现FIFO算法,淘汰最先进入内存的页面并根据缺页数算出命中率。 (3)LRU()的功能: 实现LRU算法,淘汰最近最久未使用的页面并根据缺页数算出命中率。 二、结构设计 1、数据结构设计 本程序使用了三个一维数组: yemianliu[]存放地址指令流序列; fifo[]存放FIFO算法时的内存指令; lru[]存放LRU算法时的内存指令。 2、程序结构设计 主函数 Chushihua() FIFO() LRU() 开始 结束 三、程序设计 1.FIFO()函数流程图; 否 是 是 否 开始 得到执行的指令 指令是否在内存中 queye加1,指令存入内存,最先存入指令被淘汰 下面是否还有指令 结束 得出命中率 2.LRU()函数流程图: 否 是 是 否 开始 得到执行的指令 指令是否在内存中 queye加1,指令存入内存,淘汰数组底部指令 下面是否还有指令 结束 得出命中率 将指令移到数组顶部,其他依次下移一位 四、编码调试 主要问题及解决方法: 刚开始老师的例题看不懂,虽然知道FIFO和LRU的原理,但不知道从何下手。 我觉得老师的那个例题太复杂了,如果我也写那么复杂程序肯定崩溃得一塌糊涂,所以我觉定按自己的理解写。 我也搜了很多例题,但都和题目要求不太一样,老师的例题和网上的例题都用到了结构体数组,在内存的指令旁都附加了一个累加器,以访问次数和时间决定要淘汰的指令,而我是每访问一次后,按访问次数冒泡排序一次,这样最近被访问的就在数组的最顶上,最远被访问的在内存数组的最底部,没有用到循环队列,但也能实现功能。 这次我没有用到结构体数组,也没有用到指针(有点遗憾),不过测试了好几组数据,结果都和我用笔算的一样。 在编程中,因为定义的变量太多了,取名也有点混乱,弄得我很晕,刚开始一直崩溃,后来我把程序的运行过程一步步的cout出来和调试,终于发现了错误的地方。 开始我一直用for()语句来控制循环,但是都找不到适合的让它结束循环的方法,后来才想到了可以用while(n--)来控制,效果还不错。 还有就是第一次使用随机函数,有点陌生,上网查了些资料,终于会应用它了。 这次试验大概就遇到了以上问题,都一一解决了,当然程序还是存在一些问题的,但是收获很多! 五、实验总结 通过本次实验,我对操作系统这门课程有了更进一步的认识和了解,通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟储技术的特点。 通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求调页系统的原理和实现过程的理解,也知道了几种算法的效率,也验证了LRU算法的命中率平均的比FIFO算法的高。 在本次设计过程中,用到了许多C++的基本知识和操作系统的基本原理,是对平时所学知识的一次考验,尽管这些知识都学过,但运用到实际时,却不知从何下手,而且错误不断,往往为了找一个错误而花了大量的时间,这是专业知识掌握不够,缺乏实践动手能力的表现。 在设计的过程中我们发现了许多自己的不足之处。 通过该实验,我收获了很多。 我了解到编写程序不是首要任务,而是一种实现手段。 我们最重要的是如何做好需求分析和理清思路,做出正确、简洁的流程设计,这样可以达到事半功倍的效果。 六、程序清单 源代码: #inclu#include de #include #include #include usingnamespacestd; intyemianliu[32]={0};//全局变量数组,地址流 intp;//全局变量p是一共有多少地址流 voidchushihua()//初始化函数 { intt; srand(time(0));//随机产生指令序列 p=12+rand()%32; cout<<"地址流序列: "; for(inti=0;i { t=1+rand()%9; yemianliu[i]=t;//将随机产生的指令数存入页面流 cout< } cout< } voidFIFO(intn)//FIFO算法,n是M的值 { inti; intq=p; inte; intqueye=0; intflag; intfifo[32]={0}; while(q--) { flag=0; e=q; for(i=0;i { if(fifo[i]==yemianliu[q]) { flag=1; break; } } if(flag==0) { intm=n-1; intk=m; while(m--) { fifo[k]=fifo[k-1]; k--; } fifo[0]=yemianliu[e]; queye++; } } cout<<"M="< "<<(1-((double)queye/p))*100<<"%"<<""; } voidLRU(intn)//LRU算法 { inti; intq=p; inte; intqueye=0; intflag; intflag1,; inty; intlru[32]={0}; while(q--) { flag=0; e=q; for(i=0;i { if(lru[i]==yemianliu[q]) { flag=1; flag1=i; break; } } if(flag==0) { intm=n-1; intk=m; while(m--) { lru[k]=lru[k-1]; k--; } lru[0]=yemianliu[e]; queye++; } elseif(flag==1) { y=flag1; while(y--) { lru[flag1]=lru[flag1-1]; flag1--; } lru[0]=yemianliu[e]; } } cout<<"M="< "<<(1-((double)queye/p))*100<<"%"< } voidmain() { chushihua(); for(inti=3;i<33;i++) { FIFO(i); LRU(i); } } 运行结果: 14
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 请求 存储 管理 模拟 实验 源代码 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)