第十章 内存与存储 — 数据的保存
导读
在前面的章节中,我们学会了如何用逻辑门处理信息——加法器可以做算术运算,ALU可以执行各种逻辑操作。但一个根本性的问题还没有解决:数据存在哪里?
一台没有内存的计算机,就像一张没有桌面的工作台——你可以做计算,但无法保存中间结果,无法存储程序,甚至无法记住你正在做什么。内存和存储系统赋予了计算机"记忆"的能力,使得它可以存储程序和数据,在需要时取用,在计算过程中保存中间状态。
从早期的水银延迟线、威廉姆斯管,到磁芯存储器,再到今天的DRAM和闪存,计算机存储技术经历了翻天覆地的变化。每一代存储技术都在速度、容量、成本和可靠性之间寻找新的平衡。
本章将全面介绍计算机的内存和存储系统。我们将从最基本的存储单元——触发器开始,学习如何用电逻辑电路保存一位数据;然后探讨RAM和ROM的工作原理,理解计算机内存的层次结构;接着了解硬盘、SSD等外部存储设备;最后探索存储系统的性能优化策略。通过本章的学习,你将理解计算机是如何保存和管理数据的。
核心概念详解
10.1 存储的基本需求
计算机存储系统需要满足几个相互矛盾的需求:
速度快:CPU需要能够快速读写数据,存储的访问速度应尽可能接近CPU的处理速度
容量大:需要存储大量的程序和数据
成本低:每字节的存储成本应尽可能低
非易失性:断电后数据不应丢失
遗憾的是,这些需求之间存在根本性的矛盾:速度快的存储通常成本高、容量小;容量大的存储通常速度慢;非易失性存储通常比易失性存储慢。
为了解决这个矛盾,计算机系统采用了存储层次结构(Memory Hierarchy)——将不同速度、容量和成本的存储设备组织成层次结构,利用局部性原理来最大化整体性能。
10.2 触发器:存储一位数据
触发器(Flip-Flop)是能够存储一位二进制数据的基本逻辑电路。它是所有时序逻辑电路和存储器的基础构建块。
触发器与组合逻辑电路的根本区别在于:触发器具有记忆功能——它的输出不仅取决于当前输入,还取决于之前的状态。
SR触发器(Set-Reset Flip-Flop)
SR触发器是最简单的触发器,可以用两个交叉耦合的NOR门或NAND门构建。
用NOR门构建的SR触发器:
┌───────────────┐
│ ┌─────┐ │
S ────┤ │ NOR │ ├─── Q
│ └──┬──┘ │
│ │ │
│ ┌──┴──┐ │
R ────┤ │ NOR │ ├─── Q'
│ └─────┘ │
└───────────────┘SR触发器的功能表:
| S | R | Q(t+1) | 功能 |
|---|---|---|---|
| 0 | 0 | Q(t) | 保持 |
| 0 | 1 | 0 | 复位 |
| 1 | 0 | 1 | 置位 |
| 1 | 1 | 不确定 | 禁止 |
SR触发器的问题在于S=1且R=1时,输出状态不确定(两个输出都为0,违反了Q和Q'互补的要求)。当S和R同时从1变为0时,哪个输出先变为1取决于门的延迟差异,结果不可预测。
D触发器(Data Flip-Flop)
D触发器解决了SR触发器的不确定状态问题。它只有一个数据输入D,在时钟信号的边沿(上升沿或下降沿)将D的值传送到输出Q。
D触发器的功能表:
| CLK边沿 | D | Q(t+1) |
|---|---|---|
| 无 | X | Q(t) |
| 上升沿 | 0 | 0 |
| 上升沿 | 1 | 1 |
D触发器是数字系统中最常用的存储元件。CPU中的寄存器、缓存、以及各种状态寄存器,都是由大量的D触发器构成的。
D触发器的关键特性:
- 同步操作:数据只在时钟边沿被采样和存储,这使得整个系统可以在统一的时钟控制下协调工作
- 无不确定状态:无论D是什么值,输出都是确定的
- 高扇出:一个D触发器的输出可以驱动多个后续电路
10.3 寄存器
寄存器(Register)是一组D触发器的集合,用于存储多位二进制数据。一个n位寄存器由n个D触发器组成,共享同一个时钟信号。
例如,一个8位寄存器可以存储一个字节(8位)的数据。当时钟信号到来时,所有8个触发器同时采样各自的D输入,将8位数据并行存入寄存器。
寄存器还可以增加使能(Enable)控制:只有当使能信号有效时,寄存器才在时钟边沿更新数据;否则保持原值不变。
移位寄存器(Shift Register)是一种特殊的寄存器,它可以在时钟信号的控制下将数据左移或右移。移位寄存器常用于串行-并行转换、数据传输和简单的算术运算(移位操作)。
10.4 随机存取存储器(RAM)
RAM(Random Access Memory)是计算机的主存储器,CPU可以直接读写RAM中的数据。"随机存取"意味着可以以任意顺序访问任何存储单元,访问时间与单元的位置无关。
RAM分为两种主要类型:
SRAM(静态RAM)
SRAM(Static RAM)使用触发器(通常是6个晶体管构成的SRAM cell)来存储每一位数据。只要保持通电,SRAM中的数据就会一直保留。
SRAM的特点:
- 速度快:访问时间在纳秒级别
- 功耗低:静态状态下几乎不消耗功率
- 成本高:每个存储单元需要6个晶体管,面积大
- 密度低:同等面积下容量小于DRAM
SRAM主要用于CPU缓存(L1、L2、L3 Cache)和高速缓冲存储器。
DRAM(动态RAM)
DRAM(Dynamic RAM)使用一个晶体管和一个电容器来存储每一位数据。电容器充电表示1,放电表示0。
DRAM的特点:
- 速度较慢:访问时间比SRAM长
- 需要刷新:电容器会漏电,需要定期刷新(通常每64ms刷新一次)以维持数据
- 成本低:每个存储单元只需要1个晶体管和1个电容器
- 密度高:同等面积下容量远大于SRAM
DRAM是计算机主内存的标准选择。现代DDR4/DDR5 SDRAM的容量可以达到单条32GB甚至更大。
DRAM的工作原理:
DRAM的存储单元排列成二维矩阵。访问特定单元时,先通过行地址选中一行(激活该行的所有单元,将电容器的电荷传送到感应放大器),然后通过列地址选中该行的特定列,读出或写入数据。
10.5 只读存储器(ROM)
ROM(Read-Only Memory)是一种只能读取、不能(或难以)写入的存储器。ROM中的数据在制造时就被写入,断电后不会丢失(非易失性)。
ROM的类型:
- 掩模ROM(Mask ROM):在芯片制造时写入数据,不可更改。成本最低,但灵活性最差。
- PROM(Programmable ROM):用户可以编程一次。使用熔丝或反熔丝技术。
- EPROM(Erasable PROM):可以用紫外线擦除并重新编程。芯片上有一个石英窗口用于紫外线照射。
- EEPROM(Electrically Erasable PROM):可以用电信号擦除和重新编程,支持按字节操作。
- 闪存(Flash Memory):EEPROM的改进版本,支持按块擦除,写入速度更快,密度更高。闪存是现代U盘、SSD和手机存储的基础。
10.6 存储层次结构
现代计算机使用多层次的存储系统,从最快最小到最慢最大排列:
速度 ↑ 成本/字节 ↑ 容量 ↓
│
│ ┌─────────────┐
│ │ 寄存器 │ ~1ns, ~1KB
│ ├─────────────┤
│ │ L1缓存 │ ~1ns, ~32-64KB
│ ├─────────────┤
│ │ L2缓存 │ ~3-10ns, ~256KB-1MB
│ ├─────────────┤
│ │ L3缓存 │ ~10-30ns, ~4-64MB
│ ├─────────────┤
│ │ 主内存(DRAM)│ ~50-100ns, ~4-256GB
│ ├─────────────┤
│ │ SSD │ ~50-200μs, ~256GB-4TB
│ ├─────────────┤
│ │ HDD │ ~5-10ms, ~1-20TB
│ ├─────────────┤
│ │ 磁带/云存储 │ 秒级, 无限
│ └─────────────┘
│
速度 ↓ 成本/字节 ↓ 容量 ↑这个层次结构的设计基于局部性原理(Principle of Locality):
时间局部性:最近被访问的数据很可能在不久的将来再次被访问。例如,循环中使用的变量。
空间局部性:最近被访问的数据的邻近数据很可能在不久的将来被访问。例如,数组元素的顺序访问。
利用局部性原理,存储层次结构将最常用的数据放在最快(但最小)的存储层,不常用的数据放在较慢(但较大)的存储层。当CPU需要数据时,首先在最快的缓存中查找(缓存命中),如果找不到(缓存未命中),再到下一层查找,依此类推。
10.7 缓存的工作原理
缓存(Cache)是位于CPU和主内存之间的高速小容量存储器,用于缓解CPU和主内存之间的速度差距。
缓存的基本工作原理:
缓存行(Cache Line):缓存不以单个字节为单位管理数据,而是以固定大小的块(通常为64字节)为单位,称为缓存行。
地址映射:内存地址被分为三部分:标记(Tag)、索引(Index)和偏移(Offset)。
- 索引用于选择缓存中的哪一组
- 标记用于在该组中确定是否是需要的数据
- 偏移用于选择缓存行中的哪个字节
缓存命中:CPU发送地址到缓存,缓存检查标记是否匹配。如果匹配(命中),直接返回数据。
缓存未命中:如果标记不匹配(未命中),缓存从主内存中加载整个缓存行,然后返回请求的数据。
缓存映射方式:
- 直接映射:每个内存地址只能映射到缓存中的一个固定位置。简单但冲突率高。
- 全相联映射:任何内存地址可以放在缓存的任何位置。冲突率低但查找成本高。
- 组相联映射:折中方案,缓存分为若干组,每组有若干行。内存地址先映射到组,然后在组内查找。
缓存替换策略:
当缓存已满且需要加载新数据时,需要替换已有的缓存行。常见的替换策略:
- LRU(Least Recently Used):替换最久未使用的行
- FIFO(First In First Out):替换最早加载的行
- 随机替换:随机选择一行替换
10.8 虚拟内存
虚拟内存(Virtual Memory)是操作系统提供的一种内存管理技术,它让每个程序都以为自己独占了整个地址空间的内存。
虚拟内存的核心思想:
每个程序使用虚拟地址,而不是直接访问物理内存
操作系统维护页表(Page Table),将虚拟地址映射到物理地址
当程序访问的虚拟地址对应的物理页面不在内存中时(缺页),操作系统从磁盘加载该页面到内存
虚拟内存的优势:
- 地址空间隔离:每个程序有独立的地址空间,不能访问其他程序的内存
- 内存超售:所有程序的虚拟内存总和可以超过物理内存的大小
- 简化编程:程序员不需要关心物理内存的分配和管理
内存分页:虚拟内存和物理内存都被划分为固定大小的块(页面),通常为4KB。页表记录了每个虚拟页面到物理页面的映射关系。
TLB(Translation Lookaside Buffer):页表查找可能很慢(需要访问内存),TLB是一个高速缓存,用于缓存最近的地址转换结果。
10.9 外部存储设备
硬盘驱动器(HDD)
HDD(Hard Disk Drive)使用旋转的磁性盘片来存储数据。读写头在盘片上方浮动(距离约几纳米),通过改变磁性颗粒的磁化方向来写入数据,通过检测磁场变化来读取数据。
HDD的关键参数:
- 转速:通常5400或7200 RPM(转/分钟)
- 寻道时间:读写头移动到目标磁道的时间,约5-10ms
- 旋转延迟:等待目标扇区转到读写头下方的时间,约2-5ms
- 传输速率:数据从盘片读取到缓存的速率,约100-200 MB/s
固态硬盘(SSD)
SSD(Solid State Drive)使用闪存芯片来存储数据,没有机械运动部件。
SSD的优势:
- 速度快:随机读写速度远超HDD(没有寻道和旋转延迟)
- 抗震:没有机械部件,不怕震动
- 安静:没有旋转和读写头移动的声音
- 低功耗:比HDD省电
SSD的关键技术:
- NAND闪存:存储单元基于浮栅晶体管,通过捕获或释放电子来存储数据
- 磨损均衡:闪存单元有写入次数限制(约10万-100万次),SSD控制器通过磨损均衡算法确保所有单元的写入次数均匀分布
- 垃圾回收:闪存不能直接覆盖写入,需要先擦除再写入。SSD控制器在后台执行垃圾回收,将无效数据所在的块擦除
10.10 存储技术的未来
存储技术正在快速发展,几个前沿方向值得关注:
3D NAND:将闪存单元垂直堆叠,而不是平面排列。目前已经有超过200层的3D NAND产品,大幅提高了存储密度。
持久内存(Persistent Memory):如Intel Optane,结合了DRAM的速度和闪存的持久性,填补了内存和存储之间的层次间隙。
存储级内存(Storage Class Memory, SCM):使用新型存储介质(如相变存储器PCM、磁阻存储器MRAM、阻变存储器ReRAM),目标是实现接近DRAM的速度和闪存的持久性。
DNA存储:利用DNA分子的高密度和长寿命来存储数据。理论上,1克DNA可以存储约215 PB的数据。
重要知识点
知识点一:触发器是存储的基本单元
触发器能够存储一位二进制数据,是寄存器和所有存储器的基础构建块。D触发器因其确定性和同步特性而被广泛使用。
知识点二:SRAM和DRAM是主内存的两种技术
SRAM速度快但成本高、密度低,用于缓存;DRAM速度较慢但成本低、密度高,用于主内存。
知识点三:存储层次结构利用局部性原理
通过将常用数据放在快速存储层,不常用数据放在慢速存储层,存储层次结构在成本和性能之间取得了平衡。
知识点四:缓存是弥合速度差距的关键
缓存通过利用时间局部性和空间局部性,显著减少了CPU等待内存数据的时间。
知识点五:虚拟内存提供了地址空间的抽象
虚拟内存让每个程序都以为自己独占整个地址空间,简化了编程,同时提供了内存保护和超售能力。
常见误区
误区一:"RAM和ROM的区别是RAM可以读写,ROM只能读"
这个说法过于简化。ROM的"只读"是指在正常工作模式下不能写入,但许多ROM类型(PROM、EPROM、EEPROM、Flash)都可以通过特殊方式写入。更准确的区别是:RAM是易失性的(断电丢失数据),ROM是非易失性的(断电保留数据)。
误区二:"缓存越大越好"
缓存的大小需要权衡。过大的缓存会增加查找延迟(因为需要搜索更多的缓存行),而且成本更高。实际设计中,缓存大小、关联度和替换策略需要综合考虑。
误区三:"SSD永远不会坏"
SSD的闪存单元有写入次数限制。虽然现代SSD通过磨损均衡和过度配置等技术大大延长了寿命,但在高强度写入场景下(如数据库服务器),SSD的寿命仍然是一个需要考虑的因素。
误区四:"内存越大,电脑越快"
内存大小只是影响性能的因素之一。如果内存已经足够容纳工作集,增加更多内存不会显著提升性能。CPU速度、缓存大小和层次、存储速度等因素同样重要。
实践应用
应用一:设计一个简单的寄存器文件
设计一个包含8个8位寄存器的寄存器文件:
- 3位地址选择寄存器
- 读写控制信号
- 画出逻辑电路图
应用二:计算缓存命中率
一个程序的内存访问序列如下(地址为缓存行号):
0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, ...
假设缓存有4行,分别计算以下映射方式的命中率:
直接映射
全相联映射(LRU替换)
应用三:分析存储层次的性能
给定以下参数:
- L1缓存:命中率95%,访问时间1ns
- L2缓存:命中率90%(在L1未命中时),访问时间10ns
- 主内存:访问时间100ns
计算平均内存访问时间(AMAT)。
应用四:理解虚拟地址转换
假设页大小为4KB,虚拟地址为32位,物理地址为36位。计算:
虚拟地址中页内偏移占多少位?
虚拟页号占多少位?
页表中有多少个条目?
本章小结
本章全面介绍了计算机的内存和存储系统:
触发器:存储一位数据的基本电路,D触发器是最常用的类型。
寄存器:由多个触发器组成,存储多位数据。
RAM:SRAM速度快但贵,用于缓存;DRAM速度慢但便宜,用于主内存。
ROM:非易失性存储器,包括掩模ROM、PROM、EPROM、EEPROM和闪存。
存储层次:从寄存器到云存储,利用局部性原理在性能和成本之间取得平衡。
缓存:利用时间局部性和空间局部性,减少CPU等待内存的时间。
虚拟内存:提供地址空间抽象,实现内存保护和超售。
外部存储:HDD使用磁性盘片,SSD使用闪存,各有优缺点。
从触发器到存储层次,我们已经构建了计算机的"记忆系统"。在下一章中,我们将把前面学到的所有知识整合在一起,构建一台完整的CPU——计算机的"大脑"。