第 5 章 大且快:利用存储层级 (Large and Fast: Exploiting Memory Hierarchy)
核心结论
-
存储技术金字塔:寄存器(1 ns)→ L1 缓存(~1 ns)→ L2/L3 缓存(~10 ns)→ DRAM(~100 ns)→ SSD(~100 μs)→ HDD(~10 ms)——速度差 7 个数量级。
-
缓存基础(§5.3):直接映射 / N-路组相联 / 全相联;3 个字段 = tag / index / offset;替换策略 LRU / Random / FIFO。
-
缓存性能(§5.4):AMAT = Hit time + Miss rate × Miss penalty;3C 失效(compulsory / capacity / conflict);优化从降低 miss rate 入手。
-
虚拟内存(§5.7):页表 + TLB + 缺页处理;进程隔离 + 内存保护;OS / 硬件协作。
-
缓存一致性(§5.10):多核间 cache 同步——MESI 协议(Modified / Exclusive / Shared / Invalid);snooping / directory。
-
RAID(§5.11):0(条带)/ 1(镜像)/ 5(条带 + 单校验)/ 6(条带 + 双校验);可靠性 vs 性能权衡。
|
本章主旨
本章是计算机体系结构的"内存章"——理解 CPU 与 DRAM / 磁盘之间的速度鸿沟如何被 存储层级(缓存 / 虚拟内存 / RAID)弥合。CPU 再快,若内存跟不上,性能受限于"内存墙"。理解缓存原理才能写出 cache-friendly 代码(数据局部性)、理解虚拟内存才能理解 OS 与硬件的协作、理解 RAID 才能理解数据中心存储。 |
一、核心概念
本章围绕 6 个核心概念展开:从存储技术金字塔出发,介绍缓存基础与性能分析,再深入虚拟内存、缓存一致性、RAID 等高级主题。
| 概念 | 定义 + 重要性 | 实现提示 |
|---|---|---|
存储技术金字塔 |
寄存器 / 缓存 / DRAM / SSD / HDD 速度差 7 个数量级;容量 / 成本反相关。 |
§5.1-§5.2;存储层级的硬件基础。 |
缓存基础 |
直接映射 / N-路组相联 / 全相联;tag / index / offset 字段;替换策略。 |
§5.3;所有缓存设计的通用框架。 |
缓存性能分析 |
AMAT = Hit time + Miss rate × Miss penalty;3C 失效(compulsory / capacity / conflict)。 |
§5.4;优化缓存 = 降低 miss rate + miss penalty。 |
虚拟内存 |
页表 + TLB + 缺页;进程隔离 + 内存保护 + 按需分页。 |
§5.7;OS 与硬件协作管理内存。 |
缓存一致性 (MESI) |
Modified / Exclusive / Shared / Invalid;多核同步;snooping 总线 / directory。 |
§5.10;多核编程必须理解。 |
RAID |
0(条带)/ 1(镜像)/ 5 / 6 / 10;可靠性 / 性能 / 容量权衡。 |
§5.11;数据中心存储标准。 |
二、详细笔记
2.1 存储技术金字塔 (Memory Technology Pyramid)
What:从寄存器到 HDD 的存储层级,速度 / 容量 / 成本差异巨大。
Why:理解存储层级才能理解为什么"内存墙"是计算机性能的主要瓶颈。
How:
存储层级(§5.1-§5.2):
| 层级 | 访问时间 | 容量 | 典型用途 |
|---|---|---|---|
寄存器 |
~1 ns |
1 KB |
CPU 内部运算 |
L1 缓存 (SRAM) |
~1-2 ns |
32-64 KB / 核 |
CPU 立即访问 |
L2 缓存 (SRAM) |
~5-10 ns |
256-512 KB / 核 |
私有缓存 |
L3 缓存 (SRAM) |
~20-30 ns |
4-32 MB 共享 |
末级缓存 |
DRAM |
~50-100 ns |
8-64 GB |
主内存 |
SSD (NAND Flash) |
~50-200 μs |
256 GB - 4 TB |
持久存储 |
HDD |
~5-15 ms |
1-20 TB |
大容量归档 |
|
速度差异的工程意义
|
When:所有性能优化场景;硬件选型(内存 / SSD / HDD 比例);代码优化(cache-friendly data structures)。
Example:访问连续内存(数组)远快于链式访问(链表)——前者命中 cache,后者每跳都 miss。
2.2 缓存基础 (Cache Basics)
What:缓存用快速 SRAM 存储最近访问的内存块;命中 / 未命中决定性能。
Why:缓存是现代 CPU 性能的核心;理解后才能写 cache-friendly 代码。
How:
地址划分(§5.3):
-
Tag:高位,标识内存地址。
-
Index:定位 cache 行(组)。
-
Offset:定位块内字节。
3 种映射(§5.3):
-
直接映射:每个地址映射到固定 cache 行(简单但冲突)。
-
N-路组相联:每组 N 行,硬件并行比较 tag(平衡性能与复杂度)。
-
全相联:任何 cache 行都可放任何地址(最灵活但成本高)。
替换策略:LRU / Random / FIFO;LRU 接近最优但硬件昂贵。
|
cache 设计的工程权衡
|
When:所有 cache 设计;性能分析(conflict miss);算法设计(避免 hot-spot 冲突)。
Example:Intel Core i7 L1 是 8 路组相联(32 KB / 核);L2 是 8 路(256 KB / 核);L3 是 16 路共享。
2.3 缓存性能分析 (Cache Performance Analysis)
What:AMAT(Average Memory Access Time)= Hit time + Miss rate × Miss penalty。
Why:量化缓存性能;定位优化方向(命中时间 vs 失效率 vs 失效代价)。
How:
AMAT 公式(§5.4):
典型值:L1 hit = 1 ns、L1 miss = 10 ns(去 L2);miss rate = 5% ⇒ AMAT = 1 + 0.05 × 10 = 1.5 ns。
3C 失效(§5.4):
-
Compulsory miss:第一次访问某地址(不可避免)。
-
Capacity miss:cache 容量不够(工作集 > cache)。
-
Conflict miss:N-路组相联中多个地址映射到同一行(直接映射最严重)。
|
优化缓存的 4 个方向
|
When:所有性能优化;硬件选型(容量 / 相联度);代码优化(数据局部性)。
Example:数组顺序访问 for (i) sum += a[i] —— 时间局部性 + 空间局部性都很好,miss rate < 1%;链表访问则相反。
2.4 虚拟内存 (Virtual Memory)
What:用磁盘模拟比物理内存大的"虚拟"内存空间;OS 与硬件协作管理。
Why:进程隔离 + 内存保护 + 按需分页;现代 OS 的基础。
How:
虚拟内存机制(§5.7):
-
页表:每个进程一个页表,记录虚拟页 → 物理页的映射。
-
TLB(Translation Lookaside Buffer):页表项的硬件缓存(虚拟地址 → 物理地址)。
-
缺页:访问的虚拟页不在物理内存时,OS 从磁盘加载(典型 1-10 ms)。
地址转换(MMU):
|
虚拟内存的工程优势
|
When:OS 内核开发;性能分析(缺页率);编程(避免大内存工作集)。
Example:Linux 默认 4 KB 页;64-bit 虚拟地址空间 256 TB;进程独立地址空间。
2.5 缓存一致性 MESI (Cache Coherence)
What:多核间共享数据的 cache 同步协议——MESI(Modified / Exclusive / Shared / Invalid)。
Why:多核编程必须理解;否则会出现"数据不一致"的诡异 bug。
How:
MESI 状态(§5.10):
-
M(Modified):本核 cache 独占且已修改;其他核无此数据。
-
E(Exclusive):本核 cache 独占且未修改;其他核无此数据。
-
S(Shared):多个核 cache 都有此数据;未修改。
-
I(Invalid):本核 cache 数据无效(已过期)。
总线监听(snooping):
-
当某核写入 S 状态数据时,广播 Invalidate 消息;其他核把自己 cache 标记为 I。
-
当某核读 S 状态数据时,广播 Read 消息;其他核可保持 S。
-
协议保证一致性但有性能开销(总线流量)。
|
MESI 的工程权衡
|
When:多核编程;lock-free 算法;性能分析(false sharing)。
Example:std::atomic / __sync_lock_test_and_set 等原子操作依赖 MESI 保证;volatile 不保证顺序。
2.6 RAID (Redundant Arrays of Inexpensive Disks)
What:用多块廉价磁盘组合提供可靠性 + 性能。
Why:数据中心存储标准;理解 RAID 才能选型 + 配置。
How:
常见 RAID 级别(§5.11):
-
RAID 0:条带(striping),性能好但无冗余。
-
RAID 1:镜像(mirroring),可靠性高但容量减半。
-
RAID 5:条带 + 单校验,平衡性能 / 可靠性 / 容量。
-
RAID 6:条带 + 双校验,可容忍两块盘同时坏。
-
RAID 10(1+0):先镜像再条带,性能 + 可靠性都好但容量减半。
|
RAID 的工程权衡
|
When:存储选型;数据库 / 文件系统设计;数据中心运维。
Example:AWS EBS 默认 RAID;Linux mdadm 软件 RAID;硬件 RAID 卡。
三、关键图表
视觉图表
非可视化条目
|
非可视化条目(表 / 算法)
|
核心公式对照表
|
核心公式对照表
|
四、思维导图
mindmap
root((第 5 章 内存层级))
存储金字塔
SRAMDRAMFlashDisk
速度差7个量级
容量成本反相关
缓存基础
直接组相联全相联
tagindexoffset
LRU替换
缓存性能
AMAT公式
3Cmiss
命中时间失效率失效代价
虚拟内存
页表TLB
缺页处理
进程隔离
缓存一致性
MESI状态
snooping
false sharing
RAID
0条带1镜像
5单校验6双校验
性能容量可靠性
五、重点与易错点
-
存储层级速度差异 7 个数量级:访问模式决定性能;cache-friendly 代码比"快算法"更重要。
-
AMAT 公式优化 3 个变量:hit time / miss rate / miss penalty;任一项优化都提升性能。
-
3C miss 的工程对策:compulsory(预取 / 大块)、capacity(更大 cache)、conflict(更高相联度)。
-
MESI 协议是硬件自动维护的:程序员无需关心(除非写 lock-free 代码);
volatile与 atomic 不同。 -
false sharing 性能杀手:两个独立变量共享同一 cache 行,写入会触发"snoop invalidation"——padding 解决。
-
虚拟内存按需分页:进程启动时不立即加载全部;首次访问触发缺页加载。
-
TLB miss 代价高:一次 TLB miss 需走页表(典型 100 ns+);大页(HugePage)减少 TLB miss。
-
RAID 5 写性能差:每次写需读-改-写(4 IOPS);写密集场景用 RAID 10。
-
跨章衔接:第 4 章 CPU 微架构用本章缓存加速;第 6 章多核用本章 MESI;附录 D 介绍 ARM Cortex-A53 与 Intel Core i7 的实际内存层级。