10

内存与存储

数据的保存

阅读量:1 · 预计 16 分钟读完

RAMROM硬盘存储层次
关联层级:L2 计算与内存
阅读进度5%

第十章 内存与存储 — 数据的保存

导读

在前面的章节中,我们学会了如何用逻辑门处理信息——加法器可以做算术运算,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触发器的功能表:

SRQ(t+1)功能
00Q(t)保持
010复位
101置位
11不确定禁止

SR触发器的问题在于S=1且R=1时,输出状态不确定(两个输出都为0,违反了Q和Q'互补的要求)。当S和R同时从1变为0时,哪个输出先变为1取决于门的延迟差异,结果不可预测。

D触发器(Data Flip-Flop)

D触发器解决了SR触发器的不确定状态问题。它只有一个数据输入D,在时钟信号的边沿(上升沿或下降沿)将D的值传送到输出Q。

D触发器的功能表:

CLK边沿DQ(t+1)
XQ(t)
上升沿00
上升沿11

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——计算机的"大脑"。