本篇文章简要总结虚拟存储中的页面置换算法,结构组织如下:
- 相关概念
- 局部置换算法
- 全局置换算法
相关概念
设计目标
- 减少页面 swap in/out 次数
- 把未来不在访问或者短期内不在访问的页调出
页面锁定
有些页是不用调出的
- 描述必须常驻内存中的逻辑页
- OS 的关键部分
- 要求响应速度的 code/data
- 页表项中的锁定页(lock bit)
评价方法
- 记录访存的页面轨迹(编号)
- 模拟/记录缺页次数
分类
- 局部置换算法: 仅限当前进程的页
- 全局置换算法: OS管理的所有页
局部置换算法
OPT(最优置换算法)
idea: 未来最长时间不访问的页(理想情况)
implement: 缺页时找到未来最长时间不访问的页,换出
特点
- 无法实现
- 最理想的策略
- 作为其他算法的评测依据
FIFO 先进先出
字面意思
特点:
- 实现简单
- 性能较差
- 容易产生belady 现象
LRU(Least Recently Used algorithm)
idea: 缺页时用最近最少使用的页替换掉它
implement
- 为每个页表增加一个时钟域记录每次访问时间,缺页时换掉时间最小的
- 栈 实现 进来一个新的页,就重新压栈,缺页时仅却出栈顶元素就好,不过当页已在栈中时,仍然耗时很大,具体地,若访问的页在栈顶需要将其摞到栈首.
特点:
- 实现难
- 时间开销大
clock 算法(时钟置换算法)
这是一种近似的LRU 算法,是对 FIFO 和LRU的折中
implement:
Data Structure:
- 在页表项中增加引用位,标记当前这一页是否被引用
- 将页面组织成环形链表
- pointer指向最先调入的页面
Algorithm:
- 访问页,在页表项记录下页面访问情况
- 缺页,从指针指向的页面开始,若遇见引用位为0的页面,就将其换出,并置访问位为1;若引用位为1,将其置1,可以发现这样最终总会找到一个适当的页
增强的clock 算法
将引用位和修改位作为一个序对来考虑,那么会有四种类型
- 00 最近未使用也没有修改,用于置换的最佳页
- 01 最近未使用但是修改过,不是很好,需要将其写回磁盘
- 10 最近使用过,但是未修改,很快可能又被使用
- 11 最近使用过且修改过,不好
这种方法给修改过的页更高的级别,可能需要多找几圈,但是降低了I/O操作
belady 现象
分配的物理页面增加,缺页率反而上升
FIFO : 存在belady现象,这个例子很好找到
LRU:不存在,(多增加页面后,每次换出的页面相同???,PS:个人想法)
clock: 存在,(e.g.: 带填坑)
全局置换算法
就是操作系统考虑当前所有进程页面的分配,将不常用的页交换出去,给其他进程多一点空间,由于进程在生命周期内的内存需求是变化的。
主要有两种,一种是工作集,一种是缺页率
工作集
- 工作集: