实验八、页面置换模拟程序设计
一、实验目的
- 通过软件模拟页面置换过程,加深对请求页式存储管理实现原理的理解
- 理解和掌握OPT、FIFO和LRU三种页面置换算法,深入分析三者之间的优缺点
二、实验环境
- 硬件环境:计算机一台,局域网环境;
- 软件环境:Linux Ubuntu 操作系统,gcc 编译器;
三、实验内容和步骤
-
重要数据结构
- 页表数据结构
1
2
3
4
5
6
7typedef struct {
int vmn;
int pmn;
int exist;
int time;
} vpage_item;
vpage_item page_table[VM_PAGE];- 页表是虚地址向物理地址转换的依据,包含虚页号所对应的实页号,是否在物理内存中。
- 页表中增加了一个time项,用于替换算法选择淘汰页面,在不同的替换算法中,time含义不一样。
- 在LRU算法中,time为最近访问的时间。该虚页每访问一次,time置为当前访问时刻,淘汰页面时,淘汰time值最小的,即最久没有被使用的。
- 在FIFO算法中,time为该虚页进入内存的时间。只有当该虚页从外存进入内存时,才置该标志。淘汰页面时,淘汰time值最小的,即最早进入内存的虚页。
- 在OPT算法中,time没有任何意义。
- 物理页位图数据结构
1
vpage_item *ppage_bitmap[PM_PAGE];
物理页位图是用于记录物理页是否被使用,用于物理页内存的分配。正常情况下是一个数组,元素值为0时,代表相应物理页没有装入任何虚页,值为1时,代表该物理页装入虚页。但为方便替换算法检索要替换出去的虚页,数组的每个元素值为当前放在该物理页的页表项的指针。若值为NULL,则表示该物理页没有被占用,当值不为NULL时,表示正在占用该物理页的虚页。
- 指令相关数据结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20//每条指令信息
typedef struct {
int num;
int vpage;
int offset;
int inflow;
} instr_item;
//指令数组
instr_item instr_array[TOTAL_INSTR];
//指令流数据结构
struct instr_flow {
instr_item *instr;
struct instr_flow *next;
};
//指令流头数据结构
struct instr_flow_head {
int num;
struct instr_flow *next;
};
struct instr_flow_head iflow_head;每条指令包括指令号、该指令所属虚页及页内偏移(这两项可以根据指令号计算出来,增加这两项是为了方便编程)。inflow 是一个辅助项,用于构建指令流。
本题要求,按照规则生成的指令流中,应包含所有的共320条指令。但每次随机生成的指令号,可能已在指令流中,因此最终指令流中的指令数可能远远超过320条指令。
设置 inflow 的目的是为了便于统计是否320条指令均已加入到指令流中。在该条指令加入到指令流中时,如果 inflow 为0,表示该指令尚未在指令流中,则统计数加1;如果 inflow 为1,表示该指令已经加入过指令流,该指令虽然再次加入指令流,但统计数不增加。这样,当统计计数为320时,表示所有的指令均已加入到指令流中。
struct instr_flow
为指令流数据结构,struct instr_flow_head
始终指向指令流的头,其中 num 用于指令流中指令数量计数,用于计算缺页率。 -
主程序
- 指令流生成流程
指令流的生成按照实验要求生成,其算法流程如下图所示:
- 物理内存分配流程
物理内存分配时,需要根据当前置换算法选择淘汰页面。其算法流程下图所示:
- 运行流程
-
三种置换算法
- OPT算法:
在当前指令的后续指令流中,寻找已在内存中的虚页,哪个最远才被使用,反过来,如果先找到最近三个(物理页面总数为4)也在内存中的虚页,则剩下的那个虚页肯定就是最远才被使用的虚页,该虚页被淘汰,其物理内存分配给当前指令所在的虚页。 - FIFO算法:
在已在物理内存中的虚页中,寻找 time 最小的虚页(最早进入物理内存的虚页),该虚页即是被淘汰的虚页。 - LRU算法:
思想同 FIFO 算法,但 time 最小的虚页含义是最久没有被使用的虚页。
在这三种置换算法中,OPT的算法稍微复杂一些,下图给了该的程序流程图:
- OPT算法:
-
实验代码
1 |
|
四、实验总结
-
分析实验结果产生的原因,总结从实验观察到的结果。分析三种置换算法的缺页率的差异。
答:FIFO 算法每次先替换最先进入的页面,LRU 算法每次先替换最近最久未使用的页面,OPT 算法每次先替换将来最长时间内不再被访问的页面。通过计算得到,FIFO 算法缺页13次,置换9次。LRU 算法缺页10次,置换6次。OPT 算法缺页7次,置换3次。 -
结合操作系统课程中讲授的原理,写出本次实验的心得体会。
答:FIFO 算法、LRU 算法和 OPT 算法是操作系统中用来管理内存的置换算法,用于决定哪些页应该被从内存中交换出去,以便为正在运行的进程腾出空间。 其中:- FIFO 算法是选择在内存中驻留时间最久的页面予以替换,实现简单,要求的硬件支持较少。但是,它所依据的条件是各个页面调入内存的时间,而页面调入内存的先后并不能反映页面的使用情况。
- LRU 算法是选择过去最长时间未被访问的页面予以替换,利用“最近的过去”代替“最近的将来”,以此模拟 Optimal 算法,是实际应用中缺页率最低的算法。 但是,其实际应用时要求较多的硬件支持,因而多采用近似算法。
- OPT 算法是选择永不使用或在未来最长时间内不再被访问的页面予以替换。它可保证获得最低的缺页率,并且可以用来评价其他算法。但是,目前该算法是无法实现的。