C++ / a working model

128 / 163   ·   C11   ·   约 8 分钟

内存虚拟化总结对话

先记住这句话

师生对话梳理虚拟内存核心心智模型:用户程序只接触虚拟地址,TLB让转换变得可行,页表结构需灵活适配稀疏空间,交换机制揭示真实硬件约束。目标是能独立诊断系统异常行为。

本篇内容
  1. 程序里的地址全是虚拟的
  2. 没有TLB就没有实用的虚拟内存
  3. 页表只是数据结构,形状必须匹配需求
  4. 机制比策略更值得记住
  5. 运行示例
  6. 动手练习

官方章节 PDF

程序里的地址全是虚拟的

无论取指令还是显式的加载存储,用户代码接触到的每一个地址都是虚拟地址。操作系统故意隐藏物理布局,制造出私有连续空间的假象。程序员打印指针只能得到虚拟值,永远看不到数据真正落在哪块DRAM上。

没有TLB就没有实用的虚拟内存

页表体积庞大,只能放在慢速内存里。TLB用一小块硬件缓存最近用过的转换结果。缺少它,每次访存都要走完整页表,程序会慢到无法忍受。一旦工作集超出TLB覆盖范围,未命中风暴会立刻暴露出来。

页表只是数据结构,形状必须匹配需求

从线性数组到多级树,再到可被换出的内核虚拟页表,目的都是少占空间。多级结构只在用户真正用到的区域分配表项,完美适配稀疏地址空间。早期的基址+界限寄存器太死板,无法满足程序员对灵活布局的期望。

机制比策略更值得记住

页面替换策略(例如LRU)看起来直观,真正决定系统能否工作的是交换、缺页处理等机制。策略难题的终极答案往往是再买几根内存条。理解机制才能在机器变慢时立刻知道发生了什么。

常见误区

  • 把printf打印出来的指针当成物理地址
  • 以为页表必须是一张巨大的线性数组
  • 忽略TLB覆盖范围不足时的灾难性性能下降
  • 把替换策略当成虚拟内存的核心,却不懂缺页与交换机制

运行一个例子

这一章用官方 PDF 讲清概念;本页不附带可运行程序。

CHECK YOUR UNDERSTANDING

合上答案,试着解释。

为什么说TLB真正让内存虚拟化成为可能?如果程序的工作集超过TLB能覆盖的范围,会出现什么可观察的现象?

查看参考答案

页表太大太慢,必须靠TLB缓存转换结果,否则每次访存都要额外访问内存。工作集超出覆盖范围时会出现密集的TLB未命中,延迟突然升高一个数量级,表现为程序间歇性“卡住”。

继续查证

标准草案与官方章节会更新;版本标记只说明示例最低要求。

回到目录