首页/操作系统/03-memory/虚拟内存管理 🔗 在 Obsidian 中打开
操作系统 · 03-memory

虚拟内存管理

重要度 ⭐⭐ 难度 ⭐⭐⭐考查频率 低 操作系统/内存管理虚拟内存页面置换抖动局部性原理
速查
虚拟内存基于局部性原理,使程序不必全部装入内存即可运行;其大小受地址位数与外存容量限制,实际由地址位数约束。请求分页 = 基本分页 + 请求调页 + 页面置换

速查

项目
核心概念虚拟内存基于局部性原理(时间局部性:刚访问的数据近期可能再次访问;空间局部性:访问某地址后可能访问其邻近地址),使程序不需要全部装入内存即可运行。虚拟内存大小受地址位数和外存容量限制,实际受地址位数约束。
关键公式 / 性质请求分页管理:在基本分页基础上增加请求调页和页面置换功能。页表项增加:状态位 P(是否在内存)、访问位 A、修改位 M、外存地址。
考试频率⭐⭐⭐⭐

核心概念

虚拟内存基于局部性原理(时间局部性:刚访问的数据近期可能再次访问;空间局部性:访问某地址后可能访问其邻近地址),使程序不需要全部装入内存即可运行。虚拟内存大小受地址位数和外存容量限制,实际受地址位数约束

请求分页管理:在基本分页基础上增加请求调页页面置换功能。页表项增加:状态位 P(是否在内存)、访问位 A、修改位 M、外存地址。

请求分页的页表项 页框号 F P A M 外存地址 基本分页已有 请求分页新增:状态位 / 访问位 / 修改位 / 外存地址 在内存? 被访问? 被修改?
图:请求分页页表项在页框号之外,增加 P / A / M 三个标志位与外存地址,用于缺页判断与置换决策。

缺页中断:访问的页不在内存时产生缺页中断,与普通中断的区别是:缺页中断在指令执行期间产生(一条指令可能多次缺页),且需要一条指令可能执行多次。

页面置换算法

  1. OPT(最佳置换):淘汰最长时间内不会被访问的页面,理论最优但不可实现。
  2. FIFO(先进先出):淘汰最早进入内存的页面,可能产生 Belady 异常(增加物理块反而增加缺页率)。
  3. LRU(最近最少使用):淘汰最近最长时间未被访问的页面,无 Belady 异常,性能接近 OPT。
  4. CLOCK(时钟置换):循环检查访问位,为 0 则淘汰,为 1 则置 0 继续检查。
  5. 改进 CLOCK:优先淘汰未访问且未修改的页面(访问位 $A=0$,修改位 $M=0$)。

页面分配策略

  • 固定分配:每个进程分配固定数目的物理块。
  • 可变分配:根据进程缺页率动态调整物理块数。
  • 全局置换:可从任何进程抢夺物理块(通常配合可变分配)。
  • 局部置换:只能在本进程的物理块中置换。

抖动 / 颠簸(Thrashing):页面频繁调入调出,CPU 利用率急剧下降。原因:分配给进程的物理块不足。工作集模型可防止抖动。

工作集:在某段时间间隔内,进程实际访问的页面集合。窗口大小为 $\Delta$ 时,工作集 $W(t,\Delta)$ 是时刻 $t$ 前 $\Delta$ 个时间单位内访问的页面集合。驻留集应不小于工作集

关键定义

概念定义
虚拟内存具有请求调页和页面置换功能的存储管理系统,使逻辑地址空间大于物理内存
缺页中断访问的页面不在内存时触发的中断,需从外存调入
页面置换当内存无空闲页框时,按算法选择一页换出到外存,腾出空间
抖动页面在内存和外存之间频繁换入换出,导致系统效率极低
工作集进程在时间窗口 $\Delta$ 内访问的页面集合
驻留集操作系统分配给进程的物理块集合
Belady 异常使用 FIFO 置换算法时,增加物理块数反而使缺页率升高的现象
缺页率缺页次数 / 总访问次数

常见考法

考点说明
页面置换过程模拟给定访问串和物理块数,模拟各算法的置换过程,统计缺页次数
Belady 异常判断FIFO 算法下对比不同物理块数的缺页率
有效访问时间计算$EAT = (1-p)\times$ 内存访问时间 $+\ p\times$ 缺页处理时间($p$ 为缺页率)
工作集计算给定访问序列和窗口大小,确定工作集大小
抖动的预防调整驻留集大小使 $\geq$ 工作集,或降低多道程序度
LRU 的硬件实现计数器法或栈法实现 LRU

易错点

注意
  • 缺页中断属于内部异常 / 故障,不是外部中断;且在指令执行中产生,一条指令可触发多次。
  • OPT 不可实现(需要预知未来访问序列),但常作为性能比较基准。
  • FIFO 可能发生 Belady 异常,LRU 不会(LRU 满足栈性质)。
  • 访问串计算时,首次访问必缺页(页面未在内存)。
  • 缺页率计算的有效访问时间公式中,缺页处理时间 = 缺页中断处理时间 + 读入页面时间 + 重新执行指令时间。
  • 工作集大小会随时间变化,当工作集 > 驻留集时会发生抖动。
  • 改进 CLOCK 淘汰顺序:$(0,0)\to(0,1)\to(1,0)\to(1,1)$,其中第一轮不修改访问位,第二轮扫描才置 0。

核心结论

必背
  1. LRU 的硬件实现:$n$ 个页面用 $n \times n$ 矩阵(计数器法),或用栈维护访问顺序。
  2. FIFO 在特定访问序列下存在 Belady 异常,LRU 一定不存在。
  3. 抖动的根本原因:多道程序度过高,每个进程分配的物理块不足。
  4. 解决抖动的方法:增大物理内存、减少并发进程数(降低多道程序度)、增大驻留集。
  5. 缺页率 $p\to 0$ 时,$EAT\approx$ 内存访问时间;$p\to 1$ 时,$EAT\approx$ 缺页处理时间。
  6. 请求分页中,页面调入策略:预调页策略(预测性调入)和请求调页策略(缺页时调入)。
  7. 虚拟内存的特征:多次性(作业分多次调入内存)、对换性(页面可换入换出)、虚拟性(逻辑空间大于物理空间)。

记忆卡片

虚拟内存基于什么原理?具有哪三个特征?
基于局部性原理(时间局部性 + 空间局部性);三个特征:多次性、对换性、虚拟性。
FIFO 页面置换算法有什么特殊异常?
Belady 异常:增加物理块数反而使缺页率升高(LRU 和 OPT 无此异常)。
缺页中断和普通中断的区别?
缺页中断在指令执行期间产生(一条指令可能多次缺页),普通中断在指令执行末尾响应。
四种页面置换算法中哪些有 Belady 异常?
只有 FIFO 有 Belady 异常;OPT、LRU、CLOCK 均无此异常。
什么是抖动?如何防止?
页面频繁调入调出导致 CPU 利用率急剧下降;通过工作集模型防止——驻留集应不小于工作集。

交互动画 · FIFO 的 Belady 异常

访问串 1 2 3 4 1 2 5 1 2 3 4 5 · FIFO 先进先出置换
点击「下一步」开始模拟
物理块数 3 · 已处理 0/12 · 缺页 0 次
跑完两种模式可以看到:3 块共 9 次缺页,4 块反而 10 次缺页 —— 这就是 Belady 异常

相关知识点

paging-and-segmentation virtual-memory cache-memory

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。