2204-19-操作系统页式内存管理的页面置换算法辨析

147 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

本文是我在掘金平台发表于2022年4月份的,从发表最初累计第19篇博客,希望大家关注我,我将会持续在后端和大数据等领域进行书写更多的文章。

摘要

本文的标题是《2204-19-操作系统页式内存管理的页面置换算法辨析》,从原理层面介绍了操作系统中的基于页式内存管理的页面置换算法。本文讲解了OPT,LRU,LFU,NRU等算法的原理。

OPT

理想 (最佳、最优)置换算法( OPT, optimal,最优的)

设计思想:置换以后不再需要的或最远的将来才会用到的页面,它是从马后炮的思维去考虑和分析哪一个页面应该被置换。

仅供评价,benchmark, 永远无法实现。

LRU

最近最久未使用(Least Recently Used,LRU)算法。

它假设如下:现在不怎么使用的页面,以后可能也不会用到,所以可以被优先替换。理论应该是时间局部性。

LRU性能较好,但需要寄存器和栈的硬件支持,LRU是堆栈类的算法,理论上可以证明,堆栈类算法不可能出现Belady异常。

实现的核心思路是,淘汰上一次使用离当前最久远的页。

软件代码具体实现可以使用哈希链表法,哪一页每次被使用一次,就把它放到最前面,使其最不可能被淘汰,空间不足需要淘汰的时候,找到最末尾的进行淘汰。

硬件算法有以下两个【参考】:

首先,如果硬件有一个64位的计数器,每条指令执行完后自动加1。在每个页表项里添加一个域,用于存放计数器的值。进程运行,每次访问页面的时候,都把计数器的值保存在被访问页面的页表项中。一旦发生缺页,操作系统检查页表中所有的计数器的值以找出最小的一个,那这一页就是最久未使用的页面,调出即可。

其次,另外一个矩阵算法:在一个有n个页框的机器中,LRU硬件可以维持一个n*n的矩阵,开始时所有位都是0。访问到第k页时,硬件把k行的位全设为1,之后再把k列的位置设为0。容易证明,在任意时候,二进制值最小的行即为最久未使用的页面,当调换页面时,将其调出(涉及矩阵乘法,大佬自行证明,菜鸡记住就可以了)。

以上的两种算法,无疑都要比纯粹的软件算法方便且快捷。每次页面访问之后的操作——保存计数器值和设置k行k列的值,时间复杂度都是O(1)量级。

LFU

最不常用(LFU,Least Frequently Used)算法,基于如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小的思路。

这种算法选择最近时期使用次数最少的页作为淘汰页。为每个页面配置一个计数器,一旦某页被访问,则将其计数器的值加1,在需要选择一页置换时,则将选择其计数器值最小的页面,即内存中访问次数最少的页面进行淘汰。

它需要设置一个记录所有页使用情况的数据结构,并且随着使用的变化而自动更新使用情况,软件实现的话优先队列是最适合的。

这种算法可能存在的问题是:有些也在进程开始时被访问的次数很多,但以后这些页可能不再被访问,这样的页不该长时间停留在内存中。解决这个问题的方法之一是定期的将计时器的值右移,以形成指数衰减的平均使用次数。

NRU

Not Recently Used,选择在最近一段时间内未使用过的一页并置换

实现:设置页表表项的两位 访问位( R), 修改位( M) 启动一个进程时, R、 M位置0

R位被定期清零(复位),比如一个指定的时间窗口。

发生缺页中断时,操作系统检查 R, M: 第0类:无访问,无修改 第1类:无访问,有修改 第2类:有访问,无修改 第3类:有访问,有修改

没有访问的肯定优先被置换,没有修改的置换贷成本比修改过的置换成本高,因此也优先置换。

算法思想: 随机编号最小的非空类(依次是0,1,2,3类)中选择一页置换

(摘录自陈向群老师ppt)

它的思想也是利用基于时间的滑动窗口,对要被淘汰的也进行打标签,更加细致的控制淘汰的页,是对LFU的升级。

基于CLOCK算法的NRU 实现

NRU的时钟算法实现

1.从指针的当前位置开始,扫描页面驻留集,选择遇到的第一个页框( r=0; m=0)用于置换(本扫描过程中,对访问位不做任何修改)

2.如果第1步失败,则重新扫描,选择第一个( r=0; m=1)的页框(本次扫描过程中,对每个跳过的页框,将其访问位设置成0),注意,如果用户设置了保存按钮等,需要将修改了的页表写回硬盘

3.如果第2步失败,指针将回到它的最初位置,并且集合中所有页框的访问位均为0。

重复第1步,并且,如果有必要,重复第2步。这样将可以找到供置换的页框

可以理解,这个算法是一种懒加载的算法。

其他

  • FIFO 和 CLOCK 算法的异同

    其实一个是普通队列,另一个循环队列,穿了个马甲而已。

  • 第二次机会置换算法(SCR)

    SCR-Second Chance,按照先进先出算法选择某一页面,检查其访问位R,如果为0,则置换该页;如果为1,则给第二次机会,并将访问位置0。

参考