操作系统第 3 章:内存管理与虚拟存储总览

这一章在解决什么

第 3 章的主线是:程序写出来的地址,怎样变成真实内存访问;内存不够时,操作系统怎样让程序“像是有更大内存”。

这一章最容易混的是“逻辑上离散分配”和“物理上连续空闲块管理”这两层。分页让进程的页面可以离散放入页框,但操作系统自己管理物理页框时,仍然可能需要统计连续空闲页框块,例如 Linux 的伙伴算法。

核心概念

  • 内存分配、装入链接与地址转换(本地资料):连续分配、动态分区、紧凑、覆盖与交换、静态/动态重定位、装入与链接。
  • 索引分配、Quick Fit、伙伴与哈希分配边界(本地资料):把“索引寻址”“空闲块快速分类”“连续页框块合并”和“哈希查找”放回各自语境。
  • 分页、分段、段页式与 TLB(本地资料):页、页框、页表、段表、快表、地址拆分、访问次数计算。
  • 虚拟存储、缺页与页面置换(本地资料):请求分页、缺页中断、OPT、FIFO、LRU、Clock、改进型 Clock。
  • 请求分页、页面来源、交换区与预调页(本地资料):缺页时页面从可执行文件、文件映射区、交换区或零页等来源调入。
  • 工作集、抖动与伙伴算法(本地资料):局部性原理、工作集、驻留集、抖动、对换区/文件区、伙伴系统。

典型题型

  • 地址转换题:逻辑地址拆成页号/页内偏移,查页表或 TLB,形成物理地址。
  • 重定位、地址变换与教材口径题组(本地资料):固定分区是否需要地址变换机构、静态重定位“可以/通常”口径、动态重定位狭义/广义过程。
  • 访问次数题:命中 TLB 几次访存,未命中几次访存,多级页表怎么加次数。
  • 分页地址转换与 TLB 题组(本地资料):把地址拆分、有效位、越界、TLB 命中/未命中和访存次数放在同一张表里做。
  • 碎片判断题:固定分区、动态分区、分页、分段、段页式分别产生内部/外部碎片。
  • 段页式与碎片判断题组(本地资料):集中处理“逻辑可变长段、物理固定页框”和内部/外部碎片速判。
  • 页面置换题:给页面访问串和页框数,求缺页次数、置换页面、缺页率。
  • 页面置换算法题组(本地资料):集中练 FIFO、LRU、OPT、Clock 的页框状态表,避免每道题重写完整模板。
  • 伙伴算法与 LRU 实现代价边界题组(本地资料):把 buddy 的物理页框库存层级、LRU 的驻留页排序和 A/D 选项边界放在一起辨析。
  • 改进型 Clock 题:按访问位 A 和修改位 M 的优先级扫描。
  • 抖动/工作集题:判断抖动原因、改善措施、为什么增加交换区容量不一定有效。
  • 抖动与虚拟存储真题题组(本地资料):CPU 利用率低且交换区繁忙、提高优先级无效、虚拟存储容量受地址结构和外存共同限制。

易错点

  • 页是进程逻辑空间的块,页框/页帧是物理内存的块;页表负责“页号到页框号”的映射。
  • TLB 命中后仍然要访问一次内存取数据;题目说“忽略访问 TLB 时间”不是说忽略内存访问。
  • LRU 理论上好,但精确实现代价高,因为每次内存访问都要维护访问顺序。
  • 改进型 Clock 中 A 比 M 更关键:先找没被访问的页,再考虑是否被修改。
  • 增大交换区容量只是能放更多被换出的页面,不等于减少缺页次数或提高页框数。
  • 可重入程序/纯代码程序通过共享代码减少内存占用,改善方向是减少对换数量,不是提高对换速度。
  • 文件页、匿名页、共享/私有映射页的调入来源不同:能从原文件恢复的页走文件区/page cache,匿名页或私有脏页换出后靠对换区。
  • macOS 的 Cached Files 高通常是可回收文件缓存;Linux swap file 是教材对换区的一种实现形式,是否使用取决于内存压力和策略。
  • 固定分区是否需要地址变换机构取决于重定位方式;静态重定位可不需要运行时转换,动态重定位才需要。
  • “提供给用户的物理地址空间”若按扣除页表/段表后的用户可用内存理解,可能因管理表大小不定而不能确定。
  • 伙伴算法管理的是物理内存中的连续空闲页框块,不等于让进程必须连续分配。
  • 第三章教材表述陷阱(本地资料):把“装入/调入”“页/页框”“局部置换/全局置换”“交换区/文件区”等词先归位再判断。

方法模板

  • 地址转换:先算页大小对应的页内偏移位数,再拆地址、查页表、拼物理地址。
  • 置换题:永远先画“页框状态表”,不要只在脑子里滚动。
  • OPT 手算:看内存中各页下一次出现位置,淘汰未来最晚使用或再也不用的页。
  • 改进型 Clock:第一轮找 (A=0,M=0);找不到就找 (A=0,M=1),过程中按题目规则清 A 位。
  • 抖动题:抓“物理页框不足、工作集装不下、缺页率过高、CPU 利用率下降”。
  • 教材口径题:先分“考试典型搭配”和“严格概念边界”,例如固定分区通常配静态重定位、可变分区理论上也可静态重定位。
  • 页面来源题:按“是否有文件原件、是否被改脏、是否已在内存共享”三问判断。

复习顺序

  1. 先看 内存分配、装入链接与地址转换(本地资料) 和 重定位、地址变换与教材口径题组(本地资料),理解程序如何进入内存,以及固定分区/可变分区/动态重定位的题目口径。
  2. 再看 分页、分段、段页式与 TLB(本地资料),配合 分页地址转换与 TLB 题组(本地资料) 和 段页式与碎片判断题组(本地资料) 把地址转换和碎片判断练稳。
  3. 然后看 虚拟存储、缺页与页面置换(本地资料)、请求分页、页面来源、交换区与预调页(本地资料) 和 页面置换算法题组(本地资料),专练缺页与置换表。
  4. 最后看 工作集、抖动与伙伴算法(本地资料)、抖动与虚拟存储真题题组(本地资料)、索引分配、Quick Fit、伙伴与哈希分配边界(本地资料)、伙伴算法与 LRU 实现代价边界题组(本地资料) 和 第三章教材表述陷阱(本地资料),处理抽象判断题。

计组接口

自测清单

  • 我能不能说清“页、页框、页表项、页内偏移”的关系?
  • 我能不能解释为什么分页无外部碎片但有内部碎片?
  • 我能不能手算 FIFO、LRU、OPT、Clock 的缺页次数?
  • 我能不能解释为什么抖动时提高进程优先级通常没用?
  • 我能不能说清可重入程序为什么是减少对换数量,而不是提高对换速度?
  • 我能不能区分页表/段表占内存导致的“用户可用空间不确定”和硬件物理地址空间本身?