操作系统_清华大学(向勇、陈渝)-笔记-第六章-页面置换算法
内容
功能:缺页中断+物理帧已满,选择一个页面进行置换。
目标:尽量减少换入换出的次数。
页面锁定:一些页面需要常驻内存,设置一个锁定标志位。
最优页面置换算法
当一个缺页中断发生时,对于保存在内存中的每一个逻辑页面,计算它的下一次访问之前,还需要多长时间,从中选择等待时间最长的那个,作为被置换的页面。
但是下次访问是随机的,这种假设过于理想,这种算法只可以作为一种评价标准,在已有了一系列页面访问记录时才可以得出这种算法的结论。
一个其他算法效果越接近最优页面置换算法,其效果越好。
栗子:

这里要淘汰d出去
先进先出算法
淘汰驻留在内存中时间最久的页面,就是维护一个队列管理页面。
评价:性能较差,调出的页面可能是经常要访问的页面,并且有Belady线性,FIFO很少单独使用。
最久未被使用算法
简称LRU算法,选择最久未被使用的那个页面,并淘汰之。这是对最优页面置换算法的一个近似(使用过去的数据)。
根据程序的局部性原理,推测最近一直被使用的在未来也会被一直使用。
LRU算法有较大开销,其实现可以是:ordered_dict的数据结构,其底层可以由双向链表+hash表实现。
时钟页面置换算法
对LRU的近似,对FIFO的改进。
成立基础:
- 需要用到页表项当中的访问位,当一个页面被装入内存时,把该位初始化为0,然后如果这个页面被访问,则设置为1。这部分由硬件完成。
- 操作系统会对一定时间没有使用过的页的访问位置0。
算法:
把各个页面组织为环形链表,然后把指针指向最老的页面,当发生缺页中断时,考察指针所指向的最老页面,若它的访问位为0,立即淘汰,若访问位为1,则置0,指针向下移动一格,如此循环,直到找到淘汰页面。
栗子:

总的来说,也是希望淘汰最久未被使用的,但是做了一项近似,最后清除的是某个超过一段时间未被使用过的页面。
-----------------update------------------------
听说这个才叫二次机会法?
二次机会
目的是减少写回硬盘的操作。使用一个dirty bit记录当前页面是否有被写过,若页面没有被写过,也就不用再写回硬盘了。
dirty bit也是硬件自动生成的。

-----------------update------------------------
个人评价:
我感觉有点问题,dirty bit再次设置为0后,如何判断是直接释放还是写回?
要是一律都直接写回的话,那最终结果就是说,写过的页面驻留内存的优先级更高一级,相当于带了一个不朽盾/复活甲~,用了一次就没了。那最后其实还是没有减小写回硬盘,因为都要再写回硬盘。
最常不使用法
基本思路:选择替换被访问次数最少的那个页面。
实现:对每个页面设置一个访问计数器。可以维持一个小顶堆来解决。
但是设置一个访问计数器,对硬件成本有要求。
Belady现象(女装现象(划掉),一个科学家名字)
采用FIFO算法时,有时候会出现分配的物理页面数增加,缺页率反而提高的异常现象。
栗子:
分配三个帧

分配四个帧

与之对比的是LRU算法:

却没有Belady现象。
LRU满足栈算法的特点,所以有越多的帧,那么命中率就更高。
但是FIFO算法则不满足栈算法的特点。
LRU、FIFO、Clock的比较
FIFO:只利用了页面进入内存的时间,开销较小。
LRU:利用的是页面最近访问时间,开销很大。
当程序不具备局部性原理时,LRU会退化为FIFO。
Clock:对LRU的近似,利用一个访问位来表示最近访问时间,但不一定能精确追踪的最久未被使用的,只需要一次遍历就可以找到结果,开销介于FIFO和LRU之间。
工作集模型
问题:如何证明程序的局部性原理是成立的?
一个进程正在使用的逻辑页面的集合,称之为工作集,可以用一个二元函数\(W(t, \Delta)\)里表示,其中\(t\)是当前时刻,\(\Delta\)是一个定长的页面访问时间窗口,称之为工作集窗口。函数记录的是当前时间窗口内的所有页面。
栗子:


常驻集:当前时刻,进程实际驻留在内存中的页面集合。工作集是程序的固有属性,而常驻集是与页面置换算法和被分配的内存大小有关。
如果工作集都在内存当中,常驻集==工作集,那么程序运行就很顺利。当分配帧到一定大小后,再分配帧提升就很小。
两个全局置换算法
分配给某个程序的物理帧数目不是固定的。

浙公网安备 33010602011771号