128 / 163 · C11 · 约 8 分钟
内存虚拟化总结对话
先记住这句话
师生对话梳理虚拟内存核心心智模型:用户程序只接触虚拟地址,TLB让转换变得可行,页表结构需灵活适配稀疏空间,交换机制揭示真实硬件约束。目标是能独立诊断系统异常行为。
程序里的地址全是虚拟的
无论取指令还是显式的加载存储,用户代码接触到的每一个地址都是虚拟地址。操作系统故意隐藏物理布局,制造出私有连续空间的假象。程序员打印指针只能得到虚拟值,永远看不到数据真正落在哪块DRAM上。
没有TLB就没有实用的虚拟内存
页表体积庞大,只能放在慢速内存里。TLB用一小块硬件缓存最近用过的转换结果。缺少它,每次访存都要走完整页表,程序会慢到无法忍受。一旦工作集超出TLB覆盖范围,未命中风暴会立刻暴露出来。
页表只是数据结构,形状必须匹配需求
从线性数组到多级树,再到可被换出的内核虚拟页表,目的都是少占空间。多级结构只在用户真正用到的区域分配表项,完美适配稀疏地址空间。早期的基址+界限寄存器太死板,无法满足程序员对灵活布局的期望。
机制比策略更值得记住
页面替换策略(例如LRU)看起来直观,真正决定系统能否工作的是交换、缺页处理等机制。策略难题的终极答案往往是再买几根内存条。理解机制才能在机器变慢时立刻知道发生了什么。
常见误区
- 把printf打印出来的指针当成物理地址
- 以为页表必须是一张巨大的线性数组
- 忽略TLB覆盖范围不足时的灾难性性能下降
- 把替换策略当成虚拟内存的核心,却不懂缺页与交换机制
运行一个例子
这一章用官方 PDF 讲清概念;本页不附带可运行程序。
CHECK YOUR UNDERSTANDING
合上答案,试着解释。
为什么说TLB真正让内存虚拟化成为可能?如果程序的工作集超过TLB能覆盖的范围,会出现什么可观察的现象?
查看参考答案
页表太大太慢,必须靠TLB缓存转换结果,否则每次访存都要额外访问内存。工作集超出覆盖范围时会出现密集的TLB未命中,延迟突然升高一个数量级,表现为程序间歇性“卡住”。
继续查证
标准草案与官方章节会更新;版本标记只说明示例最低要求。