内存基础与 DRAM 工作原理
第二章讲完了 CPU。一颗 96 核的 CPU 每秒可以做几百亿次运算,但所有运算都依赖于数据从内存读进来。内存这一层的特性,决定了 CPU 能不能真正跑满。第三章从内存的物理基础讲起。
计算机里的”内存”到底是什么
广义的”内存”(Memory)泛指任何能存数据的存储介质。但在服务器语境下,“内存”特指主存(Main Memory)——也就是 CPU 直接通过地址总线访问的、断电即失的 RAM(Random Access Memory)。
按存取速度从快到慢:
graph LR REG[寄存器
~1 cycle
KB 级] L1[L1 Cache
~4 cycle
32-64 KB] L2[L2 Cache
~12 cycle
1-4 MB] L3[L3 Cache
~40 cycle
32-512 MB] MAIN[主存 DRAM
~200 cycle
GB 级] SSD[SSD
~10 万 cycle
TB 级] HDD[HDD
~千万 cycle
TB 级] REG --> L1 --> L2 --> L3 --> MAIN --> SSD --> HDD
主存 = DRAM。寄存器和 Cache 是 SRAM,SSD/HDD 不在主存层。
SRAM vs DRAM 的本质区别
两种 RAM 都是易失性,但内部结构完全不同:
SRAM:6 个晶体管存 1 bit
1 | |
- 6 个 MOSFET 组成两个交叉耦合的反相器(4 管)+ 2 个访问门
- 只要供电就稳定保持值,不需要刷新
- 速度极快(~1 ns 级),功耗低
- 缺点:6T 一格,密度低,价格贵——所以只用在 Cache 里
DRAM:1 晶体管 + 1 电容存 1 bit
1 | |
- 1T1C 结构:一个晶体管 + 一个电容
- 密度极高,同等面积下可做 SRAM 的几十倍
- 致命问题:电容会漏电,必须周期性刷新(典型 64 ms 刷新一次)
- 延迟更高:访问需要充电、放大、写回——一次完整读访问要 30-50 ns
一张对比表
| 特性 | SRAM | DRAM |
|---|---|---|
| 单元结构 | 6T | 1T1C |
| 密度 | 低 | 高(~30 倍) |
| 速度 | 极快(~1 ns) | 较慢(30-50 ns) |
| 功耗 | 静态低 | 静态高(要刷新) |
| 价格 | 贵 | 便宜 |
| 用途 | Cache、寄存器 | 主存、显存基础 |
SRAM 不能取代 DRAM 当主存——做出来你也买不起。
DRAM 单元怎么组织成内存条
单个 1T1C 太小,DRAM 里要用几十亿个组合在一起。
1. 阵列(Array)
最基础的单位是一个矩形阵列:行(Row)×列(Column)。每一行的所有电容共用一条字线(WL),每一列共用一条位线(BL)。
graph TB
subgraph ARRAY["DRAM 阵列(一个 mat / subarray)"]
direction TB
WL0["Word Line 0"] --- C00 & C01 & C02
WL1["Word Line 1"] --- C10 & C11 & C12
BL0["BL0"] --- C00 & C10
BL1["BL1"] --- C01 & C11
BL2["BL2"] --- C02 & C12
end
SA[Sense Amplifier 行] --- BL0 & BL1 & BL2
读一行的过程:
- 字线拉高,把整行的电容连到位线上
- 电容里的电荷通过位线引起微小电压变化
- Sense Amplifier(灵敏放大器)把微小变化放大成 0/1
- 整行被读出,放进行缓冲区
- 列地址再选出要的那个 bit
关键洞察:DRAM 读一个 bit 实际上读的是整行——所以”局部性”对 DRAM 性能至关重要。
2. Bank(库)
一个阵列规模有限。多个阵列组合成一个 Bank:
- 每个 Bank 有自己的行缓冲区
- 不同 Bank 可并行操作(一个 Bank 读,另一个 Bank 刷新)
- DDR4 一般 16 个 Bank,DDR5 是 32 个 Bank
3. Rank(颗粒组)
多个 DRAM 颗粒一起拼成一个总线宽度的字:
- DDR4 标准是 64 bit 数据宽(不算 ECC)
- 用 8 颗 ×8 颗粒 或 16 颗 ×4 颗粒 拼出 64 bit
- 这一组颗粒同时被同一组 CS 信号选中 = 1 个 Rank
- 一根条上可以有 1 Rank(单面)或 2 Rank(双面),ECC 服务器条很多是 2R 甚至 4R
4. 内存条(DIMM)
1 | |
服务器条都是 DIMM(Dual In-line Memory Module,288 pin DDR5)——注意是 DIMM,1990 年代之前是 SIMM。
一次内存访问的完整过程
sequenceDiagram participant CPU participant MC as 内存控制器 participant DIMM CPU->>MC: 物理地址 0x1234ABCD MC->>MC: 地址映射 → Channel/Rank/Bank/Row/Col MC->>DIMM: ACT (激活行) Note over DIMM: 行打开,进入行缓冲区 MC->>DIMM: RD (列读) DIMM-->>MC: 数据(多 burst) MC-->>CPU: 64B cacheline Note over MC,DIMM: 后续可能 PRE (预充电关行)
关键时序:
| 参数 | 含义 | 典型值(DDR5-6400) |
|---|---|---|
| tRCD | RAS to CAS Delay | ~16 ns |
| tCL / CAS Latency | 列地址到数据 | ~16 ns |
| tRAS | 行激活到预充电 | ~32 ns |
| tRP | 预充电时间 | ~16 ns |
| tRC | tRAS + tRP(行循环) | ~48 ns |
内存条上的”6400-46-46-46“就是 tCL-tRCD-tRP-tRAS 这几个数(单位是周期)。
Row Buffer Hit / Miss
- Row Buffer Hit:访问的行已经在行缓冲区——只需要 tCL
- Row Buffer Miss:要访问的行不在缓冲区——需要 PRE + ACT + tCL,延迟翻三倍
这是为什么连续访问性能远高于随机访问——前者命中率高。
为什么 DRAM 一直跑不快
工艺迭代主要让 DRAM 更密更省,但延迟几乎没降:
1 | |
CL 周期数变多,但每个周期变短,绝对延迟基本停留在 13-16 ns。
物理原因:
- 电容充放电时间受材料和工艺约束,难以继续缩短
- 提高频率主要靠预取(prefetch)+ 流水化——把多次串行变成一次并行,但单次延迟没变
- 单元密度提高反而带来更小的电容、更长的位线、更复杂的纠错——延迟优化压力变大
DRAM 的演进一直是”增带宽不降延迟”——这就是为什么有了 HBM、CXL 等等”曲线救国”的方案。
一张总结
1 | |
小结
- 内存特指主存 DRAM,区别于 Cache(SRAM)和 SSD
- 1T1C 让 DRAM 比 SRAM 密度高 30 倍,代价是要刷新 + 速度慢
- DRAM 的层次结构:Cell → Array/mat → Bank → Rank → DIMM → Channel
- 一次内存访问要经历 ACT → RD → PRE,受制于 tRCD/tCL/tRP 等时序
- 最关键的物理事实:DRAM 频率/带宽涨了 30 倍,但绝对延迟二十年只降了一半
下一篇讲 DDR1 到 DDR5 的演进,看带宽是怎么一步步涨到 8 GT/s 以上的。