内存层次
Memory Hierarchy
用 SRAM/DRAM/磁盘构建多级存储,在速度、容量、成本间取舍。
内存层次结构(Memory Hierarchy)利用局部性原理,将不同速度、容量、成本的存储设备组织成金字塔形结构。从上到下:寄存器(~1ns,KB级)→ L1缓存(~1ns,32-64KB)→ L2缓存(~4ns,256KB-1MB)→ L3缓存(~10ns,数MB)→ 主存DRAM(~100ns,数GB)→ SSD(~100μs,数TB)→ HDD(~10ms,数TB)。缓存基于时间局部性(最近访问的数据很可能再次访问)和空间局部性(相邻数据很可能被访问)。缓存映射策略包括直接映射、全相联、组相联。替换策略包括 LRU、FIFO、随机替换。TLB(Translation Lookaside Buffer)缓存虚拟地址到物理地址的映射。
CPU 速度远快于内存速度(摩尔定律使 CPU 速度每 18 个月翻倍,而内存速度提升缓慢)。如果每次内存访问都等待 100 个时钟周期,CPU 将大部分时间空闲。缓存通过在 CPU 和主存之间插入快速存储,利用局部性原理将平均访问延迟降低到接近 L1 缓存水平。没有缓存,现代 CPU 的性能将下降 10-100 倍。内存层次是计算机系统中最重要的性能优化手段之一。
程序员通过内存访问模式间接影响缓存性能。理解内存层次有助于理解:为什么数组按行遍历比按列遍历快(空间局部性);为什么链表遍历比数组慢(缓存不友好);为什么循环展开能提升性能(减少缓存未命中)。性能分析工具(如 perf、cachegrind)可以测量缓存命中率。虚拟内存通过页表和 TLB 实现地址转换,使每个进程拥有独立的地址空间。
Bottom-up:由下层如何构建
本层建立在以下层级之上:
Top-down:向上暴露什么接口
Programmer View:程序员视角
我能操作吗?
通过内存地址访问。高级语言中通过变量、数组、指针间接使用。可通过 prefetch 指令预取数据。
成本模型
| 指标 | 量级 | 备注 |
|---|---|---|
| L1 缓存命中 | ~1 ns(4 周期) | 32-64KB,最快 |
| L2 缓存命中 | ~4 ns(12 周期) | 256KB-1MB |
| L3 缓存命中 | ~10 ns(40 周期) | 数 MB,共享 |
| 主存访问 | ~100 ns(300 周期) | DRAM,缓存未命中时 |
| SSD 访问 | ~100 μs | 比内存慢 1000 倍 |
| HDD 访问 | ~10 ms | 比内存慢 100000 倍 |
常见陷阱
- !缓存未命中(Cache Miss):访问不在缓存中的数据,需等待 100+ 周期从主存加载。热点数据应尽量保持在缓存中
- !假共享(False Sharing):多核修改同一缓存行的不同变量,导致缓存行在核心间频繁传递,性能下降
- !TLB Miss:虚拟地址转换缓存未命中,需遍历页表(多级页表可能需 4 次内存访问),延迟增加