存储层次

存储器层次结构、DRAM工作原理与存储系统组织

Posted by CloudingYu on April 22, 2026

一、存储器层次结构的动机

1.1 为什么存储器如此重要

打开体系结构顶会(如 ISCA)的论文集搜关键词,”memory” 的命中率远超 “instruction”、”parallel” 等词。原因是:

  • 在大多数系统中,带宽(Bandwidth)是瓶颈,而非计算本身。
  • 带宽就是”数据读不进来”——数据在 memory 里,CPU 拿不到就只能等。
  • 计算密集型场景很少,大部分场景都是存储受限(memory-bound)

1.2 存储系统的核心矛盾

存储器的两个永恒问题:

  1. 快的存储器一定贵:Cache > 内存 > SSD > HDD > 磁带
  2. 便宜的存储器一定慢:反过来排列

“老板又抠门又想要东西——能不能少花钱还变得快?”这就是 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 读操作流程

  1. CPU 将地址放上总线,发出”读”命令。
  2. 经过若干延迟,存储器准备好数据。
  3. 数据通过数据总线返回,装入目标寄存器(如 EAX)。

9.2 写操作流程

  1. CPU 将地址、数据和”写”命令同时放上总线。
  2. 存储器接收并存储数据。

9.3 RISC vs CISC 的存储器操作差异

特点 CISC(如 x86) RISC(如 RISC-V)
数据总线 地址和数据可复用 分离设计
指令设计 一条指令可同时访存和计算 Load/Store 与计算严格分离
设计哲学 省硬件,指令复杂 多用硬件,指令简单

RISC 的理念:”多用点硬件,让软件简单一点。”


十、数据可靠性与容灾存储

10.1 数据持久性的层次

从”照片怎么长期保存”引出存储可靠性话题:

方案 可靠性 问题
本地硬盘 硬盘可能损坏
云存储 服务商可能倒闭
多云备份 较高 成本增加
异地容灾 应对地震、洪水等
分布式(如区块链) 极高 只要一台机器存在就不丢

10.2 异地容灾备份(两地三中心)

  • 服务器机房通常在地下室——面临洪水风险。
  • “两地三中心”方案:在不同城市部署多个数据中心。
  • 即使一个城市遭遇灾难,其他城市的备份仍然存在。

十一、核心总结

  1. 存储器是现代计算系统的核心瓶颈,带宽问题比计算问题更普遍。
  2. 存储器按存取方式分为:随机存取(RAM)、顺序存取、直接存取、按内容检索(CAM)。
  3. SRAM 用 6 管结构,快但贵;DRAM 用 1 管 1 电容,便宜但需刷新。
  4. DRAM 刷新窗口为 64ms,按行刷新,开销约 1-2%。
  5. DRAM 通过地址复用(RAS/CAS 分时)减少引脚数,R = C 是最优设计。
  6. 存储器扩展有字扩展(扩容量)、位扩展(扩位宽)和交叉编址(提带宽)三种方式。
  7. 地址对齐避免跨边界访问的性能惩罚。
  8. CPU 通过北桥/南桥(或现代的集成内存控制器)连接存储器。
  9. PCB 上的蛇形走线是为了保证信号等长同步到达
  10. 数据可靠性需要多级冗余和异地容灾。