页面置换:FIFO(先进先出)

FIFO 的规则、手算方法与 Belady 异常(页框更多反而更差)。

#resource / operating-system #type / concept #status / growing

[!info] related notes 操作系统 MOC 页面置换算法(OPT/FIFO/LRU/Clock)

页面置换:FIFO(先进先出)

一句话

缺页且页框已满时,淘汰“最早进入内存”的那一页。

手算方法(用队列思维)

  • 维护一个队列,队头是最早进入的页
  • 命中:队列顺序不变
  • 缺页且未满:入队
  • 缺页且已满:出队(淘汰队头),再把新页入队

常考点

  • FIFO 实现最简单
  • 可能出现 Belady 异常:页框数增加,缺页次数反而增加

高频陷阱

  • FIFO 不看“最近是否被访问”,只看“进入内存的先后”
  • Belady 异常不是所有算法都有,典型出现在 FIFO

Belady 异常

**Belady 异常(Bélády’s Anomaly)**是计算机操作系统内存管理中(特别是页面置换算法)出现的一个反直觉现象。

简单来说,通常情况下,当我们给一个进程分配更多的物理内存(即增加页面帧数 Page Frames)时,该进程发生“缺页中断”(Page Fault,即需要的数据不在内存中,必须从硬盘调取)的次数应该减少,或者至少保持不变。但 Belady 异常是指:在某些特定的页面访问序列下,分配的内存增加了,缺页中断的次数反而也增加了。

为什么会发生 Belady 异常?

这个现象最典型地出现在 FIFO(先进先出,First-In, First-Out) 页面置换算法中。

  • 算法的盲目性: FIFO 算法只关注页面进入内存的先后顺序,总是无脑淘汰最早进入内存的那个页面,而完全不考虑这个页面最近是否被频繁访问过。
  • 空间增加的负面效应: 当内存容量增加时,原本早就该被淘汰的页面在内存里多停留了一段时间。这就有可能导致一种尴尬的情况:它刚好在下一次急需被访问的前一刻,变成了队列里“最老”的页面而被无情淘汰,从而引发了本不该发生的缺页中断。

哪些算法可以避免 Belady 异常?

并不是所有页面置换算法都有这个缺陷。具备“栈特性”(Stack Property)的算法就不会出现 Belady 异常,例如:

  • LRU(最近最少使用,Least Recently Used)
  • OPT(最佳页面置换算法,Optimal)
创建于 2026/3/18 更新于 2026/5/27