CSAPP - 08.MEM-01

计算机组成原理笔记:存储器层次结构 (The Memory Hierarchy)

主要内容
本章探讨了如何通过架构设计来弥补 CPU 高速计算存储器低速访问之间的巨大鸿沟。

  1. 存储技术 (Storage Technologies):分析了不同介质的物理特性与权衡。
    • SRAM:快、贵、易失 (用于 CPU 缓存)。
    • DRAM:较慢、较便宜、易失 (用于主存)。
    • Disk/SSD:极慢、极便宜、非易失 (用于海量存储)。
  2. 局部性原理 (Locality):层次结构生效的理论基石
    • 时间局部性:刚被访问过的很快会被再次访问。
    • 空间局部性:刚被访问过的附近的数据很快会被访问。
  3. 层次结构设计 (The Hierarchy):构建了一个“金字塔”结构 (L0 寄存器 \to L1/L2/L3 缓存 \to 主存 \to 磁盘)。核心机制是 缓存 (Caching) —— 总是用更小、更快的上层作为更大、更慢下层的缓冲区。

Motivation
程序员想要一个**“无限大、无限快、无限便宜”**的存储器,但物理定律决定了速度越快造价越高、容量越小。
存储器层次结构利用程序的局部性创造了一个完美的幻觉:向 CPU 提供接近 SRAM 的速度,同时向程序员提供接近 磁盘的容量,从而解决了日益扩大的 CPU-Memory Gap

1. 存储技术 (Storage Technologies)

计算机利用多种不同的技术来存储信息,它们在速度、容量和成本上各不相同。

1.1 随机访问存储器 (RAM)

RAM 分为两类:静态 RAM (SRAM) 和 动态 RAM (DRAM)。

  • SRAM (Static RAM)

    • 原理:每个位使用 6 个晶体管存储。
    • 特性
      • 稳定:只要通电,数据就会保持,不需要刷新。
      • 抗干扰:对光和电噪声不敏感。
      • 速度:非常快(访问时间约 1x)。
      • 成本:非常贵,集成度低。
    • 用途:主要用于 CPU 的 高速缓存 (Cache Memories, L1/L2/L3)
  • DRAM (Dynamic RAM)

    • 原理:每个位使用 1 个晶体管和 1 个电容存储。
    • 特性
      • 不稳定:电容会漏电,必须周期性地刷新 (Refresh)(每几毫秒一次)。
      • 敏感:对干扰比较敏感。
      • 速度:比 SRAM 慢(访问时间约 10x)。
      • 成本:便宜,集成度非常高。
    • 用途:主要用于 主存 (Main Memory) 和图形帧缓冲区。
    • 增强型 DRAM
      • SDRAM (Synchronous DRAM):与系统时钟同步。
      • DDR (Double Data-Rate) SDRAM:在时钟的上升沿和下降沿都传输数据,提高了带宽 (DDR, DDR2, DDR3, DDR4, DDR5)。

1.2 非易失性存储器 (Nonvolatile Memory)

RAM 是易失的 (Volatile),断电后数据丢失。非易失性存储器在断电后仍能保存数据。

  • ROM (Read-Only Memory):在生产时编程。
  • Flash Memory (闪存):基于 EEPROM 技术,可以电擦除和重写。
    • SSD (固态硬盘) 就是基于闪存构建的。

1.3 磁盘存储 (Disk Storage)

  • 机械硬盘 (Rotating Disks)
    • 结构:由盘片 (Platters)、表面 (Surfaces)、磁道 (Tracks)、扇区 (Sectors) 和 柱面 (Cylinders) 组成。
    • 容量:由记录密度 (Recording density)、磁道密度 (Track density) 和面密度 (Areal density) 决定。
    • 访问时间 (Access Time):是机械运动时间,非常慢(毫秒级)。
      1. 寻道时间 (Seek Time):读写头移动到目标柱面的时间(最慢,约 3-9 ms)。
      2. 旋转延迟 (Rotational Latency):等待目标扇区转到读写头下的时间(取决于 RPM)。
      3. 传输时间 (Transfer Time):读取数据的时间(最快)。
    • 连接:通过 I/O 总线连接,使用 DMA (直接内存访问) 技术传送数据,不需要 CPU 干预。

1.4 固态硬盘 (SSD)

  • 结构:基于闪存 (Flash Memory)。数据按 页 (Page) 读写,按 块 (Block) 擦除。
  • 特性
    • 无机械部件,比机械硬盘快、省电、耐用。
    • 写操作复杂:在写入一个页之前,必须擦除整个块 (Block)。这导致写操作比读操作慢。
    • 磨损 (Wear out):每个块的擦除次数有限(约 100,000 次)。通过磨损均衡 (Wear Leveling) 逻辑来延长寿命。

1.5 存储技术趋势

  • SRAM:速度跟上 CPU,但容量小,价格贵。
  • DRAM:速度滞后于 CPU,主要提升容量。
  • Disk:容量巨大,但速度极慢。
  • CPU-Memory Gap:CPU 的速度提升远快于内存速度的提升,导致处理器和内存之间的性能差距不断扩大。这迫使我们必须使用存储器层次结构

2. 局部性原理 (Locality)

这是计算机程序的一个基本属性,也是存储器层次结构有效的基础。

定义:程序倾向于引用邻近于其他最近引用过的数据项的数据项,或者引用最近引用过的数据项本身。

2.1 两种局部性

  1. 时间局部性 (Temporal Locality)

    • 如果一个存储位置被引用了一次,那么它很可能在不久的将来再次被引用。
    • 例子:循环中的变量(如 sum 或循环计数器 i),循环体内的指令。
  2. 空间局部性 (Spatial Locality)

    • 如果一个存储位置被引用了一次,那么程序很可能在不久的将来引用其附近的存储位置。
    • 例子:按顺序访问数组元素(步长为 1)。

2.2 代码示例分析

  • 良好的局部性
    • 步长为 1 的数组访问 (Stride-1 reference pattern)。
    • 例如:sum += a[i] (C语言中数组行优先存储,按行遍历局部性好)。
  • 差的局部性
    • 大步长的跳转访问。
    • 例如:按列遍历二维数组 (Stride-N),这会导致大量的缓存未命中。

3. 存储器层次结构 (The Memory Hierarchy)

为了弥补 CPU 和主存/磁盘之间的速度差异,计算机系统采用了分层的存储结构。

3.1 层次结构设计

核心思想是:利用局部性原理,用上一层更小、更快的存储器作为下一层更大、更慢存储器的缓存 (Cache)。

  • L0: 寄存器 (Registers):CPU 内部,速度最快,容量最小。
  • L1: L1 高速缓存 (SRAM):在 CPU 芯片上,访问需几个周期。
  • L2: L2 高速缓存 (SRAM):在 CPU 芯片上,访问需十几个周期。
  • L3: L3 高速缓存 (SRAM):在 CPU 芯片上,多核共享。
  • L4: 主存 (Main Memory - DRAM):访问需几百个周期。
  • L5: 本地二级存储 (Local Disk):访问需几百万个周期。
  • L6: 远程存储 (Remote Storage):分布式文件系统,网络服务器。

3.2 缓存的概念 (Caches)

缓存是一个小而快的存储设备,它作为更大、更慢设备的缓冲区

  • 缓存命中 (Hit):CPU 需要的数据刚好在当前层 (Level k) 的缓存中。速度极快。
  • 缓存未命中 (Miss):数据不在当前层,需要从下一层 (Level k+1) 取回数据,并将其放入当前层(可能会替换掉某个现有的块)。

3.3 缓存未命中的类型 (3 C’s)

  1. 冷启动未命中 (Cold / Compulsory Miss)
    • 缓存是空的,第一次访问某个块时必然发生。
  2. 冲突未命中 (Conflict Miss)
    • 由于放置策略 (Placement Policy) 限制(例如哈希映射),多个数据块映射到了同一个缓存槽位,导致互相驱逐。即使缓存还有空位,也会发生。
    • 情况:缓存明明还有大量的空闲空间(Empty Space),但是你要访问的数据 A 和数据 B 根据映射规则(比如哈希取模),只能放在同一个坑位里
    • 后果:当你交替访问 AB 时,它们会互相把对方踢出去(Thrashing,颠簸),导致每次都未命中。
  3. 容量未命中 (Capacity Miss)
    • 活动数据集 (Working Set) 的大小超过了缓存的总容量,缓存装不下了。
    • 程序反复循环访问一个 1MB 的数组,但你的缓存只有 512KB。无论你怎么优化摆放位置,缓存都装不下这么多数据,旧数据必然会被挤出去。

3.4 总结

  • 存储器层次结构创建了一个巨大的存储池,其成本像底层存储一样便宜,但向程序提供数据的速度却像顶层存储一样快。
  • 理解存储器层次结构和局部性原理,对于编写高性能程序至关重要。

CSAPP - 08.MEM-01
https://yima-gu.github.io/2026/01/14/CSAPP/08-MEM-01/
作者
Yima Gu
发布于
2026年1月15日
许可协议