虚拟存储器与 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−缺页率
  • 简答题要写出**“代价大 → 所以这样设计”**的推理链,不能只写结论

链接