存储系统
存储系统的层次结构
存储系统是计算机体系结构的核心组成部分之一,用于存储程序指令和数据,以支持处理器的运算需求。为了平衡速度、容量和成本,现代计算机采用了分层存储体系结构,从最快速但容量有限的 寄存器 到容量大但速度较慢的辅助存储设备,形成了存储层次结构。
如上图所示,越靠近金字塔上层的容量越小但速度越快,越靠近金字塔下层的容量越大但速度越慢。计算机的存储系统包含以下层次:
- 寄存器(Registers)
- 寄存器是位于处理器内部的最快速存储单元。
- 它们提供极快的数据访问速度,但其容量非常有限。
- 典型访问延迟:约 0.2~1 ns(通常只需 1 个 CPU 时钟周期)。
- 一级缓存(L1 Cache)
- L1 缓存位于处理器内部,比寄存器空间稍大,速度比 L2 和 L3 Cache 更快。
- 它通常分为 数据缓存(用于存储数据)和 指令缓存(用于存储指令)。
- 典型访问延迟:约 0.5~1.5 ns(约 2~5 个 CPU 时钟周期)。
- 二级缓存(L2 Cache)
- L2 缓存比 L1 缓存大,并且位于处理器和主内存之间。
- 它的速度比 L1 慢,但比主内存快。
- 典型访问延迟:约 2~5 ns(约 10~20 个 CPU 时钟周期)。
- 三级缓存(L3 Cache)
- 在某些系统中,还有 L3 缓存,这是一种更大但速度更慢的缓存。
- 它位于 L2 缓存和主内存之间,旨在进一步减少对主内存的访问。
- 多个 CPU 核心通常共享同一个 L3 Cache。
- 典型访问延迟:约 10~20 ns(约 30~70 个 CPU 时钟周期)。
- 主存(RAM)
- 就是我们常说的内存,比缓存慢,但比硬盘快得多,并且容量比缓存大。
- 主存 用于存储正在运行的程序和当前使用的数据。
- 典型访问延迟:约 50~100 ns(约 150~300 个 CPU 时钟周期)。
- 辅助存储(如硬盘驱动器或固态驱动器)
可以发现,相邻两层存储器之间通常都存在 数倍甚至数十倍 的速度差异。例如,从 L3 Cache 访问数据只需十几纳秒,而访问 主存 往往需要几十纳秒;如果数据需要从 SSD 或 HDD 中读取,则访问时间又会增加到微秒甚至毫秒级,相比 Cache 慢了数千到数百万倍。因此,如果 CPU 每次访问数据都直接访问主存或磁盘,将会有大量时间处于等待状态,计算能力无法得到充分发挥。
存储器层次结构的主要思想是:上一层存储器作为下一层存储器的高速缓存。当 CPU 要读取某个数据时,会优先在速度最快的存储器中查找:
- 先访问 Cache;
- 如果 Cache 中没有(发生 Cache Miss),则访问 主存;
- 如果 主存 中也没有,则访问磁盘,此时数据会先从磁盘调入 主存,再从 主存 调入 Cache,最后供 CPU 使用。
Cache—主存层 主要解决 CPU 和主存之间巨大的速度差异问题。主存和 Cache 之间的数据调动完全由 硬件自动完成,程序员通常无需关心数据何时进入或离开 Cache。
主存—辅存层 主要解决存储系统容量不足的问题。主存和 辅存 之间的数据调动由 硬件和操作系统共同完成(例如虚拟内存、分页机制),对于应用程序员来说也是透明的。程序只需按照统一的地址空间访问数据,而无需关心数据当前位于主存还是磁盘中。
RAM
半导体随机存储器的英文为 Semiconductor Random-Access Memory ( RAM )。
首先说一下这个名词中的几个部分:
- 半导体:这种存储器使用半导体材料(如硅)制成。晶体管是构成半导体存储器的基本组成部分。
- 随机:随机的意思是随机访问,意味着可以以几乎恒定的时间访问存储器中的任意位置,它与其他存储技术(如磁盘或磁带)不同,后者需要按顺序访问数据。
随机存储器主要分为 SRAM 和 DRAM 两种。
SRAM
SRAM(Static RAM,静态随机存取存储器)使用触发器(通常由 4-6 个晶体管组成)构成存储器的基本存储单元,存储每个比特的数据,如下图所示:
只要电源持续供应,数据无需刷新即可保持稳定。
SRAM 通过将触发器组织成二维阵列构成存储器,每行连接一个字线(Word Line),控制该行所有单元的访问。
每列连接一对位线(Bit Line),用于传输数据。
SRAM 主要用于 CPU 缓存(L1/L2/L3 Cache)、寄存器、嵌入式系统中的小型高速存储。
DRAM
DRAM(Dynamic RAM,动态随机存储器)使用 1 个晶体管(Transistor) 和 1 个电容器(Capacitor)(简称 1T1C)构成存储器的基本存储单元,每个存储单元存储 1 bit 数据。
与 SRAM 使用触发器保存数据不同,DRAM 利用电容中的电荷表示数据。由于电容会随着时间不断漏电,因此数据不能永久保存,需要定期 刷新(Refresh) 才能恢复电荷、防止数据丢失。
DRAM 和 SRAM 在宏观上都采用 二维存储阵列 组织数据,通过 字线(Word Line) 和 位线(Bit Line) 实现随机访问,主要区别在于它们采用的 基本存储单元 不同。
DRAM 中:
- 每个 存储单元(Cell) 存储 1 bit 数据。
- 电容器(Capacitor) 用来存储电荷:
- 有电荷通常表示 1;
- 无电荷通常表示 0。
- 晶体管(Transistor) 相当于一个开关,由 字线(Word Line) 控制。当字线被选中时,该单元即可与 位线(Bit Line) 相连,实现读写操作。
DRAM 以 高集成度、低成本、大容量 著称,因此主要用于计算机 主内存(RAM)、显卡显存等大容量存储设备。
行列地址复用
绝大多数 DRAM 芯片都采用 行列地址复用(Address Multiplexing) 技术,以减少芯片所需的地址引脚数量。
DRAM 内部的存储单元按照二维阵列组织:
- 行(Row) 对应 字线(Word Line);
- 列(Column) 对应 位线(Bit Line)。
如果一次性输入完整地址,则需要:
\[ \log_2(\text{行数})+\log_2(\text{列数}) \]
根地址线。
例如,一个 64K × 4 bit 的 DRAM 芯片,如果内部组织为 256 行 × 256 列,则需要:
- 行地址:8 位
- 列地址:8 位
共 16 根地址线。
但在早期 DRAM 芯片中,封装引脚数量十分有限,无法提供如此多的地址引脚,因此采用了 行列地址复用 技术。
DRAM 行列复用实例
假设有一个 16M × 4 bit 的 DRAM 芯片:
- 存储单元总数:\(16M \times 4 = 64M\) bit;
- 内部组织为 4K 行 × 4K 列(\(4096 \times 4096 = 16M\))。
因此:
- 行地址需要 12 位;
- 列地址需要 12 位。
如果不采用地址复用,需要 24 根地址线;采用行列地址复用后,只需 12 根地址线 即可,大大减少了芯片引脚数量。
DRAM 外部仅提供:
\[ \log_2(\max(\text{行数},\text{列数})) \]
根地址线。
地址需要分两次送入:
- 首先送入 行地址,由 RAS(Row Address Strobe) 信号锁存;
- 然后送入 列地址,由 CAS(Column Address Strobe) 信号锁存。
相比之下,SRAM 容量通常较小,引脚数量能够满足需求,因此一般不采用行列地址复用,而是一次性输入完整地址并直接完成译码,从而获得更低的访问延迟。
刷新机制
由于 DRAM 使用 电容器 保存数据,而电容会不断漏电,因此即使 CPU 完全没有访问某个存储单元,其中保存的数据也会随着时间逐渐消失。
为了保证数据正确,内存控制器(Memory Controller) 必须在规定时间内(通常几十毫秒内)保证 每一行 至少被刷新一次。所谓 刷新(Refresh),本质上就是重新恢复存储单元中的电荷,使其能够继续保存数据。
由于 DRAM 的存储阵列按 行(Row) 和 列(Column) 组织,而同一行上的所有存储单元共享一条 字线(Word Line),因此 刷新也是按行进行的,一次刷新会恢复整行存储单元中的电荷,而不是逐个存储单元刷新。
刷新期间,被刷新的存储体不能正常提供读写服务,因此不同的刷新策略会直接影响 DRAM 的访问性能。
刷新方式
DRAM 常见的刷新方式包括:
- 集中刷新(Burst Refresh):暂停正常访问,在短时间内连续刷新所有行。控制简单,但刷新期间 CPU 必须等待,因此会产生较长的访问停顿。
- 分散刷新(Distributed Refresh):将刷新操作均匀分散到整个刷新周期中,与正常访问交替进行。每次停顿时间较短,但刷新控制逻辑更加复杂。
- 异步刷新(Asynchronous Refresh):由内存控制器根据系统状态选择合适时机触发刷新,灵活性最高,但实现也最复杂。
三种刷新方式在时间轴上的 CPU 等待窗口对比如下图所示:
它们的特点如下:
| 特征 | 集中刷新 | 分散刷新 | 异步刷新 |
|---|---|---|---|
| 刷新方式 | 连续刷新所有行 | 将刷新均匀分散 | 由控制器选择刷新时机 |
| CPU 等待 | 等待时间长,但次数少 | 每次等待时间短,但次数多 | 根据系统状态动态调整 |
| 对性能影响 | 刷新期间无法访问 DRAM | 对正常访问影响较小 | 一般影响最小 |
| 控制复杂度 | 低 | 中 | 高 |
| 灵活性 | 低 | 中 | 高 |
| 特性 | DRAM | SRAM |
|---|---|---|
| 存储单元 | 1 个晶体管 + 1 个电容器(1T1C) | 4~6 个晶体管(触发器) |
| 数据保持方式 | 电容存储电荷 | 触发器保持状态 |
| 是否需要刷新 | 需要定期刷新 | 无需刷新 |
| 访问速度 | 较慢 | 更快 |
| 集成度 | 高 | 较低 |
| 成本 | 低 | 高 |
| 容量 | 大 | 小 |
| 典型应用 | 主存、显存 | CPU Cache、寄存器 |
Flash 存储
Flash 存储器是一种 非易失性 的电子存储设备,它利用半导体技术来存储数据。通常用于长期数据存储,如 USB 闪存驱动器、固态硬盘(SSD)和移动设备的内部存储。它在读取速度上比 RAM 慢,但优于传统的硬盘驱动器(HDD)。
Flash 存储器使用电子方式来擦写和重新编程存储单元。这意味着可以通过电信号快速擦除和写入数据。数据存储在小型存储单元中,每个单元由浮动门晶体管组成。这些晶体管可以保持其充电状态,从而代表不同的数据位。
ROM
ROM(Read-Only Memory)是一种 非易失性 存储设备,主要用于永久性地存储数据。
ROM 主要用于读取操作。虽然早期的 ROM 在制造过程中就已经被编程,不能修改,但现代的 ROM(如 EPROM 和 Flash 存储器)可以被重新编程。
ROM 常用于存储固件,这是一种软件程序,直接嵌入在硬件设备中,用于控制设备的基本操作。例如,BIOS(基本输入输出系统)通常存储在 ROM 中。
注意一下 ROM 和 RAM 的对比如下:
| 特征 | RAM(随机存取存储器) | ROM(只读存储器) |
|---|---|---|
| 易失性 | 是(断电时数据丧失) | 否(数据在断电时不丧失) |
| 读写能力 | 可以被随机读取和写入 | 通常只读,只读数据不能随机写入 |
| 用途 | 用于存储正在运行的程序、操作系统和数据 | 用于存储固定程序代码、固件、启动程序等 |
| 存储容量 | 通常较大,以支持多个程序同时运行 | 通常较小,主要用于存储核心系统和固件 |
| 数据持续性 | 不持久,数据在断电时丧失 | 持久,数据在断电时不丧失 |
| 修改权限 | 可以随机修改和写入数据 | 通常只读,只读数据无法被修改 |
ROM 的类型主要了解 EPROM 和 CDMROM 这两种:
EPROMEPROM 可以通过紫外线照射来擦除数据,然后重新写入数据。写入数据和擦除数据都较为繁琐,且需要物理操作。常用作电脑的 BIOS 芯片,支持随机存取。
CDROMCDROM 是一种光盘存储设备,数据在生产时一次性写入,不能被修改(只能读取)。