一、存储器层次结构的动机
1.1 为什么存储器如此重要
打开体系结构顶会(如 ISCA)的论文集搜关键词,”memory” 的命中率远超 “instruction”、”parallel” 等词。原因是:
- 在大多数系统中,带宽(Bandwidth)是瓶颈,而非计算本身。
- 带宽就是”数据读不进来”——数据在 memory 里,CPU 拿不到就只能等。
- 计算密集型场景很少,大部分场景都是存储受限(memory-bound)。
1.2 存储系统的核心矛盾
存储器的两个永恒问题:
- 快的存储器一定贵:Cache > 内存 > SSD > HDD > 磁带
- 便宜的存储器一定慢:反过来排列
“老板又抠门又想要东西——能不能少花钱还变得快?”这就是 Cache 要解决的核心问题。
1.3 存储器层次一览
| 层次 | 介质 | 特点 |
|---|---|---|
| 寄存器 | 触发器 | 最快、最小、最贵 |
| Cache | SRAM | 片上,速度快,容量有限 |
| 主存 | DRAM | 容量较大,需要刷新 |
| 固态硬盘 | Flash/SSD | 非易失,1-2TB 常见 |
| 机械硬盘 | 磁盘 | 容量大,有物理旋转延迟 |
| 磁带/光盘 | 磁/光介质 | 归档用,容量大,访问慢 |
二、存储器分类
2.1 按存取方式分类
随机存取存储器(RAM, Random Access Memory)
- 给任意地址,立即返回该地址的数据。
- 访问时间与地址无关——任何位置访问速度相同。
顺序存取存储器(Sequential Access Memory)
- 典型代表:磁带。
- 要听最后一首歌,必须从头快进到末尾。
- 只能按照存储顺序来读写。
直接存取存储器(Direct Access Memory)
- 典型代表:磁盘。
- 可以直接定位到某个”块”,但块内仍需等待旋转到正确位置。
- 比磁带好,但仍涉及物理旋转,比电子存取慢几千倍。
只要涉及物理旋转/机械运动,和纯电子操作就差几千到几万倍。
按内容检索存储器(CAM, Content-Addressable Memory)
- 普通存储器:给地址 → 返回数据。
- CAM 反过来:给数据 → 返回地址(或匹配标志)。
- 典型应用:TLB(快表)。
2.2 按存储介质分类
| 介质 | 示例 | 特点 |
|---|---|---|
| 半导体 | SRAM、DRAM、Flash | 电子访问,速度快 |
| 磁性 | 磁盘、磁带 | 容量大,有机械部件 |
| 光学 | CD、DVD、蓝光 | 成本低,适合归档 |
2.3 按读写能力分类
- RAM(可读可写):主存、Cache。
- ROM(只读):存放 BIOS 启动代码等固件。ROM 的意义在于:
- 程序出厂后不应被用户修改。
- 保证计算机上电后有代码可执行(自检程序)。
- 恶劣环境下防止意外覆写。
2.4 易失性 vs 非易失性
| 类型 | 示例 | 特点 |
|---|---|---|
| 易失性(Volatile) | SRAM、DRAM | 断电即丢 |
| 非易失性(Non-volatile) | Flash、ROM、磁盘 | 断电保持 |
三、SRAM 与 DRAM 对比
3.1 SRAM(静态随机存取存储器)
- 每个存储单元使用 6 个晶体管(两个交叉耦合的反相器 + 两个访问管)。
- 只要供电就保持数据,不需要刷新。
- 非破坏性读出:读操作不会改变存储内容。
- 速度极快,但面积大、功耗高、成本高。
- 用于 Cache。
3.2 DRAM(动态随机存取存储器)
- 每个存储单元使用 1 个晶体管 + 1 个电容。
- 数据以电荷形式存储在电容中。
- 电容会漏电,必须定期刷新。
- 破坏性读出:读操作会放掉电容中的电荷,读后必须重写(恢复)。
- 集成度高、功耗低、成本低。
- 用于主存。
3.3 SRAM vs DRAM 对比
| 特性 | SRAM | DRAM |
|---|---|---|
| 存储元件 | 6 个晶体管 | 1 个晶体管 + 1 个电容 |
| 是否需要刷新 | 不需要 | 需要(约 64ms 一次) |
| 读出方式 | 非破坏性 | 破坏性(读后需恢复) |
| 速度 | 极快 | 较慢 |
| 集成度 | 低 | 高 |
| 功耗 | 较高 | 较低 |
| 成本 | 高 | 低 |
| 用途 | Cache | 主存 |
四、DRAM 刷新机制
4.1 为什么需要刷新
DRAM 靠电容存电荷,但电容会随时间漏电。如果不定期”充电”(刷新),数据就会丢失。
4.2 刷新参数
典型规格(以 16Mbit DRAM 为例):
- 刷新窗口:64 毫秒内必须将所有行刷新一遍。
- 行数:4096 行。
- 每行刷新间隔:$64\text{ms} / 4096 = 15.625\,\mu\text{s}$。
- 刷新方式:按行刷新——刷新一行就相当于重新写入该行所有数据。
4.3 刷新对性能的影响
- 刷新期间该行不可被正常访问。
- 总刷新开销约占 1%~2% 的存储器带宽。
- 这是一个无法避免的性能天花板。设计存储系统时必须考虑这 1-2% 的不可用时间。
五、DRAM 地址复用与组织结构
5.1 二维存储阵列
DRAM 采用二维阵列组织:行(Row)× 列(Column)。
- 先发送行地址(RAS, Row Address Strobe)选中一整行。
- 再发送列地址(CAS, Column Address Strobe)选中具体列。
5.2 地址线复用(Address Multiplexing)
为了减少芯片引脚数,DRAM 将行地址和列地址通过同一组地址线分时发送:
- 第一次传送:行地址 → RAS 信号锁存。
- 第二次传送:列地址 → CAS 信号锁存。
示例:16Mbit DRAM
- 11 根地址线,分两次发送。
- 第一次 11 位 → 选择 $2^{11} = 2048$ 行之一。
- 第二次 11 位 → 选择 $2^{11} = 2048$ 列之一。
- 总寻址能力:$2^{22} = 4\text{M}$ 个存储单元。
5.3 R = C 设计原则
DRAM 设计中行数(R)应等于列数(C):
- 最小化引脚数:行列用同一组地址线,R = C 时引脚利用率最高。
- 最小化刷新开销:刷新按行进行,行数越少刷新次数越少。但过少的行意味着每行太长,也不利于性能。
- 最优折中:R = C 时,给定总容量下,行数最少且引脚最少。
每增加一根地址线,行和列各翻倍,总容量增加 4 倍。
5.4 位平面(Bit Plane)
一个 DRAM 芯片内部可包含多个位平面:
- 例如 16Mbit DRAM 有 4 个位平面。
- 每次访问,4 个位平面同时输出 1 位,共输出 4 位。
- 两个这样的芯片组合可提供 8 位(1 字节)输出。
六、存储器扩展
6.1 字扩展(地址扩展)
用多个芯片扩大地址空间:
示例:用 4 片 16K×8bit 芯片扩展为 64K×8bit
- 高 2 位地址用外部译码器选片:
- 00 → Chip 1(地址 0x0000 ~ 0x3FFF)
- 01 → Chip 2(地址 0x4000 ~ 0x7FFF)
- 10 → Chip 3(地址 0x8000 ~ 0xBFFF)
- 11 → Chip 4(地址 0xC000 ~ 0xFFFF)
- 低 14 位地址直接送入被选中的芯片。
问题:连续数据全部集中在一个芯片中,该芯片成为 I/O 瓶颈。
6.2 位扩展(数据宽度扩展)
用多个芯片并行输出以加宽数据位:
示例:用 4 片 64K×8bit 芯片组成 64K×32bit 存储器
- 4 个芯片接收相同地址。
- 每个芯片输出 8 位,4 个芯片并行输出 32 位。
- 所有芯片同时工作,带宽翻 4 倍。
6.3 交叉编址(Interleaved Memory)
结合字扩展和位扩展的优点:
- 连续地址分布在不同芯片上(低位交叉编址)。
- 连续访问时多个芯片可流水线式工作。
- 避免单芯片瓶颈,提高带宽利用率。
七、地址对齐(Address Alignment)
7.1 什么是地址对齐
数据在内存中的起始地址应为其大小的整数倍:
- 4 字节数据应从 4 的倍数地址开始。
- 8 字节数据应从 8 的倍数地址开始。
7.2 对齐 vs 不对齐的性能差异
| 情况 | 操作 |
|---|---|
| 读地址 8~11(对齐) | 一次访问即可取出 |
| 读地址 6~9(不对齐) | 需要两次访问,再拼接 |
不对齐访问导致:
- 需要额外的总线周期。
- 可能跨越 Cache 行边界,导致两次 Cache 访问。
- 性能惩罚显著。
7.3 地址划分示例
以 27 位主存地址为例:
| 字段 | 用途 |
|---|---|
| 高 24 位 | 确定行、列、片选 |
| 低 3 位 | 确定 8 字节内的具体字节 |
八、CPU 与存储器的连接
8.1 北桥与南桥架构
传统 PC 架构中,CPU 通过芯片组(Chipset)连接外设:
| 组件 | 连接对象 | 特点 |
|---|---|---|
| 北桥(North Bridge) | 内存、GPU | 高速总线,离 CPU 近 |
| 南桥(South Bridge) | 硬盘、USB、音频、网卡 | 低速总线,离 CPU 远 |
- FSB(前端总线,Front Side Bus):连接 CPU 和北桥的高速通道。
- 现代处理器已将内存控制器集成到 CPU 内部,北桥功能被吸收。
8.2 信号传播与物理约束
- 光速:$3 \times 10^8$ m/s。
- 在 1GHz 时钟下,一个周期信号仅能传播约 30 cm。
- PCB 上的走线长度直接影响信号同步。
8.3 蛇形走线(Serpentine Routing)
主板上经常看到弯弯曲曲的走线,原因:
- 不同信号线的物理距离不同。
- 短线需要人为绕弯(蛇形)以增加长度。
- 目的:使所有信号线等长,保证信号同时到达。
- 这叫做等长布线(Length Matching)。
九、存储器读写操作
9.1 读操作流程
- CPU 将地址放上总线,发出”读”命令。
- 经过若干延迟,存储器准备好数据。
- 数据通过数据总线返回,装入目标寄存器(如 EAX)。
9.2 写操作流程
- CPU 将地址、数据和”写”命令同时放上总线。
- 存储器接收并存储数据。
9.3 RISC vs CISC 的存储器操作差异
| 特点 | CISC(如 x86) | RISC(如 RISC-V) |
|---|---|---|
| 数据总线 | 地址和数据可复用 | 分离设计 |
| 指令设计 | 一条指令可同时访存和计算 | Load/Store 与计算严格分离 |
| 设计哲学 | 省硬件,指令复杂 | 多用硬件,指令简单 |
RISC 的理念:”多用点硬件,让软件简单一点。”
十、数据可靠性与容灾存储
10.1 数据持久性的层次
从”照片怎么长期保存”引出存储可靠性话题:
| 方案 | 可靠性 | 问题 |
|---|---|---|
| 本地硬盘 | 低 | 硬盘可能损坏 |
| 云存储 | 中 | 服务商可能倒闭 |
| 多云备份 | 较高 | 成本增加 |
| 异地容灾 | 高 | 应对地震、洪水等 |
| 分布式(如区块链) | 极高 | 只要一台机器存在就不丢 |
10.2 异地容灾备份(两地三中心)
- 服务器机房通常在地下室——面临洪水风险。
- “两地三中心”方案:在不同城市部署多个数据中心。
- 即使一个城市遭遇灾难,其他城市的备份仍然存在。
十一、核心总结
- 存储器是现代计算系统的核心瓶颈,带宽问题比计算问题更普遍。
- 存储器按存取方式分为:随机存取(RAM)、顺序存取、直接存取、按内容检索(CAM)。
- SRAM 用 6 管结构,快但贵;DRAM 用 1 管 1 电容,便宜但需刷新。
- DRAM 刷新窗口为 64ms,按行刷新,开销约 1-2%。
- DRAM 通过地址复用(RAS/CAS 分时)减少引脚数,R = C 是最优设计。
- 存储器扩展有字扩展(扩容量)、位扩展(扩位宽)和交叉编址(提带宽)三种方式。
- 地址对齐避免跨边界访问的性能惩罚。
- CPU 通过北桥/南桥(或现代的集成内存控制器)连接存储器。
- PCB 上的蛇形走线是为了保证信号等长同步到达。
- 数据可靠性需要多级冗余和异地容灾。