Skip to content

408

操作系统

OS-03-09 页面置换算法(FIFO/LRU/CLOCK/OPT)


一、定位信息

  • 所属圈层:核心层
  • 前置知识回顾:理解请求页式管理和缺页中断的基本流程,知道页面置换是在内存无空闲页框时选择一个页面换出。了解驻留集和页框分配策略的基本概念。
  • 知识网络位置:本单元是虚拟内存实现的核心算法,直接决定系统性能。页面置换算法与抖动(OS-03-10)密切相关——好的置换算法能降低缺页率,减少抖动风险。
  • 考点热度等级H级(高频重点)——页面置换算法是408操作系统部分最高频的考点之一,几乎每年都有计算题。

二、知识点讲解

2.1 最佳置换算法(OPT)

OPT(Optimal):选择未来最长时间内不会被访问的页面作为牺牲页。

  • 理论上最优,缺页率最低
  • 无法实现:因为无法预知未来的页面访问序列
  • 用途:作为评价其他算法的标杆(Benchmark)

2.2 先进先出算法(FIFO)

FIFO(First In, First Out):选择最早进入内存的页面作为牺牲页。

  • 实现简单:用队列维护页面进入顺序
  • Belady异常:增加物理页框数反而可能导致缺页率上升(反直觉现象)
  • 性能较差:最早进入的页面可能是仍然活跃的页面

2.3 最近最久未使用算法(LRU)

LRU(Least Recently Used):选择最近最长时间未被访问的页面作为牺牲页。

  • 基于时间局部性原理:最近不被访问的页面,未来也不太可能被访问
  • 无Belady异常
  • 性能接近OPT
  • 实现开销较大:需要记录每个页面的最后访问时间

实现方式:

  • 计数器法:每个页表项维护一个时间戳,每次访问时更新。置换时选择时间戳最小的页面。
  • 栈法:维护一个栈,每次访问页面时将其移到栈顶。栈底的页面就是最近最久未使用的。

2.4 时钟置换算法(CLOCK)

CLOCK(Clock),也称最近未使用算法(NRU, Not Recently Used):是LRU的近似算法,实现更简单。

简单CLOCK

  • 每个页表项有一个访问位(A)
  • 所有页面组成一个循环链表,有一个指针(时钟指针)指向下一个候选页面
  • 置换时:指针扫描,若A=0,选中该页;若A=1,将A置为0,指针前移
  • 直到找到A=0的页面

改进型CLOCK(考虑修改位):

  • 优先选择(A=0, M=0)的页面(最近未访问且未修改)
  • 其次选择(A=0, M=1)的页面(最近未访问但已修改)
  • 再次选择(A=1, M=0)的页面(最近访问但未修改)
  • 最后选择(A=1, M=1)的页面(最近访问且已修改)

三、记忆与理解辅助

1. 类比记忆

  • OPT:算命先生,知道未来,选最不用的淘汰(但现实中不存在)
  • FIFO:排队买票,先来的先走(不管还用不用)
  • LRU:看谁最久没来上班,淘汰谁(合理但记录成本高)
  • CLOCK:转盘扫描,标记了就清零继续转,没标记的淘汰(LRU的简化版)

2. 口诀:"OPT看未来,FIFO看先来;LRU看最近,CLOCK转圈找;FIFO有Belady,LRU没有异常。"

3. 四种算法全面对比(★高频考点)

对比项OPTFIFOLRUCLOCK
选择依据未来最久不用最早进入最近最久未用访问位=0
可否实现不可可(开销大)可(开销小)
Belady异常
性能最优较差接近OPT接近LRU
实现复杂度-
硬件支持计数器/栈访问位

4. Belady异常:只在FIFO算法中出现。增加页框数后,缺页次数反而增加。这是一个重要的反直觉现象,考试中常以判断题形式出现。


四、例题与精解

例题1(基础巩固)

题目:某系统有 33 个物理页框,页面访问序列为:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,17, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1。分别用FIFO和LRU算法计算缺页次数。

命题意图:考查FIFO和LRU算法的手工模拟过程。

精解

1. 审题分析:3个页框,20次页面访问,需要逐一模拟两个算法的执行过程。

2. 解题思路:维护当前在内存中的页面集合,每次访问时判断是否缺页,缺页时按规则选择淘汰页面。

3. 完整步骤

FIFO算法(淘汰最早进入的页面):

访问页面内存状态是否缺页
17{7}
20{7,0}
31{7,0,1}
42{2,0,1}(淘汰7)
50{2,0,1}
63{2,3,1}(淘汰0)
70{2,3,0}(淘汰1)
84{4,3,0}(淘汰2)
92{4,2,0}(淘汰3)
103{4,2,3}(淘汰0)
110{0,2,3}(淘汰4)
123{0,2,3}
132{0,2,3}
141{0,1,3}(淘汰2)
152{0,1,2}(淘汰3)
160{0,1,2}
171{0,1,2}
187{7,1,2}(淘汰0)
190{7,0,2}(淘汰1)
201{7,0,1}(淘汰2)

FIFO缺页次数 = 15次

LRU算法(淘汰最近最久未使用的页面):

访问页面内存状态(最近→最久)是否缺页
17{7}
20{0,7}
31{1,0,7}
42{2,1,0}(淘汰7)
50{0,2,1}
63{3,0,2}(淘汰1)
70{0,3,2}
84{4,0,3}(淘汰2)
92{2,4,0}(淘汰3)
103{3,2,4}(淘汰0)
110{0,3,2}(淘汰4)
123{3,0,2}
132{2,3,0}
141{1,2,3}(淘汰0)
152{2,1,3}
160{0,2,1}(淘汰3)
171{1,0,2}
187{7,1,0}(淘汰2)
190{0,7,1}
201{1,0,7}

LRU缺页次数 = 12次

4. 方法反思:LRU缺页次数(12次)少于FIFO(15次),说明LRU性能更好。手工模拟时,LRU需要注意"最近最久未使用"的判断——被淘汰的页面是最后一次被访问距今最久的页面。可以用"时间戳法"辅助判断。

例题2(中等提升)

题目:某系统有 33 个物理页框,页面访问序列为:1,2,3,4,1,2,5,1,2,3,4,51, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5。分别用FIFO和LRU算法计算缺页次数,并验证FIFO是否存在Belady异常(比较页框数为4时的情况)。

命题意图:考查FIFO的Belady异常现象。

精解

1. 审题分析:需要分别用3个和4个页框运行FIFO算法,比较缺页次数。

2. 解题思路:模拟FIFO在3和4个页框下的执行过程。

3. 完整步骤

FIFO,3个页框

  • 1→缺页{1},2→缺页{1,2},3→缺页{1,2,3},4→缺页{4,2,3}淘汰1
  • 1→缺页{4,1,3}淘汰2,2→缺页{4,1,2}淘汰3,5→缺页{5,1,2}淘汰4
  • 1→不缺{5,1,2},2→不缺{5,1,2},3→缺页{5,3,2}淘汰1
  • 4→缺页{5,3,4}淘汰2,5→不缺{5,3,4}
  • 缺页次数 = 9次

FIFO,4个页框

  • 1→缺页{1},2→缺页{1,2},3→缺页{1,2,3},4→缺页{1,2,3,4}
  • 1→不缺{1,2,3,4},2→不缺{1,2,3,4},5→缺页{5,2,3,4}淘汰1
  • 1→缺页{5,1,3,4}淘汰2,2→缺页{5,1,2,4}淘汰3,3→缺页{5,1,2,3}淘汰4
  • 4→缺页{4,1,2,3}淘汰5,5→缺页{4,5,2,3}淘汰1
  • 缺页次数 = 10次

Belady异常验证:3个页框缺页9次,4个页框缺页10次。增加页框数后缺页次数反而增加,存在Belady异常

LRU,3个页框(供对比):

  • 1→缺页{1},2→缺页{1,2},3→缺页{1,2,3},4→缺页{4,2,3}淘汰1
  • 1→缺页{4,1,3}淘汰2,2→缺页{4,1,2}淘汰3,5→缺页{5,1,2}淘汰4
  • 1→不缺{5,1,2},2→不缺{5,1,2},3→缺页{3,1,2}淘汰5
  • 4→缺页{3,4,2}淘汰1,5→缺页{3,4,5}淘汰2
  • 缺页次数 = 10次

4. 方法反思:Belady异常是FIFO算法的特有现象,LRU和OPT都不会出现。这是因为FIFO的淘汰依据是"进入时间"而非"使用情况",增加页框可能改变页面的进入顺序,导致淘汰决策变差。这也是为什么FIFO在实际系统中很少单独使用。


五、考情分析

  • 考查频次:页面置换算法在近5年真题中出现频率极高,几乎每年至少1道题。
  • 常见题型:选择题(判断缺页次数、算法比较)、综合题(手工模拟置换过程、计算缺页率)。
  • 分值占比:选择题2分,综合题5-10分。
  • 命题趋势:近年来倾向于给出特定页面访问序列,要求用多种算法计算缺页次数并比较。CLOCK算法(改进型)的考查频率增加。基于大纲与命题规律推测

六、易错点提醒

  1. 错误表现:LRU算法中,将"最久未使用"理解为"进入内存最久"。 错误原因:混淆了LRU和FIFO的淘汰依据。 正确理解/做法:LRU淘汰的是"最后一次被访问距今最久"的页面,不是"最早进入内存"的页面。一个页面可能很早就进入内存,但一直在被访问,LRU不会淘汰它。

  2. 错误表现:CLOCK算法中,访问位被置为1后就一直保持不变。 错误原因:不理解CLOCK算法的"扫描-清零"机制。 正确理解/做法:CLOCK算法中,扫描到A=1的页面时,将其A置为0,然后继续扫描。这意味着页面被"第二次扫描"时就会被选中。这是一种"给页面第二次机会"的机制。

  3. 错误表现:认为增加物理页框数一定能减少缺页次数。 错误原因:不知道Belady异常的存在。 正确理解/做法:对于OPT和LRU算法,增加页框数一定不会增加缺页次数。但FIFO算法存在Belady异常,增加页框数反而可能增加缺页次数。

  4. 错误表现:改进型CLOCK算法中,扫描顺序混乱。 错误原因:对优先级规则记忆不清。 正确理解/做法:优先级顺序为 (0,0) → (0,1) → (1,0) → (1,1)。先找"没访问没修改"的,最后找"有访问有修改"的。第一轮扫描不清访问位,第二轮才清。


七、来源标注

  • 依据2026考研统考408大纲
  • 依据《操作系统概念》(Operating System Concepts, Silberschatz)第10章
  • 依据汤小丹《计算机操作系统》第4版第3章

考研全科复习资料 - 基于2026考研统考大纲