CSAPP - 08.MEM-01
计算机组成原理笔记:存储器层次结构 (The Memory Hierarchy)
主要内容:
本章探讨了如何通过架构设计来弥补 CPU 高速计算与存储器低速访问之间的巨大鸿沟。
- 存储技术 (Storage Technologies):分析了不同介质的物理特性与权衡。
- SRAM:快、贵、易失 (用于 CPU 缓存)。
- DRAM:较慢、较便宜、易失 (用于主存)。
- Disk/SSD:极慢、极便宜、非易失 (用于海量存储)。
- 局部性原理 (Locality):层次结构生效的理论基石。
- 时间局部性:刚被访问过的很快会被再次访问。
- 空间局部性:刚被访问过的附近的数据很快会被访问。
- 层次结构设计 (The Hierarchy):构建了一个“金字塔”结构 (L0 寄存器 L1/L2/L3 缓存 主存 磁盘)。核心机制是 缓存 (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):是机械运动时间,非常慢(毫秒级)。
- 寻道时间 (Seek Time):读写头移动到目标柱面的时间(最慢,约 3-9 ms)。
- 旋转延迟 (Rotational Latency):等待目标扇区转到读写头下的时间(取决于 RPM)。
- 传输时间 (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 两种局部性
-
时间局部性 (Temporal Locality):
- 如果一个存储位置被引用了一次,那么它很可能在不久的将来再次被引用。
- 例子:循环中的变量(如
sum或循环计数器i),循环体内的指令。
-
空间局部性 (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)
- 冷启动未命中 (Cold / Compulsory Miss):
- 缓存是空的,第一次访问某个块时必然发生。
- 冲突未命中 (Conflict Miss):
- 由于放置策略 (Placement Policy) 限制(例如哈希映射),多个数据块映射到了同一个缓存槽位,导致互相驱逐。即使缓存还有空位,也会发生。
- 情况:缓存明明还有大量的空闲空间(Empty Space),但是你要访问的数据
A和数据B根据映射规则(比如哈希取模),只能放在同一个坑位里。
- 后果:当你交替访问
A和B时,它们会互相把对方踢出去(Thrashing,颠簸),导致每次都未命中。
- 容量未命中 (Capacity Miss):
- 活动数据集 (Working Set) 的大小超过了缓存的总容量,缓存装不下了。
- 程序反复循环访问一个 1MB 的数组,但你的缓存只有 512KB。无论你怎么优化摆放位置,缓存都装不下这么多数据,旧数据必然会被挤出去。
3.4 总结
- 存储器层次结构创建了一个巨大的存储池,其成本像底层存储一样便宜,但向程序提供数据的速度却像顶层存储一样快。
- 理解存储器层次结构和局部性原理,对于编写高性能程序至关重要。
CSAPP - 08.MEM-01
https://yima-gu.github.io/2026/01/14/CSAPP/08-MEM-01/