FIFO 页面置换
分配3个页框(frame),页面引用序列为 A B C A B D A D B C B
本实例导致7次缺页
MIN 页面置换
本实例导致5次缺页
但是因为需要未来的数据,在实际中MIN页面置换无法实现
LRU 页面置换(Least Recently Used)
用过去的数据预测未来:选最近最少使用的页淘汰
本实例导致5次缺页
准确实现 - 时间戳
每页维护一个时间戳
每次地址访问都需要修改时间戳,需要维护一个全局时钟、找到最小值……实现代价过大!
准确实现 - 页码栈
每次地址访问都需要修改栈(约10次栈指针)……实现代码仍然较大
近似实现 - Clock算法(SCR算法)
将时间计数变为是和否(淘汰最近没有使用的页),每个页加一个引用位(reference bit):
- 每次访问一页时,硬件自动设置该位
- 选择淘汰页:扫描该位,是1时清0,并继续扫描;是0时淘汰该页
但是由于有局部性,缺页一般会很少:
hand scan一圈后淘汰当前页,将调入页插入hand位置,hand前移一位,此时相当于退化为FIFO
原因是记录了太长的历史信息,因此应该再加一个移动速度较快的扫描指针定时清除R位
给进程分配多少页框(帧frame)
分配的多,浪费内存;分配太少会因频繁换页使CPU利用率急剧下降
称这一现象为颠簸(抖动,thrashing)。
可以通过工作集等算法解决求出局部内存大小或者通过多次调整找到合适大小