存储系统
存储系统的层次结构
存储系统是计算机体系结构的核心组成部分之一,用于存储程序指令和数据,以支持处理器的运算需求。为了平衡速度、容量和成本,现代计算机采用了分层存储体系结构,从最快速但容量有限的 寄存器 到容量大但速度较慢的辅助存储设备,形成了存储层次结构。
如上图所示,越靠近金字塔上层的容量越小但速度越快,越靠近金字塔下层的容量越大但速度越慢。计算机的存储系统包含以下层次:
- 寄存器(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,静态随机存取存储器)使用触发器构成基本存储单元。一个 SRAM 存储单元通常由 4~6 个晶体管 组成,用于存储 1 bit 数据,如下图所示:
只要电源持续供应,触发器的状态就可以一直保持,因此 SRAM 不需要刷新。
SRAM 主要用于 CPU 的 Cache(L1/L2/L3)、寄存器文件以及嵌入式系统中的小容量高速存储器。
DRAM
DRAM(Dynamic RAM,动态随机存储器)使用 1 个晶体管(Transistor) 和 1 个电容器(Capacitor),即 1T1C 结构,构成基本存储单元。每个存储单元存储 1 bit 数据。
与 SRAM 使用触发器保存状态不同,DRAM 利用电容器中是否存有电荷表示数据。由于电容器会随着时间不断漏电,因此数据不能永久保持,必须定期进行 刷新(Refresh),重新恢复电容器中的电荷。
DRAM 具有 集成度高、成本低、容量大 等特点,因此主要用于计算机的 主存、显卡显存等大容量存储设备。
二维阵列与行列地址
DRAM 和 SRAM 在宏观上都采用 二维存储阵列 组织数据,并通过字线和位线访问存储单元。二者的主要区别在于所使用的 基本存储单元 不同。
DRAM 中:
- 每个 存储单元(Cell) 只能存储 1 bit 数据;
- 电容器(Capacitor) 用于保存电荷:
- 有电荷通常表示 1;
- 无电荷通常表示 0;
- 晶体管(Transistor) 相当于一个开关,由 字线(Word Line) 控制;
由于一个 Cell 只能保存 1 bit 数据,而计算机通常一次需要读写多个 bit,因此一个 可寻址地址(Addressable Location) 往往对应多个 Cell 共同组成。
例如,一个 4 bit 宽的 DRAM 芯片,每个可寻址地址对应 4 个 Cell,分别存储这 4 个 bit。为了实现这一点,DRAM 内部通常采用 多个位平面(Bit Plane) 并行工作的组织方式。
每个位平面都是一个独立的 二维 Cell 阵列,其中的每个 Cell 存储 1 bit 数据。所有位平面具有完全相同的行、列结构,并共享相同的 行地址(Row Address) 和 列地址(Column Address)。
当访问某个地址时,控制器利用相同的行地址和列地址,在所有位平面中同时选中对应位置的 Cell。每个位平面分别读出(或写入)1 bit 数据,最终组合成该地址对应的 4 bit 数据。
需要区分两个概念:
- Cell(存储单元):物理存储的最小单位,只能存储 1 bit。
- Address(可寻址地址):也可以叫做 memory location,指的是 CPU 或内存控制器访问 DRAM 的逻辑单位,一个地址可以对应多个 Cell(如 4 bit、8 bit、16 bit 等)。
DRAM 对外提供的是可寻址地址(Address)。
为了提高存储密度,DRAM 将每个 bit 的存储单元组织成二维 Cell 阵列。访问某个地址时,控制器首先将地址划分为 行地址(Row Address) 和 列地址(Column Address),利用这两部分地址在所有 Cell 阵列中同时选中相同位置的 Cell。
假设每个 Cell 阵列共有 行、 列,则:
- 行地址需要 位;
- 列地址需要 位;
因此,一个可寻址地址共需要
位。
这里的 行地址(Row Address) 和 列地址(Column Address) 是 DRAM 芯片内部 用于定位数据的位置,并不是 CPU 发出的主存地址。
CPU 访问的是整个主存空间中的 物理地址,而 内存控制器 会将该地址转换为 DRAM 内部使用的行地址和列地址,再完成数据访问。因此,教材中讨论 DRAM 时通常只关注 DRAM 内部的地址组织方式,而不涉及 CPU 地址到 DRAM 地址的映射过程。
一种典型的实现方式可以理解为由 4 个位平面(Bit Plane) 组成,每个位平面都是一个独立的 Cell 阵列,负责存储其中 1 bit 数据。
若每个位平面都组织为:
则:
- 每个位平面共有 个 Cell;
- 行地址需要 8 位;
- 列地址需要 8 位;
- 一个可寻址地址由 8 位行地址 和 8 位列地址 组成,共 16 位。
访问某个地址时,控制器首先根据地址得到对应的 行地址 和 列地址,然后利用相同的行地址和列地址,同时访问 4 个位平面中对应位置的 Cell。每个位平面分别读出(或写入)1 bit 数据,最终组合成该地址对应的 4 bit 数据。
因此,对于 64K × 4 bit 的 DRAM:
- 64K 表示共有 64K 个可寻址地址;
- 4 bit 表示每个地址对应 4 个位平面中的 4 个 Cell,共同组成该地址的数据。
行列地址复用
如果将完整地址一次性送入上述 DRAM 芯片,就需要设置 16 根地址引脚。
但是,DRAM 芯片通常容量较大。如果每一位地址都使用一根独立引脚,芯片所需的引脚数量会很多,从而增加封装面积和制造成本。
为了减少地址引脚数量,DRAM 通常采用 行列地址复用(Address Multiplexing):
使用同一组地址引脚,先传送行地址,再传送列地址。
地址访问过程如下:
- 内存控制器先在地址引脚上送入 行地址;
- 通过 RAS(Row Address Strobe,行地址选通信号) 将行地址锁存到 DRAM 内部;
- DRAM 根据行地址激活对应的行;
- 内存控制器再使用同一组地址引脚送入 列地址;
- 通过 CAS(Column Address Strobe,列地址选通信号) 将列地址锁存;
- DRAM 根据列地址,从已经激活的行中选择相应的数据。
因此,行地址和列地址虽然使用相同的引脚传输,但会在不同的时刻分别送入。
采用行列地址复用后,DRAM 所需的地址引脚数量约为:
当行地址位数和列地址位数相同时,只需要原来大约一半的地址引脚。
以前面的 64K × 4 bit DRAM 为例:
- 不采用地址复用:需要 16 根地址引脚;
- 采用地址复用:只需要 8 根地址引脚;
- 这 8 根地址引脚先传输 8 位行地址,再传输 8 位列地址。
DRAM 行列复用实例
假设有一个 16M × 4 bit 的 DRAM 芯片,共有:
个可寻址位置,每个地址可以读写 4 bit 数据。
如果将这些地址组织为:
由于:
因此:
- 行地址需要 12 位;
- 列地址需要 12 位;
- 完整地址需要 24 位。
如果不采用地址复用,需要 24 根地址引脚;采用行列地址复用后,只需要 12 根地址引脚。
这 12 根地址引脚首先传送行地址,随后再传送列地址。
SRAM 内部通常也会将存储单元组织成二维阵列,并使用 行译码器 和 列选择电路 访问具体的存储单元。因此,从内部结构来看,SRAM 同样存在行、列的划分。
但是,普通 SRAM 芯片一般 不采用 DRAM 式的行列地址分时复用。
SRAM 通常会在地址引脚上一次性接收完整地址:
- CPU 或内存控制器一次性送入完整地址;
- SRAM 内部将地址拆分为行地址和列地址;
- 行译码器和列选择电路同时完成地址译码;
- 直接读取或写入对应的数据。
也就是说,SRAM 和 DRAM 的区别不在于内部是否存在行列结构,而在于 外部地址的传输方式:
| 存储器 | 内部组织方式 | 外部地址传输方式 |
|---|---|---|
| DRAM | 二维阵列,分为行和列 | 通常先传行地址,再使用同一组引脚传列地址 |
| SRAM | 二维阵列,分为行和列 | 通常一次性传入完整地址,由芯片内部拆分和译码 |
SRAM 一般不采用行列地址复用,主要有以下原因:
- SRAM 的容量通常比 DRAM 小,所需地址引脚相对较少;
- SRAM 更强调访问速度,一次性输入完整地址可以减少地址传输和锁存步骤;
- SRAM 不需要 RAS、CAS 这样的行列地址锁存过程,控制方式更加直接。
因此:
DRAM 的行列地址复用主要是为了减少芯片引脚数量,但会增加地址传输步骤;SRAM 通常一次性接收完整地址,以获得更低的访问延迟。
刷新机制
由于 DRAM 使用 电容器 保存数据,而电容会不断漏电,因此即使 CPU 完全没有访问某个存储单元,其中保存的数据也会随着时间逐渐消失。
为了保证数据正确,内存控制器(Memory Controller) 必须在规定时间内,通常是几十毫秒内,保证 每一行 至少被刷新一次。
所谓 刷新(Refresh),本质上是读取一行存储单元中的数据,并利用感应放大器将这些数据重新写回,从而恢复电容器中的电荷。
由于 DRAM 的存储阵列按行和列组织,同一行上的所有存储单元共享一条字线,因此刷新操作也是 按行进行的。一次刷新会恢复整行存储单元中的电荷,而不是逐个存储单元进行刷新。
刷新期间,被刷新的存储体不能正常提供读写服务,因此不同的刷新策略会直接影响 DRAM 的访问性能。
刷新方式
DRAM 常见的刷新方式包括:
- 集中刷新(Burst Refresh):在一个刷新周期内,集中安排一段时间连续刷新所有行。控制简单,但连续刷新期间无法进行正常访问,会形成较长的停止访问时间。
- 分散刷新(Distributed Refresh):将刷新操作分散到各个 存储周期 中,使刷新操作与正常读写操作规律地交替进行。不会形成很长的集中停顿,但会频繁占用存储周期。
- 异步刷新(Asynchronous Refresh):在整个刷新周期内均匀安排刷新操作,每隔一定时间刷新一行。它避免了集中刷新的长时间停顿,同时又不要求每个存储周期都执行刷新,是集中刷新和分散刷新的一种折中方式。
三种刷新方式在时间轴上的 CPU 等待窗口对比如下图所示:
它们的特点如下:
| 特征 | 集中刷新 | 分散刷新 | 异步刷新 |
|---|---|---|---|
| 刷新方式 | 在一段时间内连续刷新所有行 | 刷新与正常访问逐周期交替 | 每隔一定时间刷新一行 |
| CPU 等待 | 等待时间长,但集中出现 | 每次等待时间短,但非常频繁 | 等待时间短,并且均匀分布 |
| 对性能影响 | 存在明显的停止访问时间 | 持续占用部分存储周期 | 通常比前两种方式更加均衡 |
| 控制复杂度 | 低 | 中 | 较高 |
| 典型特点 | 存在“死时间” | 没有长时间停顿,但刷新频繁 | 集中刷新与分散刷新的折中 |
SRAM 对比 DRAM
| 特性 | DRAM | SRAM |
|---|---|---|
| 存储单元 | 1 个晶体管 + 1 个电容器(1T1C) | 4~6 个晶体管组成的触发器 |
| 数据保持方式 | 使用电容器保存电荷 | 使用触发器保持状态 |
| 是否需要刷新 | 需要定期刷新 | 无需刷新 |
| 内部阵列 | 通常采用二维行列阵列 | 通常也采用二维行列阵列 |
| 外部地址输入 | 通常采用行列地址复用 | 通常一次性输入完整地址 |
| 访问速度 | 较慢 | 更快 |
| 集成度 | 高 | 较低 |
| 成本 | 低 | 高 |
| 容量 | 大 | 小 |
| 典型应用 | 主存、显存 | CPU Cache、寄存器文件 |
ROM
ROM(Read-Only Memory,只读存储器)是一类 非易失性(Non-Volatile) 存储器,断电后仍能保存数据,主要用于存放系统启动程序、固件(Firmware)以及其他长期不需要频繁修改的数据。
虽然名称叫做 只读存储器(Read-Only Memory),但这里的"只读"是相对于 正常工作状态 而言的。
- 在计算机运行过程中,CPU 可以 随机读取(Random Access) ROM 中任意地址的数据;
- 但一般不能像 RAM 一样随时写入数据。
- 某些现代 ROM(如 EPROM、EEPROM、Flash)虽然支持重新编程,但写入通常需要专门的硬件、电压或擦除操作,写入速度也远低于 RAM。
因此,现代教材中的 ROM 更准确地理解为 非易失性存储器,而不是绝对不能写入的存储器。
ROM 最典型的用途是存储 固件(Firmware)。固件是直接嵌入硬件中的底层程序,负责设备初始化和基本控制。例如:
- PC 主板中的 BIOS/UEFI
- 路由器、交换机中的启动程序
- 各种嵌入式设备(单片机、家电、汽车 ECU)的控制程序
ROM 对比 RAM
| 特征 | RAM(随机存取存储器) | ROM(只读存储器) |
|---|---|---|
| 易失性 | 易失性,断电后数据丢失 | 非易失性,断电后数据仍保留 |
| 读写能力 | 可随机读、随机写 | 可随机读,一般不能在运行过程中随机写 |
| 数据修改 | 可频繁修改 | 一般很少修改,需要专门方式写入 |
| 访问速度 | 较快 | 通常慢于 RAM |
| 用途 | 存放正在运行的程序和数据 | 存放固件、启动程序、固定数据 |
| 容量 | 一般较大 | 一般较小 |
需要注意:
RAM 和 ROM 都支持随机存取(Random Access),区别并不在于是否能够随机访问,而在于 是否能够方便地写入以及是否断电保存数据。
分类
主要了解下面几种 ROM。
MROM
MROM(Mask ROM,掩膜 ROM)是在芯片制造过程中直接写入数据的 ROM。
其内容在出厂后便无法修改,因此成本低、可靠性高,适合大批量生产。
PROM
PROM(Programmable ROM,可编程 ROM)允许用户在出厂后 写入一次数据。
一旦完成编程,就无法再次修改,因此又称 一次性可编程 ROM(OTP,One-Time Programmable)。
EPROM
EPROM(Erasable Programmable ROM,可擦除可编程 ROM)可以通过 紫外线照射 将整个芯片中的数据全部擦除,然后重新写入。
其特点是:
- 可以反复编程;
- 必须取下芯片并使用紫外线擦除;
- 擦除时间较长,操作较为繁琐;
- 支持随机读取。
早期 PC 的 BIOS 芯片曾大量采用 EPROM。
EEPROM
EEPROM(Electrically Erasable Programmable ROM,电可擦除可编程 ROM)使用 电信号 完成擦除和写入,不再需要紫外线。
相比 EPROM:
- 不需要拆卸芯片;
- 可以在电路板上直接更新内容;
- 支持按字节(Byte)擦除和写入;
- 写入速度较慢,擦写次数有限。
Flash
Flash Memory(闪存) 是 EEPROM 的一种改进形式,也是现代最广泛使用的非易失性存储器。
与 EEPROM 相比:
- 按块(Block)擦除,因此速度更快;
- 存储密度更高;
- 成本更低;
- 擦写寿命有限(通常几千到几十万次)。
目前大量设备都采用 Flash 存储,例如:
- SSD(固态硬盘)
- U 盘
- SD 卡
- 手机存储
- BIOS/UEFI 芯片
可以,加一个 Note,这也是很多教材容易让初学者困惑的地方。
在现代计算机体系结构中,ROM(Read-Only Memory)已经不再表示"绝对不能写"的存储器,而是泛指非易失性(Non-Volatile Memory,NVM),即断电后仍能保存数据的存储器。
从历史上看,最早的 ROM 在制造完成后内容便固定,用户无法修改,因此称为 Read-Only Memory。后来出现了 PROM、EPROM、EEPROM,以及今天广泛使用的 Flash Memory,它们都能够重新写入数据,只是写入速度较慢、需要特殊的擦除操作(按字节或按块擦除),因此仍然沿用了 ROM 这一名称。
因此,Flash 在广义上属于 ROM(非易失性存储器),但它并不是严格意义上的"只读"存储器,而是一种可擦除、可重新编程的 ROM。现代 SSD、U 盘、SD 卡、手机存储以及 BIOS/UEFI 芯片,都是以 Flash 为存储介质。
CD-ROM
CD-ROM(Compact Disc Read-Only Memory,只读光盘)是一种光盘存储设备。
数据在生产过程中一次性写入,用户不能修改,只能读取,因此属于典型的只读存储介质。
其特点包括:
- 非易失性;
- 容量约 700 MB;
- 使用激光读取数据;
- 访问速度远低于半导体存储器。
需要注意,CD-ROM 属于外存(辅助存储器),而前面介绍的 MROM、PROM、EPROM、EEPROM、Flash 都属于 半导体 ROM。
- ROM 属于非易失性存储器,RAM 属于易失性存储器。
- ROM 和 RAM 都支持随机存取,不要把 ROM 理解成顺序访问。
- Flash Memory 属于 ROM,是现代应用最广泛的非易失性存储器。
- EPROM 使用紫外线擦除,EEPROM 使用电擦除,Flash 按块擦除。