为什么内存比硬盘快 10 万倍?存储层次一次讲透
你的电脑里,最快的存储比最慢的快 10 万倍以上。为什么不用"又快又大又便宜"的存储一劳永逸?因为物理和经济都不允许。今天把整个存储系统摊开:它为什么长成"金字塔"的形状,每一层凭什么待在那个位置,以及工程师最容易踩的坑。
一、先看一张表:存储金字塔
| 层级 | 介质 | 典型容量 | 访问延迟 | 易失性 |
|---|---|---|---|---|
| 寄存器 | 触发器 | 几十~几百字节 | 0.25 ns | 易失 |
| L1/L2/L3 Cache | SRAM | KB~几十 MB | 1~15 ns | 易失 |
| 主存 | DRAM | GB 量级 | 80 ns | 易失 |
| SSD | NAND 闪存 | 百 GB~TB | 50 μs | 非易失 |
| HDD | 磁介质 | TB 量级 | 5 ms | 非易失 |
读出三件事:
- 从寄存器到 HDD,延迟跨 6 个数量级(约 2000 万倍)、容量跨 10 个数量级、单位成本反过来降若干个数量级
- 易失性分界线在主存:主存及以上断电即丢,外存开始断电不丢
- 越上层越"贵得用不起大容量",越下层越"慢得等不起"——金字塔是被这两条曲线夹出来的
二、为什么不能"一劳永逸"?
做个思想实验:如果存在一种存储,速度像寄存器、容量像硬盘、价格像沙子、断电不丢——那今天的一切都不需要了。
可惜现实里这四个属性互相打架:
- 快的存储靠更多晶体管、更精细工艺、更靠近 CPU——面积大、成本高、做不大
- 大的存储把比特塞得密(一个晶体管带一个电容)——代价是慢、还要定期刷新
- 非易失意味着"物理状态切换"(浮栅/磁性/相变)——天然比翻转锁存器慢
所以系统只能分层:CPU 旁边放一小撮最快最贵的,解决"马上要用的数";往外逐级放大而慢的,解决"暂时不用但要留着的数"。
三、核心机制:局部性(为什么分层能成立)
分层能成立有一个前提——程序访问有局部性:热数据很少、而且会反复来。没有局部性,分层就退化成"买不起的大存储"。
Cache 就是"把热数据往上提一级",预取器是"提前提",页缓存是"把最近用过的文件页留在主存"——全是同一件事在不同尺度上的重演:用层级去匹配访问的热度。
四、代码演示:亲手感受层级鸿沟
import numpy as np
# 存储层次典型量级
levels = [
("寄存器", 0.25e-9, 512, "极贵", "易失"),
("L1 Cache", 1e-9, 64e3, "很贵", "易失"),
("L2 Cache", 5e-9, 512e3, "很贵", "易失"),
("L3 Cache", 15e-9, 8e6, "贵", "易失"),
("主存 DRAM", 80e-9, 16e9, "中等", "易失"),
("SSD", 50e-6, 1e12, "便宜", "非易失"),
("HDD", 5e-3, 4e12, "极便宜", "非易失"),
]
print(f"{'层级':<12} {'延迟':>10} {'容量':>8} {'成本':>6} 易失")
for name, lat, cap, cost, vol in levels:
print(f"{name:<12} {lat*1e9:>8.1f}ns {cap/1e3:>7.0f}KB {cost:>6} {vol}")
print(f"\n主存 vs SSD: {50e-6/80e-9:.0f} 倍")
print(f"主存 vs HDD: {5e-3/80e-9:.0f} 倍")
print("\n100 万次访问,缓存命中率影响:")
np.random.seed(0)
n = 1_000_000
for hit in [0.99, 0.90, 0.50]:
t = n * (hit*1e-9 + (1-hit)*80e-9)
print(f" 命中率{hit:.0%}: 总耗时 {t*1000:.1f} ms")
运行输出:
层级 延迟 容量 成本 易失
寄存器 0.2ns 1KB 极贵 易失
L1 Cache 1.0ns 64KB 很贵 易失
L2 Cache 5.0ns 512KB 很贵 易失
L3 Cache 15.0ns 8000KB 贵 易失
主存 DRAM 80.0ns 16000000KB 中等 易失
SSD 50000.0ns 1000000000KB 便宜 非易失
HDD 5000000.0ns 4000000000KB 极便宜 非易失
主存 vs SSD: 625 倍
主存 vs HDD: 62500 倍
100 万次访问,缓存命中率影响:
命中率99%: 总耗时 1.8 ms
命中率90%: 总耗时 8.9 ms
命中率50%: 总耗时 40.5 ms
看懂了吗:主存比 HDD 快 6.25 万倍(这就是"10 万倍"说法的由来);而缓存命中率从 99% 掉到 50%,同样 100 万次访问耗时翻了 22 倍——程序快不快,很大程度取决于数据待在哪一层。
五、避坑清单
- "NVMe 很快"是错觉:NVMe 再快也比主存慢上千倍,外存快只意味着"加载到内存"不那么痛苦,不改变运行时层级鸿沟
- 跨级搬运最贵:一次 Cache 缺失去主存,几百个周期;一次去外存,几十万个周期起步。系统 99% 的"等"都花在跨层级那几跳
- 别把外存当内存用:频繁 swap、反复同步落盘,程序瞬间卡成幻灯片——数据待错了层级
- 寄存器不是"更小更快的内存":内存按地址访问,寄存器按指令字段直接编址,是架构级的存在
- 性能剖析盯三个指标:page fault、major fault、磁盘等待——它们都指向"数据待错层级"
六、想系统学计算机体系结构?
本文精选自 ima 知识号【Kruptos】《存储与总线架构详解》订阅库(第 003 期存储层次结构全景、第 004 期 SRAM 与 DRAM 物理差异等 100 期系统教程,从存储墙、Cache、总线拓扑到 DMA、一致性协议,每期配可运行 Python 代码)。
📚 完整系列 100 期 + 配套代码,已在 ima 知识号发布
本文只是系列的一个切片。完整系列(100 期系统教程 + 每期可运行代码)在 ima 知识号【Kruptos】持续更新中:
- 🗂 67+ 技术知识库:信号与系统、SDR 软件无线电、数字信号处理、操作系统、AI Agent、大模型微调……几乎覆盖全部软硬件技术栈
- 🧠 8 款 AI 技能:系列生产、知识库管理、CMMI 受管开发、自进化 Agent 等,已在 ima 技能广场上架,即装即用
- ✅ 全部免费订阅,后续更新自动推送
🔍 订阅方式:打开 ima(腾讯智能工作台)→ 搜索「Kruptos」→ 一键订阅。或在 ima 内直接搜索《存储与总线架构详解》等知识库名称。
作者:Kruptos(西电毕业,13 年无线通信/DSP/嵌入式科研)|原创内容,转载注明出处

361

被折叠的 条评论
为什么被折叠?



