Jorgen's blog Jorgen's blog
首页
  • 平台架构
  • 混合式开发记录
  • 推送服务
  • 数据分析
  • 实时调度
  • 架构思想

    • 分布式
  • 编程框架工具

    • 编程语言
    • 框架
    • 开发工具
  • 数据存储与处理

    • 数据库
    • 大数据
  • 消息、缓存与搜索

    • 消息队列
    • 搜索与日志分析
  • 前端与跨端开发

    • 前端技术
    • Android
  • 系统与运维

    • 操作系统
    • 容器化与 DevOps
  • 物联网与安全

    • 通信协议
    • 安全
    • 云平台
newland
  • 关于我
  • 终身学习
  • 关于时间的感悟
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

jorgen

Love it, make mistakes, learn, keep grinding.
首页
  • 平台架构
  • 混合式开发记录
  • 推送服务
  • 数据分析
  • 实时调度
  • 架构思想

    • 分布式
  • 编程框架工具

    • 编程语言
    • 框架
    • 开发工具
  • 数据存储与处理

    • 数据库
    • 大数据
  • 消息、缓存与搜索

    • 消息队列
    • 搜索与日志分析
  • 前端与跨端开发

    • 前端技术
    • Android
  • 系统与运维

    • 操作系统
    • 容器化与 DevOps
  • 物联网与安全

    • 通信协议
    • 安全
    • 云平台
newland
  • 关于我
  • 终身学习
  • 关于时间的感悟
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机系统漫游
  • 进程与线程:操作系统的核心调度单元
  • 12.内存管理-操作系统的资源分配大师
  • 16.内存管理-操作系统的资源分配艺术
  • 内存管理-操作系统的核心资源分配
  • 内存管理-操作系统的核心资源分配器
  • 内存管理-操作系统的核心资源分配机制
  • 内存管理:操作系统的核心资源调度
  • 内存管理:操作系统的资源分配大师
  • 内存管理 - 操作系统的资源分配核心
  • 内存管理:操作系统的资源分配艺术
  • 文件系统与I/O管理-操作系统的数据持久化桥梁
  • 设备管理-操作系统的硬件交互之门
  • 进程间通信-操作系统的对话桥梁
  • 操作系统安全与保护-数字世界的守护者
  • 调度算法-操作系统的指挥棒
  • 死锁-操作系统的资源竞争困境
  • 系统调用-应用程序与操作系统的对话桥梁
  • 虚拟化技术-操作系统的资源抽象魔法
  • 实时操作系统-时间的守护者
  • 并发控制-操作系统的协同艺术
  • 中断处理-操作系统的生命线
  • 分布式操作系统-跨越多机的资源协调大师
  • 操作系统启动过程-从按下电源键到可用的奇妙旅程
  • 页面置换算法-操作系统的内存魔术师
    • 前言
    • 什么是页面置换?
    • 常见的页面置换算法
      • 最佳置换算法(OPT)
      • 先进先出置换算法(FIFO)
      • 最近最少使用置换算法(LRU)
      • 时钟置换算法(Clock)
    • 页面置换算法的性能比较
    • 现代操作系统中的页面置换
    • 实际应用中的考虑
    • 结语
  • operating_system
Jorgen
2026-01-28
目录

页面置换算法-操作系统的内存魔术师

# 前言

在我学习操作系统的过程中,虚拟内存管理一直是最让我着迷的概念之一。🤯 特别是当物理内存不足时,操作系统是如何决定哪些页面应该被换出到磁盘,哪些页面应该被保留在内存中的呢?这就是页面置换算法要解决的问题。

想象一下,你正在玩一个只能同时打开5个应用的游戏,但你有20个想玩的应用。你该如何决定哪些应用应该保留在内存中,哪些应该被"换出"到硬盘呢?这就是页面置换算法面临的挑战!

# 什么是页面置换?

THEOREM

页面置换是虚拟内存管理中的一种技术,当需要将新页面装入内存但已无空闲空间时,系统必须选择一个现有页面将其移出(换出到磁盘),以便为新页面腾出空间。

在分页系统中,程序被划分为固定大小的页面,而物理内存也被划分为同样大小的帧。当程序访问一个不在内存中的页面时,会触发缺页中断(Page Fault),此时操作系统需要:

  1. 找到一个空闲帧(如果有的话)
  2. 如果没有空闲帧,则选择一个页面进行置换
  3. 从磁盘将被置换页面的内容读入空闲帧
  4. 更新页表和相关数据结构
  5. 重新启动导致缺页中断的指令

# 常见的页面置换算法

# 最佳置换算法(OPT)

提示

最佳置换算法理论上是最好的页面置换算法,因为它永远选择未来最长时间内不会被访问的页面进行置换。然而,由于它需要预知未来,所以实际上无法实现。

最佳算法主要用于衡量其他算法的性能上限。它的思想很简单:选择在未来最长时间内不会被使用的页面进行置换。

访问序列:7,0,1,2,0,3,0,4,2,3,0,3,2
内存帧数:3
1
2

如果我们能预知未来,在第一个缺页时(访问页面7),我们知道页面7将在第9次访问时再次被使用,而其他页面(0,1,2)会更早被访问,因此页面7是最佳选择。

# 先进先出置换算法(FIFO)

FIFO算法选择最早进入内存的页面进行置换。实现简单,但可能产生Belady异常——分配的物理页面增加时,缺页率反而增加的情况。

访问序列:7,0,1,2,0,3,0,4,2,3,0,3,2
内存帧数:3
1
2

FIFO算法的执行过程:

  1. 初始:[空, 空, 空]
  2. 访问7:[7, 空, 空] → 缺页
  3. 访问0:[7, 0, 空] → 缺页
  4. 访问1:[7, 0, 1] → 缺页
  5. 访问2:[2, 0, 1] → 缺页(置换7)
  6. 访问0:[2, 0, 1] → 不缺页
  7. 访问3:[3, 0, 1] → 缺页(置换2)
  8. 访问0:[3, 0, 1] → 不缺页
  9. 访问4:[4, 0, 1] → 缺页(置换3)
  10. 访问2:[4, 0, 2] → 缺页(置换1)
  11. 访问3:[4, 3, 2] → 缺页(置换0)
  12. 访问0:[0, 3, 2] → 缺页(置换4)
  13. 访问3:[0, 3, 2] → 不缺页
  14. 访问2:[0, 3, 2] → 不缺页

总缺页次数:9次

# 最近最少使用置换算法(LRU)

LRU算法选择最近最长时间未被访问的页面进行置换。它基于局部性原理,认为最近被访问的页面在未来也很可能被再次访问。

访问序列:7,0,1,2,0,3,0,4,2,3,0,3,2
内存帧数:3
1
2

LRU算法的执行过程:

  1. 初始:[空, 空, 空]
  2. 访问7:[7, 空, 空] → 缺页
  3. 访问0:[7, 0, 空] → 缺页
  4. 访问1:[7, 0, 1] → 缺页
  5. 访问2:[7, 0, 1] → 缺页(置换7,因为7最久未被访问)
  6. 访问0:[7, 0, 1] → 不缺页(更新访问时间)
  7. 访问3:[7, 0, 3] → 缺页(置换1,因为1最久未被访问)
  8. 访问0:[7, 0, 3] → 不缺页(更新访问时间)
  9. 访问4:[7, 4, 3] → 缺页(置换0,因为0最久未被访问)
  10. 访问2:[7, 4, 2] → 缺页(置换3,因为3最久未被访问)
  11. 访问0:[7, 0, 2] → 缺页(置换4,因为4最久未被访问)
  12. 访问3:[7, 0, 3] → 缺页(置换2,因为2最久未被访问)
  13. 访问2:[7, 0, 2] → 缺页(置换3,因为3最久未被访问)

总缺页次数:10次

# 时钟置换算法(Clock)

Clock算法是LRU算法的近似实现,也称为最近未使用(NRU)算法。它使用一个循环队列来跟踪页面的使用情况,实现比LRU更简单,性能接近LRU。

访问序列:7,0,1,2,0,3,0,4,2,3,0,3,2
内存帧数:3
1
2

Clock算法的执行过程:

  1. 初始:[空, 空, 空],指针指向第一个位置
  2. 访问7:[7, 空, 空],访问位=1 → 缺页
  3. 访问0:[7, 0, 空],访问位=1 → 缺页
  4. 访问1:[7, 0, 1],访问位=1 → 缺页
  5. 访问2:[2, 0, 1],访问位=1 → 缺页(置换7,因为7的访问位为0)
  6. 访问0:[2, 0, 1],访问位=1 → 不缺页(更新访问位为1)
  7. 访问3:[2, 3, 1],访问位=1 → 缺页(置换0,因为0的访问位为0)
  8. 访问0:[2, 0, 1],访问位=1 → 缺页(置换3,因为3的访问位为0)
  9. 访问4:[2, 0, 4],访问位=1 → 缺页(置换1,因为1的访问位为0)
  10. 访问2:[2, 0, 4],访问位=1 → 不缺页(更新访问位为1)
  11. 访问3:[2, 3, 4],访问位=1 → 缺页(置换0,因为0的访问位为0)
  12. 访问0:[2, 0, 4],访问位=1 → 缺页(置换3,因为3的访问位为0)
  13. 访问2:[2, 0, 4],访问位=1 → 不缺页(更新访问位为1)

总缺页次数:9次

# 页面置换算法的性能比较

算法 优点 缺点 适用场景
OPT 理论最优,缺页率最低 无法实现,仅用于理论比较 衡量其他算法的性能上限
FIFO 实现简单 可能产生Belady异常,性能较差 简单系统,对性能要求不高的场景
LRU 性能较好,符合局部性原理 实现复杂,需要维护访问历史 对性能要求较高的系统
Clock 实现简单,性能接近LRU 性能略逊于LRU 需要平衡性能和实现复杂度的系统

# 现代操作系统中的页面置换

现代操作系统如Linux使用更复杂的页面置换算法,如两-handed时钟算法(Two-Handed Clock)或多级反馈队列(Multi-level Feedback Queue)等。这些算法结合了多种策略,能够更好地适应不同程序的访问模式。

例如,Linux的页面置换算法会:

  1. 考虑页面的访问频率
  2. 考虑页面的修改状态(脏页需要写回磁盘)
  3. 考虑页面的年龄(在内存中停留的时间)
  4. 使用多级扫描策略来平衡扫描开销和置换效果

# 实际应用中的考虑

在实际系统中,选择页面置换算法时需要考虑:

  1. 硬件支持:某些算法需要特定的硬件支持(如访问位)
  2. 实现复杂度:算法越复杂,实现和维护成本越高
  3. 性能权衡:算法的置换效果与系统开销之间的平衡
  4. 工作负载特性:不同算法适用于不同类型的程序访问模式

# 结语

页面置换算法是操作系统虚拟内存管理的核心,它决定了当内存不足时,哪些页面应该被保留在内存中。从简单的FIFO到复杂的LRU变种,每种算法都有其优缺点和适用场景。

"在计算机科学中,我们几乎所有的难题都可以通过另一个层次间接来解决。" —— 通过页面置换,操作系统为程序提供了一个比实际物理内存更大的地址空间,极大地提高了系统的灵活性和效率。

作为开发者,理解页面置换算法有助于我们编写更高效的程序,减少缺页中断,提高系统性能。同时,这也是操作系统设计中的经典问题,展现了在有限资源下进行优化的智慧。

下次当你程序运行缓慢时,说不定就是页面置换算法在幕后辛勤工作呢!😉

#虚拟内存#页面置换#内存管理
上次更新: 2026/01/28, 23:08:02
操作系统启动过程-从按下电源键到可用的奇妙旅程

← 操作系统启动过程-从按下电源键到可用的奇妙旅程

最近更新
01
LLM
01-30
02
intro
01-30
03
intro
01-30
更多文章>
Theme by Vdoing | Copyright © 2019-2026 Jorgen | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式