多级层次的存储系统
人们对存储器的三个要求——容量大、速度快、成本低——在任何单一介质上都无法同时满足。半导体触发器快但贵,磁表面便宜但慢,这不是工艺水平问题,而是物理上的取舍。
层次结构的思路因此不是”造一个又快又大又便宜的存储器”,而是用多种介质各承担一项要求,再靠一个规律把它们粘起来,使整体对 CPU 呈现出”接近最快一级的速度 + 接近最大一级的容量”。
那个规律就是程序访问的局部性(详见 3.5.1)。层次结构能成立,完全建立在局部性之上;局部性一旦失效,层次结构立刻退化成最慢的那一级。
机制
三级层次与两个”缓存对”
flowchart TD CPU["CPU 寄存器"] --> C["Cache<br/>SRAM · 硬件管理 · 对程序员透明"] C --> M["主存<br/>DRAM · 指令可直接访问"] M --> D["辅存<br/>磁盘/SSD · 需调入主存才能访问"] classDef fast fill:#d5f5e3,stroke:#27ae60 classDef mid fill:#fdebd0,stroke:#e67e22 classDef slow fill:#fadbd8,stroke:#c0392b class CPU,C fast class M mid class D slow
自上而下:速度递减、容量递增、单位成本递减。
关键在于这三级实际上是两个独立的”缓存对”,各解决一个问题:
| 缓存对 | 解决什么 | 由谁管理 | 单位 | 不命中叫什么 |
|---|---|---|---|---|
| Cache — 主存 | 速度矛盾 | 全硬件,对程序员和操作系统都透明 | Cache 块(行) | Cache 缺失 |
| 主存 — 辅存 | 容量矛盾 | 硬件 + 操作系统 | 页 / 段 | 缺页(中断) |
这两个缓存对用的是同一个思想的两次应用:把最近要用的内容放进上一级,靠局部性让绝大多数访问在上一级命中。它们的差别全部集中在 3.6.5 那张对照表里。
层次辨析:两个缓存对的"透明性"不同,这决定了缺失时谁来处理
Cache 缺失由硬件独立处理完毕,程序甚至不会察觉——CPU 只是多等了几十个时钟周期,不发生中断,不切换进程。 缺页则必须产生一次异常(故障类内中断),交给操作系统处理,处理期间当前进程被阻塞、可能发生进程切换。 判据是上一级放不下时,能不能只靠硬件从下一级取回:Cache 与主存之间地址一一对应、块大小固定、代价只有几十纳秒,硬件能包办;主存与辅存之间要启动 I/O、耗时毫秒级,让 CPU 空等是不可接受的,必须交给操作系统去调度别的进程。 跨科对照见 OS 3.2.2 请求分页管理方式。
每一级对下一级的”缓存”关系
层次结构的完整形态其实不止三级,从上到下依次是:
寄存器 → L1 Cache → L2 Cache → L3 Cache → 主存 → 固态硬盘 / 磁盘 → 磁带、光盘
其中寄存器由编译器分配,是唯一由软件显式管理的一级;Cache 各级由硬件管理;主存与辅存之间由操作系统管理。“由谁管理”这一列比”速度多少”更常被考。
层次存储器的平均访问时间
两级层次的平均访问时间,就是”命中时的开销”与”缺失时的额外开销”的加权:
其中
另一种同样常见的写法假设缺失时”先访问上一级失败、再访问下一级”,或”直接访问下一级”,两种口径的差别只在
边界辨析:
是"访问下一级的总时间"还是"额外时间",必须从题干读出 这是本章计算题最常见的翻车点。两种口径都在教材里出现过: 口径一(先查后取):缺失时的总时间
,因为要先在上一级查一次才发现没有。 口径二(并行/直接取):缺失时的总时间 , 已包含全部开销。 判断方法只有一条:看题目给的 是”主存访问时间”还是”缺失附加代价 / miss penalty”。 前者用口径一,后者用 。题干若两种都能读通,写出所用口径再算,这是简答题的标准写法。 具体到 Cache 的平均访问时间(AMAT),见 3.5.2。
多级递推时从最下层往上逐级代入即可,公式本身没有新内容。
边界
层次结构提高的是”平均”性能,不改变任何单一器件的性能。 主存还是那个主存,磁盘还是那个磁盘。这与 3.1.2 的那张表是同一件事的两个说法。
命中率不是设计出来的,是程序行为决定的。 同一套 Cache,跑局部性好的程序命中率可以到 98%,跑随机访问的程序可能低于 50%。2014 年统考真题就是让考生改写循环顺序来改变命中率,见 3.5.1。
“CPU 可以直接访问 Cache 和主存”这句话要小心。 精确的说法是:CPU 发出的是主存地址,Cache 是否命中由硬件判断,程序无法指定”我要访问 Cache”。 说”CPU 能直接访问 Cache”是在说”访问 Cache 不需要软件干预”,不是说程序里有访问 Cache 的指令。
辅存不在 CPU 的地址空间里。 磁盘上的内容必须先由 I/O 操作调入主存。唯一的例外性表述是”内存映射文件”,但那也只是把文件页映射进虚拟地址空间,真正访问时仍要缺页调入,见 OS 3.2.7 内存映射文件。
对照速查
| 层 | 介质 | 管理者 | 对上透明? | 交换单位 |
|---|---|---|---|---|
| 寄存器 | 触发器 | 编译器 | 否 | 字 |
| Cache | SRAM | 硬件 | 是 | 块(行) |
| 主存 | DRAM | 硬件 + OS | 部分 | 页 |
| 辅存 | 磁/闪存 | OS + 用户 | 否 | 页 / 文件块 |
| 缓存对 | 矛盾 | 缺失代价量级 | 缺失时是否中断 |
|---|---|---|---|
| Cache—主存 | 速度 | 几十 ns | 否 |
| 主存—辅存 | 容量 | 几 ms | 是(缺页异常) |
考点
- 三级层次 = 两个缓存对:Cache—主存解决速度,主存—辅存解决容量
- 层次结构成立的唯一前提是程序访问的局部性
- Cache 缺失由硬件处理不产生中断;缺页必须由操作系统处理并产生异常
; 的口径必须从题干确定 - 自上而下:速度降、容量升、单位成本降
- 寄存器由编译器管理,是唯一软件显式管理的一级
- 辅存不在 CPU 地址空间内
链接
- 🏠 返回总览:计算机组成原理第 3 章:存储系统总览
- ⬅️ 上一节:3.1.2 存储器的性能指标
- ➡️ 下一节:3.2.1 SRAM 芯片和 DRAM 芯片
- 🔗 3.5.1 程序访问的局部性原理(层次结构的地基)
- 🔗 3.6.5 虚拟存储器与 Cache 的比较(两个缓存对的完整对照)
- 🌐 跨科:OS 3.2.1 虚拟内存的基本概念
- 📖 名词库:第 3 章名词库