写在最前面
文中测试数据来自教材“《计算机操作系统(第四版)》汤小丹、梁红兵、哲凤屏、汤子瀛版”中“5.3 页面置换算法”章节例子。不足之处欢迎指出!
文章目录
设计内容
存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。本设计的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。
(1)通过随机数产生一个指令序列,共320条指令。指令的地址按下述原则生成:
①50%的指令是顺序执行的;
②25%的指令是均匀分布在前地址部分;
③25%的指令是均匀分布在后地址部分。
具体的实施方法是:
①在[0,319]的指令地址之间随机选取一起点m;
②顺序执行一条指令,即执行地址为m+l的指令;
③在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’;
④顺序执行一条指令,其地址为m’+1;
⑤在后地址[m’+2,319]中随机选取一条指令并执行;
⑥重复上述步骤①~⑤,直到执行320次指令。
(2)将指令序列变换成为页地址流。设:
①页面大小为1K;
②用户内存容量为4页到32页;
③用户虚存容量为32K。
在用户虚存中,按每页存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:
第0条~第9条指令为第0页(对应虚存地址为[0,9]);
第10条~第19条指令为第1页(对应虚存地址为[10,19]);
… … …
第310条~第319条指令为第31页(对应虚存地址为[310,319])。
按以上方式,用户指令可组成32页。
(3)计算并输出下述各种算法在不同内存容量下的命中率(要为以下各种算法定义数据结构):
①先进先出的算法(FIFO);
②最近最少使用算法(LRU);
③最近最不经常使用算法(NUR/NRU/CLOCK)。
命中率=1-页面失效次数/页地址流长度
在本设计中,页地址流长度为320,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。
(4)关于随机数产生办法,Linux/UNIX系统提供函数srand()和rand(),分别进行初始化和产生随机数。例如:srand()语句可初始化一个随机数:
a[0]=10rand()/32767319+1,
a[1]=10rand()/32767a[0];
… … …
语句可用来产生a[0]、a[1]、…中的随机数。
在分页系统中,系统允许将进程的各个页离散地存储在内存的任一物理块中,为保证进程仍然能够正确地运行,即能在内存中找到每个页面所对应的物理块,系统又为每个进程建立一张页面映像表,简称页表。在进程地址空间内所有页,依次在页表中有一页表项,其中记录了相应页在内存中对应的物理块号,见下图。
一、总体设计
1.设计思路
(1)通过随机数产生一个指令序列,共320条指令。
(2)将指令序列变换成为页地址流。
(3)计算并输出下述各种算法在不同内存容量下的命中率。
2.设计流程图
二、详细设计
1.数据结构
(1)页面信息:其中pn为页号,pfn为该页对应的物理块号,counter是NRU算法中的访问位,time是LRU算法中的访问时间段。
typedef struct pl_type
{
int pn;
int pfn;
int counter;
int time;
}pl_type;
(2)页表项信息:其中pn为页号,pfn为pn页对应的物理块号。
typedef struct pt_struct
{
int pn;
int pfn;
}pt_type;
2.变量定义
(1)pl_type pl[total_vp];
该数组为存储页面信息的数组,按每页存放10条指令排列虚存地址形成的一个页面。
(2)pt_type pt[total_vp];
该数组为存储页面信息的数组,每个空间里存一个页表项。
(3)int diseffect;
该变量记录页面置换算法中页面访问未命中的次数。
(4)int a[total_instruction];
存放通过随机数产生的320条指令序列。
(5)int page[total_instruction];
将依次执行的页号存入该数组中。
(6)int offset[total_instruction];
该数组存放的数据为每页的页内地址偏移量。
3.函数定义
(1)void initialize():初始化函数,给每个相关的页面赋值。
(2)void FIFO():计算使用FIFO算法时的命中率。
(3)void LRU():计算使用LRU算法时的命中率。
(4)void NRU():计算使用NRU算法时的命中率。
三、算法分析
1.FIFO算法
先进先出算法,该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程已调入内存的页面按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。
2.LRU算法
最久没有使用算法。该算法是根据页面调入内存后的使用情况做出决策的。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间time。当需淘汰一个页面时,选择现有页面中time值最大的,即最近最久未使用的页面予以淘汰。
3.NRU算法
NRU算法又称Clock置换算法,当利用该算法时,只需为每页设置一个访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列。当某页被访问时,该访问位被置1.置换算法在选择一页淘汰时,只需检查页的访问位。如果是0,就选择该页换出;若为1,则重新将它置0,暂不换出,给予该页第二次驻留内存的机会,再按照FIFO算法检查下一个页面。当检查到队列中的最后一个页面时,若其他访问位仍是1,则再返回到队首去检查第一个页面。
三、测试数据及结果
1.测试数据
为了检测算法的准确性,本次测试的数据选取了《计算机操作系统》中的案例的数据,通过输入数据的运行得出了案例中应出现的结果,从而保证了该算法的正确性。其中FIFO算法的测试结果如图3.2,LRU算法的测试结果如图3.4。
图3.1 教材FIFO算法测试结果图
图3.2 程序FIFO算法结果测试图
图3.3 教材LRU算法测试结果图
图3.4 程序LRU算法结果测试图
2.运行结果
利用Vmare虚拟机的命令,vi进入文件,然后编写代码,运行结果如图:
结论
从多次运算结果总结,在内存页面数较少(4~5页面)时,3种算法的命中率差别不大,都是50%左右。在内存页面为7~25个页面之间时,3种算法的访问命中率大致在52%至87%之间变化。在内存页面为25~32个页面时,由于用户进程的所有指令基本上都已装入内存,从而命中率已较大。从而算法之间的差别不大。
通过比较上述3种算法,得出NRU算法的命中率最高,LRU算法次之,再就是FIF0算法的结论。
代码及报告获取
方式一:点击蓝字资源地址
方式二:联系768165925(qq或微信同号,不收费)