【实验目的】
实验目的:
1.通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚 拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。 实验要求:掌握五种存储管理算法 1)最佳淘汰算法(OPT) 2)先进先出的算法(FIFO) 3)最近最久未使用算法(LRU) 4)最不经常使用算法(LFU) 5)最近未使用算法(NUR)
2.熟悉内存自由空闲队列的分配策略及熟悉内存分区的回收原则及实现过程
【实验内容】 设计一个虚拟存储区和内存工作区,并使用下述算法计算访问命中率。 1)最佳淘汰算法(OPT) 2)先进先出的算法(FIFO) 3)最近最久未使用算法(LRU) 4)最不经常使用算法(LFU) 5)最近未使用算法(NUR) 命中率=1-页面失效次数/页地址流长度 模拟内存的动态分配和回收,并编程实现。
【实验环境】(含主要设计设备、器材、软件等) Pc电脑一台
【实验步骤、过程】(含原理图、流程图、关键代码,或实验过程中的记录、数据等)
一、算法描述 1.先进先出算法(FIFO): 原理是优先淘汰最早进入内存的页面,FIFO 算法是最简单的页面置换算法。FIFO 页面置换算法为每个页面记录了调到内存的时间,即必须置换页面时会选择最旧的页面。“FIFO 算法当进程分配到的页面数增加时,缺页中断的次数可能增加也可能减少”。 FIFO 算法基于队列实现,不是堆栈类算法。注意,并不需要记录调入页面的确切时间,可以创建一个 FIFO 队列,来管理所有的内存页面。置换的是队列的首个页面。当需要调入页面到内存时,就将它加到队列的尾部。FIFO 页面置换算法易于理解和编程。然而,它的性能并不总是十分理想:其一,所置换的页面可以是很久以前使用过但现已不再使用的初始化模块。其二,所置换的页面可以包含一个被大量使用的变量,它早就初始化了,但仍在不断使用。
2.最近最久未被使用算法(LRU): 即淘汰最近没有使用的页面,选择最近最长时间未访问过的页面予以淘汰,它认为过去一段时间内未访问过的页面,在最近的将来可能也不会被访问。该算法为每个页面设置一个访问字段,来记录页面自上次被访问以来所经历的时间,淘汰页面时选择现有页面中值最大的予以淘汰。
3.最近未使用算法(NUR): 当某一页首次装入主存时,该帧的使用位设置为1;当该页随后再被访问到时,它的使用位也被置为1。对于页替换算法,用于替换的候选帧集合看做一个循环缓冲区,并且有一个指针与之相关联。当某一页被替换时,该指针被设置成指向缓冲区中的下一帧。当需要替换一页时,操作系统扫描缓冲区,以查找使用位被置为0的一帧。每当遇到一个使用位为1的帧时,操作系统就将该位重新置为0;如果在这个过程开始时,缓冲区中所有帧的使用位均为0,则选择遇到的第一个帧替换;如果所有帧的使用位均为1,则指针在缓冲区中完整地循环一周,把所有使用位都置为0,并且停留在最初的位置上,替换该帧中的页。由于该算法循环地检查各页面的情况,故称为 CLOCK 算法,又称为最近未用( Not Recently Used, NRU )算法。
4.最佳淘汰算法(OPT): 当要调入一页而必须淘汰旧页时,应该淘汰以后不再访问的页,或距最长时间后要访问的页面。它所产生的缺页数最少,然而,却需要预测程序的页面引用串,这是无法预知的,不可能对程序的运行过程做出精确的断言,不过此理论算法可用作衡量各种具体算法的标准。
5.最不经常使用置换算法(LFU): 最不经常使用(LFU)页面置换算法要求置换具有最小计数的页面。这种选择的原因是,积极使用的页面应当具有大的引用计数。然而,当一个页面在进程的初始阶段大量使用但是随后不再使用时,会出现问题。由于被大量使用,它有一个大的计数,即使不再需要却仍保留在内存中。一种解决方案是,定期地将计数右移 1 位,以形成指数衰减的平均使用计数。
6.FF首次适应算法(First Fit): 该算法从空闲分区链首开始查找,直至找到一个能满足其大小要求的空闲分区为止。然后再按照作业的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链中。特点: 该算法倾向于使用内存中低地址部分的空闲区,在高地址部分的空闲区很少被利用,从而保留了高地址部分的大空闲区。显然为以后到达的大作业分配大的内存空间创造了条件。
7.最佳适应算法(Best Fit): 该算法总是把既能满足要求,又是最小的空闲分区分配给作业。为了加速查找,该算法要求将所有的空闲区按其大小排序后,以递增顺序形成一个空白链。这样每次找到的第一个满足要求的空闲区,必然是最优的。
8.最坏适应算法(Worst Fit): 最坏适应算法是将输入的作业放置到主存中与它所需大小差距最大的空闲区中。空闲区大小由大到小排序。
图1 页面置换
二、实验说明 本实验的程序设计基本上按照实验内容进行。即首先用 srand( )和 rand( )函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。
(1)通过随机数产生一个指令序列,共 320 条指令。指令的地址按下述原则生成: A:50%的指令是顺序执行的 B:25%的指令是均匀分布在前地址部分 C:25%的指令是均匀分布在后地址部分
具体的实施方法是: A:在[0,319]的指令地址之间随机选取一起点 m B:顺序执行一条指令,即执行地址为 m+1 的指令 C:在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为 m’ D:顺序执行一条指令,其地址为 m’+1 E:在后地址[m’+2,319]中随机选取一条指令并执行 F:重复步骤 A-E,直到 320 次指令
(2)将指令序列变换为页地址流 设:页面大小为 1K; 用户内存容量 4 页到 32 页; 用户虚存容量为 32K。 在用户虚存中,按每 K 存放 10 条指令排列虚存地址,即 320 条指令在虚存中的存放方式为: 第 0 条-第 9 条指令为第 0 页(对应虚存地址为[0,9]) 第 10 条-第 19 条指令为第 1 页(对应虚存地址为[10,19]) ……………………………… 第 310 条-第 319 条指令为第 31 页(对应虚存地址为[310,319]) 按以上方式,用户指令可组成 32 页。
三、主要实验代码
图2 FIFO
图3 LFU
图4 LRU
图5 NUR
图6 OPT
四、实验结果 1.运行结果
图7 运行结果 2.曲线图
图8 曲线图 由曲线图我们可以看出,在这几种算法的命中率中,OPT最高,达到了90%,其次为NUR,而FIFO和LRU相差无几,命中率最低的为LFU,但是每个页面的执行结果可能会有所不同,而且OPT算法在执行过程中可能会发生错误。
五、选做部分 1.题目描述 用系统提供的 malloc 函数和 free 函数模拟生成一些空闲区,用 FF、BF 、WF算法组织形成空闲区队列,随机生成一个作业序列模拟其分配过程。
2.算法描述 (1)FF首次适应算法(First Fit) 该算法从空闲分区链首开始查找,直至找到一个能满足其大小要求的空闲分区为止。然后再按照作业的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链中。特点: 该算法倾向于使用内存中低地址部分的空闲区,在高地址部分的空闲区很少被利用,从而保留了高地址部分的大空闲区。显然为以后到达的大作业分配大的内存空间创造了条件。
(2)最佳适应算法(Best Fit) 该算法总是把既能满足要求,又是最小的空闲分区分配给作业。为了加速查找,该算法要求将所有的空闲区按其大小排序后,以递增顺序形成一个空白链。这样每次找到的第一个满足要求的空闲区,必然是最优的。
(3)最坏适应算法(Worst Fit) 最坏适应算法是将输入的作业放置到主存中与它所需大小差距最大的空闲区中。空闲区大小由大到小排序。
3.主要代码截图
图9 FF主要代码
图10 BF主要代码
图11 WF主要代码 4.运行结果 (1)随机初始化,模拟生成空闲区
图12 模拟生成空闲区 (2)FF执行结果
图13 FF执行结果 (3)BF执行结果
图14 BF执行结果 (4)WF执行结果
图15 WF执行结果 通过上述三种算法的实现结果,可以简要对三种算法进行对比。 对于首次适应算法(First Fit),该算法更倾向于使用内存中低地址部分的空闲区,在高地址部分的空闲区很少被利用,从而保留了高地址部分的大空闲区。显然为以后到达的大作业分配大的内存空间创造了条件。但是也存在一些缺点,比如低地址部分不断被划分,留下许多难以利用、很小的空闲区,而每次查找又都从低地址部分开始,会增加查找的开销。 对于最佳适应算法(Best Fit),该算法似乎是最优的,但事实上并不一定。因为每次分配后剩余的空间一定是最小的,在存储器中将留下许多难以利用的小空闲区。同时每次分配后必须重新排序,这也带来了一定的开销。该算法每次分配给文件的都是最合适该文件大小的分区,但内存中会留下许多难以利用的小的空闲区。 对于最坏适应算法(Worst Fit)特点,它尽可能地利用存储器中大的空闲区,但绝大多数时候都会造成资源的严重浪费甚至是完全无法实现分配。
【实验结果或总结】(对实验结果进行相应分析,或总结实验的心得体会,并提出实验的改进意见) 通过本次实验,让我更加深入地理解了四种页面算法以及他们的优缺点,并互相进行对比。FIFO算法是最新进入的页面在尾部,最久进入的在头部,每当发生缺页中断时,就替换掉表头的页面并把新调入的页面加入到链表的末尾;LRU 算法是通过比较已经调入内存的页面的时间,选出最早调度内存的算法;NUR算法是将页面被访问设置R位,页面被写入M位,比较四种形况,选择出一个情况最容易的进行置换;OPT 算法需要比较已经进入内存的页面哪些最久不会被使用,并将其换出,这是一个理想算法且命中率比较高;最不经常使用的置换算法:算法根据数据的历史访问频率来淘汰数据。 而在这五种算法中,通过图标分析,显然OPT算法的命中率更高,其他四种算法的命中率较为相似,但从别的参考资料可以看到LRU,NUR 的命中率比其他两个略高。通过这次的学习也懂得了三种动态分区算法,并能够理解各个算法的优缺点,这次的学习过程收获很大。 最后,感谢倪福川老师和其他同学在这次实验中给予我的帮助,不胜感激!