设计和实现最佳置换算法、先进先出置换算法、最近最久未使用置换算法、页面缓冲置换算法;通过页面访问序列随机发生器实现对上述算法的测试及性能比较。
(1) 请求分页虚拟内存管理
请求分页虚拟内存管理是建立在基本分页基础上的,为了能支持虚拟存储器功能,而增加了请求调页功能和置换功能。
(2) 工作集
多数程序都显示出高度的局部性,也就是说,在一个时间段内,一组页面被反复引用。这组被反复引用的页面随着时间的推移,其成员也会发生变化。有时这种变化是剧烈的,有时这种变化则是渐进的。我们把这组页面的集合称为工作集
(3) 缺页率
缺页中断次数/总的页面访问次数
(1)模拟的虚拟内存的地址为16位,页面大小为1K,模拟的物理内存有32K。
(2)表用整数数组或结构数组来表示
(3) 页面访问序列串是一个整数序列,整数的取值范围为0到N - 1。页面访问序列串中的每个元素p表示对页面p的一次访问
(4) 符合局部访问特性的随机生成算法
(1) 最佳置换算法
最佳置换算法的主要思想是,在发生页面替换时,被替换的对象应该满足,在以后的页面访问中,该对象不会再次被访问或者较晚被访问。是一种理想化算法,具有最好性能(对于固定分配页面方式,本法可保证获得最低的缺页率),但实际上却难于实现,故主要用于算法评价参照。
(2) 先进先出置换算法
先进先出置换算法的主要思想是,在发生页面替换时,被替换的对象应该是最早进入内存的。
(3) 最近最久未使用置换算法
最近最久未使用置换算法的主要思想是,在发生页面替换时,被替换的页面应该满足,在之前的访问队列中,该对象截止目前未被访问的时间最长。
(4) 改进型Clock置换算法
改进型Clock置换算法的主要思想是,在每次页面替换时,总是尽可能地先替换掉既未被访问又未被修改的页面。
(5) 页面缓冲算法
设立空闲页面链表和已修改页面链表采用可变分配和基于先进先出的局部置换策略,并规定被淘汰页先不做物理移动,而是依据是否修改分别挂到空闲页面链表或已修改页面链表的末尾,空闲页面链表同时用于物理块分配,当已修改页面链表达到一定长度如Z个页面时,一起将所有已修改页面写回磁盘,故可显著减少磁盘I/O操作次数。
(1) 全局共享函数
void InitMemo();//初始化存储空间,主要是设置分配空间的大小
void Generate();//生成访问序列
bool IsInMemo (int n); //指定页号是否已经在内存中
(2) 最佳置换算法
void Optimal (int n); //访问一个页面,执行一次最佳置换算法
void MainOptimal();//算法实现函数
(3) 先进先出置换算法
void InitQueue (pQueue q);//初始化队列
void Qpush (pQueue q, int num);//队列中加入新的页面结点
void Qpop (pQueue q);//将页面移出内存
void Qdestroy (pQueue q);//销毁队列
bool FindQueue (pQueue q, int num);//查找页面是否已经调入内存
void MainFIFO();//每访问一个页面,执行一次算法
void FIFO (pQueue q, int num);//先进先出置换算法实现函数
(4) 最近最久未使用置换算法
void LRU (int n);//LRU算法实现函数
void MainLRU();//每访问一个新的页面,执行一次算法
(5) 改进型clock置换算法
void UpdatedClock (int n);//改进型clock算法实现函数
void MainClock();//每访问一个新的页面,执行一次算法
(6) 页面缓冲算法
bool IsInPNodes (int n); //页面是否已经在链表中
void AddLink (int data, int type);//页面添加到已修改页面链表和空闲链表上
void FreeIdle();//将空闲链表上的所有页面送出内存
void FreeMod();//将已修改页面链表上所有的链表送出内存
void PBA (int n);//PBA算法实现函数
void MainPBA();//每访问一个新的页面,执行一次算法
(一)某次的程序运行结果如下
(1)最佳置换算法
(2)先进先出算法
(3)最近最久未使用置换算法
(4)改进型Clock置换算法
(5)页面缓冲置换算法
(二)多次运行程序,生成不同的访问序列,记录每种算法的缺页情况,最终整理如下
(1)测试序列1
置换算法 | 缺页数 | 缺页率 |
---|---|---|
最佳置换算法 | 17 | 0.53125 |
先进先出置换算法 | 21 | 0.65625 |
最近最久未使用算法 | 22 | 0.6875 |
改进型clock置换算法 | 21 | 0.65625 |
页面缓冲置换算法 | 15 | 0.46875 |
(2)测试序列2
置换算法 | 缺页数 | 缺页率 |
---|---|---|
最佳置换算法 | 14 | 0.4375 |
先进先出置换算法 | 19 | 0.59375 |
最近最久未使用算法 | 17 | 0.53125 |
改进型clock置换算法 | 19 | 0.59375 |
页面缓冲置换算法 | 18 | 0.5625 |
(3)测试序列3
置换算法 | 缺页数 | 缺页率 |
---|---|---|
最佳置换算法 | 14 | 0.4375 |
先进先出置换算法 | 17 | 0.53125 |
最近最久未使用算法 | 15 | 0.46875 |
改进型clock置换算法 | 18 | 0.5625 |
页面缓冲置换算法 | 16 | 0.5 |
注:访问序列长度为32,默认初始分配给每种算法的内存空间块数为3。
(三)访问序列长度为32,默认初始分配给每种算法的内存空间块数为5,运行结果如下
置换算法 | 缺页数 | 缺页率 |
---|---|---|
最佳置换算法 | 8 | 0.25 |
先进先出置换算法 | 10 | 0.3125 |
最近最久未使用算法 | 11 | 0.34375 |
改进型clock置换算法 | 11 | 0.34375 |
页面缓冲置换算法 | 9 | 0.28125 |
访问序列长度为32,默认初始分配给每种算法的内存空间块数为8,运行结果如下
置换算法 | 缺页数 | 缺页率 |
---|---|---|
最佳置换算法 | 2 | 0.0625 |
先进先出置换算法 | 6 | 0.1875 |
最近最久未使用算法 | 4 | 0.125 |
改进型clock置换算法 | 4 | 0.125 |
页面缓冲置换算法 | 9 | 0.28125 |
根据实验结果可以看出,对同一种算法,对于不同的访问序列,其缺页率是不同,会有所变化。总的来看,最佳置换算法的缺页率是最低的,然后页面缓冲算法的缺页率要低于其他置换算法。改进型clock算法稍微好于先进先出算法和最近最久未使用算法。先进先出算法和最近最久未使用算法性能相近。
同时对比不同内存块数下的程序运行结果能够看出,算法的缺页率与分配的内存块数有关系,分配的内存块数越多,缺页率越低。