頁面更换算法的模拟.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
頁面更换算法的模拟

实验三 页面更换算法的模拟 实验内容: 熟悉,编程实现简单。最简单的页面置换算法是先入先出(FIFO)法。这种算法的实质是,总是选择在主存中停留时间最长(即最老)的一页置换,即先进入内存的页,先退出内存。理由是:最早调入内存的页,其不再被使用的可能性比刚调入内存的可能性大。建立一个FIFO队列,收容所有在内存中的页。被置换页面总是在队列头上进行。当一个页面被放入内存时,就把它插在队尾上。 这种算法只是在按线性顺序访问地址空间时才是理想的,否则效率不高。因为那些常被访问的页,往往在主存中也停留得最久,结果它们因变“老”而不得不被置换出去。 FIFO的另一个缺点是,它有一种异常现象,即在增加存储块的情况下,反而使缺页中断率增加了。当然,导致这种异常现象的页面走向实际上是很少见的。 LRULeast Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的。LRU算法的提出,是基于这样一个事实:在前面几条指令中使用频繁的页面很可能在后面的几条指令中频繁使用。反过来说,已经很久没有使用的页面很可能在未来较长的一段时间内不会被用到。这个,就是著名的局部性原理——比内存速度还要快的cache,也是基于同样的原理运行的。因此,我们只需要在每次调换时,找到最近最少使用的那个页面调出内存。这就是LRU算法的全部内容。 CLOCK算法:一个页面首次装入主存时,其“引用位”置0;在主存中的任何一个页面被访问时,其“引用位”置1;淘汰页面时,存储管理从指针当前指向的页面开始扫描循环队列,把所遇到的“引用位”是“1”的页面的“引用位”清成0,并跳过这个页面;把所遇到的“引用位”是“0”的页面淘汰掉,指针推进一步;扫描循环队列,如果遇到的所有页面的“引用位”是“1”,指针就会绕整个循环队列一圈,把碰到的页面的“引用位”清0;指针停在起始位置,并淘汰掉这一页,然后指针推进一步。 2. 实验方法 1)使用流程图描述演示程序的设计思想; 2)选取c/c++、Java等计算机语言,编程调试,最终给出运行正确的程序。 3. 程序设计 参考程序: C++版的页面更换模拟程序 #include iostream #include deque #include ctime using namespace std; typedef struct { int id; //页面ID int stayTime; //内存中驻留时间 int unUseTime; //已经多久未被使用 }CPage; dequeint RunQueue; dequeCPage interPage; //内存中的四个页面 dequeCPage exterPage; //外存中的N个页面 int presentSeat; //目前运行到了队列的第几个? int lackNum[3] ={0}; int getRandNum(int range) //返回[0,range)范围内的整数 { return static_castint(rand()%range); } int findPageIdByCmdId(int cmdId) //通过强制转换成整数的形式判断指令属于哪个页面 { return static_castint(cmdId/10); } void InitDevice() //初始化运行队列 按照25% 50% 25%的标准生成 { srand(static_castint(time(NULL))); int t_cmdNum = getRandNum(320); //随机选择第一条指令 RunQueue.push_back(t_cmdNum); //将其插入队列 if(t_cmdNum 319) RunQueue.push_back(t_cmdNum+1); //顺序执行下一条指令 while(RunQueue.size() = 320) { t_cmdNum = getRandNum(t_cmdNum); //跳转到m1属于[0,m-1] RunQueue.push_back(t_cmdNum); //将m1插入队列 if(t_cmdNum 319) RunQueue.push_back(t_cmdNum+1); //将m1+1插入队列 int temp = 320 -

文档评论(0)

sd47f8cI + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档