操作系统第 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 利用率下降”。
- 教材口径题:先分“考试典型搭配”和“严格概念边界”,例如固定分区通常配静态重定位、可变分区理论上也可静态重定位。
- 页面来源题:按“是否有文件原件、是否被改脏、是否已在内存共享”三问判断。
复习顺序
- 先看 内存分配、装入链接与地址转换(本地资料) 和 重定位、地址变换与教材口径题组(本地资料),理解程序如何进入内存,以及固定分区/可变分区/动态重定位的题目口径。
- 再看 分页、分段、段页式与 TLB(本地资料),配合 分页地址转换与 TLB 题组(本地资料) 和 段页式与碎片判断题组(本地资料) 把地址转换和碎片判断练稳。
- 然后看 虚拟存储、缺页与页面置换(本地资料)、请求分页、页面来源、交换区与预调页(本地资料) 和 页面置换算法题组(本地资料),专练缺页与置换表。
- 最后看 工作集、抖动与伙伴算法(本地资料)、抖动与虚拟存储真题题组(本地资料)、索引分配、Quick Fit、伙伴与哈希分配边界(本地资料)、伙伴算法与 LRU 实现代价边界题组(本地资料) 和 第三章教材表述陷阱(本地资料),处理抽象判断题。
计组接口
- 页表、TLB、Cache 的完整访问通路:CO 3.6.2 页式虚拟存储器(页表 / TLB / MMU 与 Cache 的访问通路)
- Cache 映射、替换和写策略:CO 3.5.3 映射方式、3.5.4 替换算法、3.5.5 写策略与一致性
- DRAM 主存的硬件组织:CO 3.2.1 SRAM 芯片和 DRAM 芯片
自测清单
- 我能不能说清“页、页框、页表项、页内偏移”的关系?
- 我能不能解释为什么分页无外部碎片但有内部碎片?
- 我能不能手算 FIFO、LRU、OPT、Clock 的缺页次数?
- 我能不能解释为什么抖动时提高进程优先级通常没用?
- 我能不能说清可重入程序为什么是减少对换数量,而不是提高对换速度?
- 我能不能区分页表/段表占内存导致的“用户可用空间不确定”和硬件物理地址空间本身?