L5·10^9 – 10^11

内存层次

Memory Hierarchy

核心抽象存储与缓存

用 SRAM/DRAM/磁盘构建多级存储,在速度、容量、成本间取舍。

学习进度:
What

内存层次结构(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)缓存虚拟地址到物理地址的映射。

Why

CPU 速度远快于内存速度(摩尔定律使 CPU 速度每 18 个月翻倍,而内存速度提升缓慢)。如果每次内存访问都等待 100 个时钟周期,CPU 将大部分时间空闲。缓存通过在 CPU 和主存之间插入快速存储,利用局部性原理将平均访问延迟降低到接近 L1 缓存水平。没有缓存,现代 CPU 的性能将下降 10-100 倍。内存层次是计算机系统中最重要的性能优化手段之一。

How

程序员通过内存访问模式间接影响缓存性能。理解内存层次有助于理解:为什么数组按行遍历比按列遍历快(空间局部性);为什么链表遍历比数组慢(缓存不友好);为什么循环展开能提升性能(减少缓存未命中)。性能分析工具(如 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 次内存访问),延迟增加