多级层次的存储系统

人们对存储器的三个要求——容量大、速度快、成本低——在任何单一介质上都无法同时满足。半导体触发器快但贵,磁表面便宜但慢,这不是工艺水平问题,而是物理上的取舍。

层次结构的思路因此不是”造一个又快又大又便宜的存储器”,而是用多种介质各承担一项要求,再靠一个规律把它们粘起来,使整体对 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 内存映射文件。

对照速查

层介质管理者对上透明?交换单位
寄存器触发器编译器否字
CacheSRAM硬件是块(行)
主存DRAM硬件 + OS部分页
辅存磁/闪存OS + 用户否页 / 文件块
缓存对矛盾缺失代价量级缺失时是否中断
Cache—主存速度几十 ns否
主存—辅存容量几 ms是(缺页异常)

考点

  • 三级层次 = 两个缓存对:Cache—主存解决速度,主存—辅存解决容量
  • 层次结构成立的唯一前提是程序访问的局部性
  • Cache 缺失由硬件处理不产生中断;缺页必须由操作系统处理并产生异常
  • ; 的口径必须从题干确定
  • 自上而下:速度降、容量升、单位成本降
  • 寄存器由编译器管理,是唯一软件显式管理的一级
  • 辅存不在 CPU 地址空间内

链接