页面置换算法(Page Replacement Algorithm)是虚拟内存管理中决定当物理内存已满时,应该淘汰哪一页的策略。它的目标是尽量减少缺页中断(Page Fault)的次数。
下面是常见的页面置换算法。
FIFO(First In First Out,先进先出)
淘汰最早进入内存的页面(就像排队先到先出),用队列记录页面进入的顺序。
实现简单;但可能出现 Belady 异常(增加内存页数,缺页次数反而增加)。
LRU(Least Recently Used,最近最少使用)
淘汰最长时间没有被访问的页面,可用栈、链表或时间戳记录页面的访问时间。
性能较好,接近最优算法;但实现复杂,维护访问记录有开销。
OPT(Optimal,最佳置换算法)
淘汰未来最长时间不会被访问的页面。
缺页次数最少(理论最优);但需要提前直到页面访问序列,实际系统中无法直接实现,只能用于理论分析。
Clock(时钟算法)
LRU(最近最少使用算法)的近似实现,用一个环形结构让查找和淘汰的过程更快。
物理页框被组织成一个环形链表(就像时钟的刻度);每个页框都有一个访问位,来记录该页最近是否被访问,还有一个指针(就像时钟的秒针),指向当前候选淘汰的页面。访问页面时,操作系统会将该页面的访问位置为 1 (表示最近访问过)。需要淘汰页面时,检查指针指向的页面,如果访问位是 0 ,说明最近没被访问过,淘汰该页;如果访问位为 1,说明最近访问过页面,把访问位置为 0,并将指针移动到下一个页面,继续检查。指针一直循环往前走(像秒针一样),直到找到一个访问位为 0 的页面进行置换。
比 LRU 实现更高效,不需要精确记录访问时间;扫描和置换过程简单;内存开销小。但不如真正的 LRU 精确,如果所有页面访问位都被频繁置 1,淘汰时可能需要扫描很多次。
LFU(Least Frequently Used,最少使用次数)
淘汰访问次数最少的页面。
对经常访问的页面有保护作用,但可能会保留历史上访问多但最近不访问的页面,导致性能下降。