虚拟存储器与 Cache 的比较
这是全章的收束页。Cache—主存和主存—辅存是同一个思想的两次应用(见 3.1.3),因此它们在结构上高度平行:都有”块/页”、都有”命中/未命中”、都有”映射方式”、都有”替换算法”、都有”写策略”。
但它们的每一处差别,都可以从同一个数量级推出来:
相差六个数量级。 这一条解释了下面表格里的几乎每一行——为什么虚拟存储器必须用全相联、必须用写回、必须交给操作系统、必须切换进程。把这条主线抓住,这张表就不用背。
机制
完整对照
| 维度 | Cache—主存 | 主存—辅存(虚拟存储器) |
|---|---|---|
| 解决的矛盾 | 速度 | 容量 |
| 上下两级 | Cache / 主存 | 主存 / 辅存 |
| 两级速度比 | 约 | 约 |
| 交换单位 | 块(几十字节) | 页或段(几 KB) |
| 未命中代价 | 几十 ns | 几 ms |
| 未命中处理者 | 全硬件 | 操作系统(硬件只产生异常) |
| 是否产生中断 | 否 | 是(缺页故障) |
| 是否切换进程 | 否(CPU 原地等待) | 可能(进程阻塞) |
| 对应用程序透明 | 是 | 是 |
| 对操作系统透明 | 是 | 否 |
| 映射方式 | 直接 / 组相联 / 全相联 | 全相联(任一页可放任一页框) |
| 写策略 | 写直达 或 写回 | 只有写回 |
| 地址转换 | 主存地址 → Cache 行 | 虚地址 → 主存地址 |
| CPU 能否绕过 | 不能(访存必经) | 能(关闭 MMU 即用物理地址) |
从”未命中代价”推出每一行
为什么虚拟存储器一律用全相联? 缺页代价是毫秒级,命中率哪怕只提高千分之一都值得,所以必须消除全部冲突缺失,代价再高也要用全相联。反过来,Cache 未命中只要几十纳秒,为提高命中率而拉长命中判断的关键路径反而得不偿失,所以组相联的路数很小(见 3.5.3)。
为什么虚拟存储器只有写回,没有写直达? 写直达意味着每次写都要同步到辅存——一次磁盘写是毫秒级,程序会完全无法运行。所以脏页只在换出时才写回。Cache 的写直达之所以可行,是因为写主存只要几十纳秒。
为什么缺页要交给操作系统,Cache 未命中不用? 毫秒级的等待期间让 CPU 空转是巨大的浪费,必须让出 CPU 去跑别的进程——而”切换进程”这件事只有操作系统能做。Cache 未命中只有几十纳秒,切换进程本身的开销远大于等待,硬件原地等最划算。
为什么交换单位差两个数量级? 未命中代价里绝大部分是固定开销(磁盘寻道与旋转、异常处理与进程切换),一次多搬一些数据几乎不增加成本,所以页要大。Cache 的固定开销小,块太大反而会挤掉别的有用数据。
这四条推理是简答题的标准答法:不要只写”因为缺页代价大”,要写出”代价大 → 所以某个设计选择成立”的那一步。
结构上的对应关系
| Cache 中的概念 | 虚拟存储器中的对应物 |
|---|---|
| 块(Block) | 页(Page) |
| Cache 行 | 页框(Page Frame) |
| 标记 Tag | 虚页号(在 TLB 中) |
| 有效位 | 有效位 / 装入位 |
| 脏位 | 脏位 / 修改位 |
| 命中率 | 1 − 缺页率 |
| 替换算法 | 页面置换算法 |
| 写回 | 脏页换出时写回辅存 |
TLB 在这张表里的位置很特别:它是”页表的 Cache”,因此它同时属于两边——用的是 Cache 的机制(相联比较、标记、替换),服务的是虚拟存储器的目的(地址转换)。
边界
“虚拟存储器一定采用全相联”这句话要说清含义:指的是任何一个虚页可以装入任何一个空闲页框,而不是说页表用相联查找实现(页表是按下标索引的)。用相联查找的是 TLB。
两者是串联并存的,不是替代关系。 一次访存要先经过地址转换,再查 Cache。“有了 Cache 就不需要虚拟存储器”是错的,它们解决的矛盾不同。
“对程序员透明”两者都成立,“对操作系统透明”只有 Cache 成立。 这是最常考的一处差别——操作系统必须知道页表在哪、哪些页在主存里,但它完全不知道 Cache 里有什么。
Cache 的替换算法在硬件里,页面置换算法在操作系统里。 规则可以相同(都可以叫 LRU),实现完全不同,见 3.5.4 的三种成本模型。
“缺页率”和”未命中率”是同一个概念的两个名字,但缺页率的数量级要求苛刻得多:Cache 缺失率 5% 是可以接受的,缺页率 5% 会让系统完全无法使用。
对照速查
| 一句话 | Cache | 虚拟存储器 |
|---|---|---|
| 为了什么 | 快 | 大 |
| 谁来管 | 硬件 | 硬件翻译 + OS 替换 |
| 未命中多贵 | 几十 ns | 几 ms |
| 所以映射方式 | 组相联(路数小) | 全相联 |
| 所以写策略 | 写直达 或 写回 | 只有写回 |
| 所以未命中时 | 原地等 | 切换进程 |
| 所以单位 | 小块 | 大页 |
考点
- Cache 解决速度、虚拟存储器解决容量,两者串联并存
- 未命中代价相差约六个数量级,这是全部差别的根源
- 虚拟存储器用全相联、只用写回、由操作系统处理缺页并可能切换进程
- Cache 对操作系统也透明,虚拟存储器不透明
- Cache 未命中不产生中断,缺页产生故障类异常
- TLB 兼有两者性质:Cache 的机制 + 虚拟存储器的目的
- 结构对应:块↔页、行↔页框、标记↔虚页号、命中率↔1−缺页率
- 简答题要写出**“代价大 → 所以这样设计”**的推理链,不能只写结论
链接
- 🏠 返回总览:计算机组成原理第 3 章:存储系统总览
- ⬅️ 上一节:3.6.4 段页式虚拟存储器
- ➡️ 下一章:第 4 章:指令系统
- 🔗 3.1.3 多级层次的存储系统(两个缓存对的提出)
- 🔗 3.5.3 Cache 和主存的映射方式
- 🌐 跨科:OS 3.2.1 虚拟内存的基本概念
- 📖 名词库:第 3 章名词库