操作系统实验四:页面置换算法 实验报告

1、实验目的

设计和实现最佳置换算法、先进先出置换算法、最近最久未使用置换算法、页面缓冲置换算法;通过页面访问序列随机发生器实现对上述算法的测试及性能比较。

2、页面置换算法背景知识

(1) 请求分页虚拟内存管理
请求分页虚拟内存管理是建立在基本分页基础上的,为了能支持虚拟存储器功能,而增加了请求调页功能和置换功能。
(2) 工作集
多数程序都显示出高度的局部性,也就是说,在一个时间段内,一组页面被反复引用。这组被反复引用的页面随着时间的推移,其成员也会发生变化。有时这种变化是剧烈的,有时这种变化则是渐进的。我们把这组页面的集合称为工作集
(3) 缺页率
缺页中断次数/总的页面访问次数

3、实验假设

(1)模拟的虚拟内存的地址为16位,页面大小为1K,模拟的物理内存有32K。
(2)表用整数数组或结构数组来表示
(3) 页面访问序列串是一个整数序列,整数的取值范围为0到N - 1。页面访问序列串中的每个元素p表示对页面p的一次访问
(4) 符合局部访问特性的随机生成算法

  • 确定虚拟内存的尺寸N,工作集的起始位置p,工作集中包含的页数e,工作集移动率m(每处理m个页面访问则将起始位置p +1),以及一个范围在0和1之间的值t
  • 生成m个取值范围在p和p + e间的随机数,并记录到页面访问序列串中
  • 生成一个随机数r,0 ≤ r ≤ 1
  • 如果r < t,则为p生成一个新值,否则p = (p + 1) mod N
  • 如果想继续加大页面访问序列串的长度,请返回第2步,否则结束

4、实验算法介绍

(1) 最佳置换算法
最佳置换算法的主要思想是,在发生页面替换时,被替换的对象应该满足,在以后的页面访问中,该对象不会再次被访问或者较晚被访问。是一种理想化算法,具有最好性能(对于固定分配页面方式,本法可保证获得最低的缺页率),但实际上却难于实现,故主要用于算法评价参照。

(2) 先进先出置换算法
先进先出置换算法的主要思想是,在发生页面替换时,被替换的对象应该是最早进入内存的。

(3) 最近最久未使用置换算法
最近最久未使用置换算法的主要思想是,在发生页面替换时,被替换的页面应该满足,在之前的访问队列中,该对象截止目前未被访问的时间最长。

(4) 改进型Clock置换算法
改进型Clock置换算法的主要思想是,在每次页面替换时,总是尽可能地先替换掉既未被访问又未被修改的页面。

(5) 页面缓冲算法
设立空闲页面链表和已修改页面链表采用可变分配和基于先进先出的局部置换策略,并规定被淘汰页先不做物理移动,而是依据是否修改分别挂到空闲页面链表或已修改页面链表的末尾,空闲页面链表同时用于物理块分配,当已修改页面链表达到一定长度如Z个页面时,一起将所有已修改页面写回磁盘,故可显著减少磁盘I/O操作次数。

5、主要函数功能说明

(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();//每访问一个新的页面,执行一次算法

6、程序运行结果

(一)某次的程序运行结果如下
(1)最佳置换算法
操作系统实验四:页面置换算法 实验报告_第1张图片
(2)先进先出算法
操作系统实验四:页面置换算法 实验报告_第2张图片
(3)最近最久未使用置换算法
操作系统实验四:页面置换算法 实验报告_第3张图片
(4)改进型Clock置换算法
操作系统实验四:页面置换算法 实验报告_第4张图片
(5)页面缓冲置换算法
操作系统实验四:页面置换算法 实验报告_第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

7、实验总结

根据实验结果可以看出,对同一种算法,对于不同的访问序列,其缺页率是不同,会有所变化。总的来看,最佳置换算法的缺页率是最低的,然后页面缓冲算法的缺页率要低于其他置换算法。改进型clock算法稍微好于先进先出算法和最近最久未使用算法。先进先出算法和最近最久未使用算法性能相近。

同时对比不同内存块数下的程序运行结果能够看出,算法的缺页率与分配的内存块数有关系,分配的内存块数越多,缺页率越低。

程序代码见GIT链接

你可能感兴趣的:(操作系统实验四:页面置换算法 实验报告)