第三章-存储系统
第三章-存储系统
第三章:存储系统
一、存储系统基本概念
1. 存储器的层次结构

外存、辅存:
- 没有明显的层次划分
- 辅存中的数据要调入主存后才能被 CPU 访问(读写)
- 解决了主存容量不够的问题
主存: - 主存与辅存之间的数据交换需要硬件 + 操作系统(虚拟存储系统)
- CPU 读写主存数据由硬件自动完成
高速缓冲存储器 Cache:缓解 CPU 与 主存之间的速度矛盾
寄存器:如 ACC、MQ

2. 存储器的分类
按层次分类
- 高速缓存(Cache)
- 主存储器(主存、内存)
- 辅助存储器(辅存、外存)
Cache 和 主存可直接被 CPU 读写
按存储介质分类
- 半导体存储器(主存、Cache):用半导体器件存储信息,读取速度较快
- 磁表面存储器(磁盘、磁带):用磁性材料存储信息
- 光存储器(光盘):以光介质存储信息
按存取方式分类
- 随机存取存储器(Random Access Memory,RAM):读写任何一个存储单元所需时间都相同,与存储单元所在的物理位置无关。如内存条
- 顺序存取存储器(Sequential Access Memory,SAM):读写一个存储单元所需时间取决于存储单元所在的物理位置。如磁带
- 直接存取存储器(Direct Access Memory,DAM):既有随机存取特性,也有顺序存取特性。先直接选取信息所在区域,然后按顺序方式存取。如机械硬盘
- 可寻址存储器(Content Addressable Memory,CAM):也叫相联存储器(Associative Memory):即可以按内容访问的存储器内容,可以按照内容检索到存储位置进行读写,“快表“ 就是一种相联存储器。
SAM 和 DAM 都属于串行访问存储器:读写某个存储单元所需时间与存储单元的物理位置有关
按信息的可更改性分类
- 读写存储器(Read / Write Memory):如磁盘、内存、Cache,即可读也可写
- 只读存储器(Read Only Memory):如 Bios,只能读不能写;事实上ROM也可进行多次读写只不过很麻烦
按信息的可保存性分类
- 易失性存储器:如主存、Cache,断电后,存储信息消失的存储器
- 非易失性存储器:如磁盘、光盘,断电后,存储信息依然保存的存储器
破坏性读出:如 DRAM 芯片,读出数据后,原存储信息被破坏,需要进行重写。
非破坏性读出:如 SRAM 芯片、磁盘,信息读出后,原存储信息不被破坏
3. 存储器的性能指标
- 存储容量:存储字数 × 字长
存储字数:可理解为存储单元个数
字长:理解为存储字长,存储字长在制造时规定
如果一个存储器的地址为 3 bit,那么存储字数就有 个
假设该存储器规定存储字长为 8 bit,则总容量
其他的常见描述:
8 K × 8 位,即
8 K × 1 位,即
64 K × 16 位,即
- 单位成本:每位价格 = 总成本 / 总容量
- 存储速度:数据传输率 = 数据的宽度 / 存取周期
数据传输率:又称主存带宽,表示每秒从主存进出信息的最大数量,单位为 字/秒、字节/秒(B/s)、位/秒(bit/s)
数据的宽度:存储字长
存取时间:从启动一次存储器操作到完成该操作所经历的时间,分为读出时间和写入时间
存取周期:又称读写周期、存储周期、访问周期。
- 是存储器进行一次完整的读写操作所需的全部时间,即连续两次独立地访问存储器操作(读或写操作)之间所需的最小时间间隔
- 存储周期 = 存取时间 + 恢复时间
二、主存储器
1. 基本组成
Ⅰ. 半导体元件的原理
一个主存逻辑上分为存储体、MAR、MDR,三者在时序控制逻辑的电路控制下有条不紊地相互配合着工作
一个存储体(存储矩阵)由多个存储单元构成,一个存储单元由多个存储元构成
- 存储元由接地、电容、MOS 管构成

MOS 管:可理解为一种电控开关,输入电压达到某个阈值时,MOS 管就可以接通
电容:可存储电荷,即存储二进制 0、1
读出 1:MOS 管接通,电容放电,数据线上产生电流
读出 0:MOS 管接通,数据线上无电流
假设存储体结构设定一个存储字长为 8 bit
- 则一次能够读出 8 bit 数据,即读写电路每次读 / 写一个存储字
- 存储字是存储体结构规定的(可 8 可 16),字节是固定单位

Ⅱ. 存储芯片的基本原理
先上封装后的图示
译码器:根据地址决定要读写哪个存储字
- 位地址对应 个存储单元
- 译码驱动电路根据 MAR 给的地址信号转化为字选通线的高低电平
前情提要:头上划线表示该信号低电平有效

- 控制电路:片选线( 或 ,Chip Select / Chip Enable):一个内存条可能包含多块存储芯片,片选线控制选择哪块芯片
- 读控制线、写控制线:
- 当使用两根线时,即一根读一根写, 允许写, 允许读
- 当使用一根线时,即读写合并到一根线上, 低电平写、高电平读
- 其他电路控制 MAR、译码器、MDR 是否工作
- 地址线:即地址总线,外部件(如 CPU)通过地址总线将地址信息传输到 MAR
若地址长度为 3 bit,则需要 3 根引脚用于传输地址 - 数据线:即数据总线,将 MDR 中的数据传出内存或写入内存
若存储字长为 8 bit,则需要 8 根引脚;用于传输数据另外还有供电引脚、接地引脚
Ⅲ. 寻址方法
现代计算机通常按字节编址,即每个字节对应一个地址
设字长为 4 B,总容量 1 KB,因此总共会有 256 个字
| 寻址方式 | 单元个数 | 每个单元数据量 | 地址线根数 | 数据线根数 |
|---|---|---|---|---|
| 按字节寻址 | 1024 | 1 B | 10 | 8 |
| 按字寻址 | 256 | 4 B | 8 | 32 |
| 按半字寻址 | 512 | 2 B | 9 | 16 |
| 按双字寻址 | 128 | 8 B | 7 | 64 |
2. RAM 芯片
Ⅰ. SRAM 和 DRAM 概述
DRAM:动态 RAM,Dynamic Random Access Memory,主要用于主存(就是上面说的那种)
- DRAM 芯片:使用栅极电容存储信息

SRAM:静态 RAM,Static Random Access Memory,主要用于 Cache
SRAM 芯片:使用双稳态触发器存储信息
双稳态:A 高 B 低表示 1,A 低 B 高表示 0

SRAM 和 DRAM 都现在都过时了,现在的主存通常采用 SDRAM(同步动态随机存取内存) 芯片
DDR SDRAM:双倍速率同步动态随机存储器,Double Data Rate Synchronous Dynamic Random Access Memory
Ⅱ. SRAM 和 DRAM 区别
破坏性读出:
- DRAM 的电容放电信息被破坏,是破坏性读出。读出后应有重写操作,也称 “再生”,因此读写速度更慢
- SRAM 读出数据,触发器状态保持稳定,是非破坏性读出,无需重写。因此读写速度更快
刷新: - DRAM 的电容内电荷只能维持 2 ms。即便不断电,2 ms 后信息也会消失。因此 2 ms 内必须 “刷新” 一次(给电容充电)
- SRAM 只要不断电,触发器的状态就不会改变
| 类型特点 | SRAM | DRAM |
|---|---|---|
| 存储信息 | 触发器 | 电容 |
| 破坏性读出 | 否 | 是 |
| 读出后需要重写?(再生) | 否 | 需要 |
| 运行速度 | 快 | 慢 |
| 集成度 | 低 | 高 |
| 发热量 | 大 | 小 |
| 存储成本 | 高 | 低 |
| 是否易失 | 易失 | 易失 |
| 需要 “刷新” | 否 | 需要(分散、集中、异步} |
| 送行列地址 | 同时送 | 分两次送(地址线复用技术) |
| 常用作 | Cache | 主存 |
Ⅲ. DRAM 的刷新
刷新周期:一般为 2 ms
刷新方式:
- 分散刷新:每次读写完都刷新一行,则系统的存取周期会增加一倍
- 集中刷新:2 ms 内集中安排时间全部刷新,在这段时间内无法访问存储器,称为访存 ”死区“
- 异步刷新:2 ms 内每行刷新一次即可,可在译码阶段刷新
设 DRAM 内部结构排列成 的形式,存取周期 ,2 ms 内共 个周期
分散刷新:会让系统的存取周期变为 ,前 用于正常读写,后 用于刷新某行
集中刷新:128 个周期总共耗时 ,因此这 无法访问存储器
异步刷新:2 ms 内需要产生 128 次刷新请求,因此每隔 刷新一次,每 内有 的 ”死时间“
每次刷新一行存储单元,即以行为单位
一个存储单元由多个存储元构成
为了减少选通线的数量,因此使用行列地址
刷新方式:有硬件支持,读出一行的信息后重新写入,占用 1 个存取周期
存储器的简单模型,若地址位数有 位,则会有 根选通线

存储单元矩阵,将地址拆分为 位行地址和 位列地址(行、列地址等长)
Ⅳ. DRAM 的地址线复用技术
- 若地址位数较长,则引脚和线路会增加,为了简化电路,通常采用地址线复用技术
- 把行地址、列地址分前后两次传输,就会使地址线减半,因此地址线更少、芯片引脚更少
3. ROM 芯片
Ⅰ. 概述
ROM 芯片:非易失性,断电后数据不会丢失
- 虽然名字是 Read-Only,但很多 ROM 也可以 “写”,也有很多 ROM 具有 ”随机存取“ 的特性
- 主板上的 ROM 芯片也是 “主存” 的一部分(比如 BIOS 芯片)
Ⅱ. 常见 ROM 芯片
BIOS 芯片(Basic Input Output System)
- 存储了 “自举装入程序”,负责引导装入操作系统(开机)
- CPU 根据自举装入程序的指引,指挥 IO 系统将辅存中存储的操作系统相关数据放到主存
MROM(Mask Read-Only Memory):掩模式只读存储器
- 厂家按照客户需求,在芯片生产过程中直接写入信息,之后任何人不可重写(只能读出)
- 特点:可靠性高、灵活性高、生产周期长、只适合批量定制
PROM(Programmable Read-Only Memory):可编程只读存储器
- 用户可用专门的 PROM 写入器写入信息,写一次之后就不可更改
EPROM(Erasable Programmable Read-Only Memory):可擦除可编程只读存储器;允许用户写入信息,之后用某种方法擦除数据,可进行多次重写
- UVEPROM(ultraviolet rays):紫外线可擦除可编程只读存储器
- 用紫外线照射 8 ~ 20 分钟,擦除所有信息
- EEPROM(Electrically):带电可擦除可编程只读存储器
- 可用 ”电擦除“ 的方式,擦除特定的字
- UVEPROM(ultraviolet rays):紫外线可擦除可编程只读存储器
Flash Memory:闪速存储器;如 U 盘、SD 卡
- 在 EEPROM 基础上发展而来,断电后也能保存信息,且可进行多次快速擦除重写
- 由于闪存需要先擦除再写入,因此闪存的 ”写“ 速度要比 “读” 速度更慢
- 闪存每个存储元只需单个 MOS 管,位密度比 RAM 高,即相同的体积可以保存比 RAM 更多的位
SSD(Solid State Drives):固态硬盘
- 由控制单元 + 存储单元(Flash 芯片)构成
- 与闪存的核心区别在于控制单元不一样,但存储介质都类似,可进行多次快速擦除重写。
- 特点:速度快、功耗低、价格高
4. 多模块存储器
存取周期:可以连续读 / 写的最短时间间隔
DRAM 芯片的恢复时间比较长(因为要刷新),有可能是存取时间的几倍
Ⅰ. 单体多字存储器
单体多字存储器只有一套读写电路、MAR、MDR。
每个存储单元存储 个字,总线带宽也要扩展为 个字,每次并行读出 个连续的字
指令和数据在主存内必须是连续存放的,因此灵活性较差
Ⅱ. 多体并行存储器
多提并行存储器:
- 每个模块都有相同的容量和存取速度
- 各模块都有独立的读写控制电路、地址寄存器和数据寄存器。它们既能并行工作,又能交叉工作。
假设有四根内存条,每根内存条容量一致。
记每个存储体存取周期为 ,存取时间为 ,假设 。
高位交叉编址
- 用地址的高比特位区分存储体
- 编址是同一内存条连续编址
- 连续取 个存储字,耗时
- 理论上多个存储体可以被并行访问,但是由于通常会连续访问,因此实际效果相当于单纯的扩容

低位交叉编址 👍‼️
- 用地址的低比特位区分存储体
- 编址是不同内存条横向编址(看图中的地址)

连续取 个存储字,在流水线完美衔接的情况下,耗时
—— 由此可见低位交叉编址比高位交叉编址存取速度更快
流水线 并行存取
宏观上并行,微观上串行:宏观上每个存取周期内所有模块被并行访问,微观上 个模块被串行访问
宏观上,一个存取周期内, 体交叉存储器可以提供的数据量为单个模块的 倍。
说人话:如果有 4 个存储体交叉存储,工作效率是一个存储体的 4 倍
第一种描述:
记存取周期为 ,存取时间为 ,为了使流水线不间断,应保证模块数 ,每个存取周期内可读写地址连续的 个字
若 ,不能完全发挥流水线的作用,在存取周期未结束前 CPU 需等待一段时间
若 ,性能会过剩,导致存储器不能发挥到各自的极限
若 ,存储体与存取周期完美衔接,能够使流水线效率达到顶峰,成本最低。
第二种描述:
记存取周期为 ,总线传输周期为 ,为了使流水线不间断,应保证模块数
虽然和上面一样的描述,但是总线传输周期与存取时间不一样
总线传输周期:通过数据总线把数据传给 CPU 至少需要 时间
三、主存储器与 CPU 的连接
1. 前情提要
现在的计算机 MAR、MDR 通常集成在 CPU 内部。主存中包含多块存储芯片,存储芯片内只需一个普通的寄存器(暂存输入、输出数据)
存储器芯片的输入输出信号
- 地址线:
- 数据线:
片选线(上面有没有横线): - 低电平有效: 或
- 高电平有效: 或
读写控制线: - 一根线:低电平写,高电平读 或 ;高电平写,低电平读 或
- 两根线:低电平有效 和
2. 位扩展
位扩展可以使存储器的字长变得更长,从而更好地发挥数据总线的数据传输能力
假设有一个 位的存储芯片,连接到 CPU。每次只能读或写一位数据,此时存储芯片的存储字长为 1 bit,数据总线没有被充分利用。
将 2 片 位的存储芯片(上面提到的存储芯片)连接至 CPU

将 8 片存储芯片连接组合成 1 个 位的存储器,总容量为 8 KB

3. 字扩展
字扩展可以增加存储器的存储容量,可以更好地利用 CPU 和地址总线的寻址能力
如果存储芯片的位数和 CPU 的位数一样(假设都是 8 位),数据总线的传输能力就能完全发挥,不需要位扩展。但是地址总线仍未充分利用,如下图
线选法:用一个专门的地址线作为片选信号,来选中其他的某一块芯片。
如果 CPU 有 条多余的地址线就能有 个片选信号
特点:电路简单,但地址空间不连续(比如不能是 00、11)

片选法:如果 CPU 有 条多余的地址线就能有 个片选信号
特点:电路复杂,但地址空间连续
1 - 2 译码器:使用非门就能实现 1 - 2 译码器,输入 1 位地址信息,这一位地址信息有可能呈现出两种不同的状态,这两种不同的状态会被译码器翻译为要么是上面高电平,要么是下面高电平。下图是 1 - 2 译码器

2 - 4 译码器:输入 2 位地址信息,对应为 种不同的状态。注意这里的存储芯片上有一个 〇 表示低电平有效(与非门区分开);译码器右边的 〇 表示非门

同理,也有 3 - 8 译码器,输入 3 位地址信息,对应为 种不同的状态

4. 字位同时扩展
字位同时扩展的连接方式: 将进行位扩展的芯片作为一组,各组的连接方式与位扩展的相同;由系统地址线高位译码产生若干片选信号,分别接到各组芯片的片选控制线。
假设有 8 个 位的存储芯片,两两一组位扩展,一共四组,用 2 - 4 译码器进行字扩展
- 每一组总共有 16 K 个存储单元,每个单元可以存 8 位数据
- 总共 4 组,组合在一起可以得到 位的存储器
5. 译码器补充
高电平有效

- 低电平有效,有 〇,适合与低电平有效芯片配合使用


使能信号:CPU 可以使用译码器的使能端 控制 片选信号的生效时间。这里参照 74LS138 译码器
74LS138 译码器具有多个使能端,更多地了解该译码器去看《数字电路》
只有当 为高电平,同时 为低电平,译码器才开始工作(Gate,门控)
:存储器请求信号(Memory Request),当 CPU 正式访问主存时,就将该信号置为有效,这里上面有一横线所以是低电平有效。
CPU 通过地址总线送出地址信号,刚开始送出时电信号可能不稳定,因此送出信息后等待电流稳定后再发出 ,让译码器的某个选通线有效,这样就能保证当一块存储芯片被选通时,这块存储芯片所接收到的地址电信号一定是稳定的

配合 RAM 的读周期时序图(这个图不重要,看看就行)

四、外部存储器
计算机的外存储器又称为辅助存储器,外存储器既可以作为输入设备,也可以作为输出设备
1. 磁表面存储器
磁表面存储器:是指把某些磁性材料薄薄地涂在金属铝或塑料表面上作为载磁体来存储信息。磁盘存储器、磁带存储器、磁鼓存储器均属于磁表面存储器。
优点:
- 存储容量大,位价格低
- 记录介质可以重复使用
- 记录信息可以长期保存而不丢失,甚至可以脱机存档
- 非破坏性读出,读出时不需要再生
缺点:
- 存取速度慢:磁表面存储器每次只能读写 1 bit,且读写不可同时进行
- 机械结构复杂
- 对工作环境要求较高
2. 磁盘存储器
Ⅰ. 构成
磁盘存储器由磁盘驱动器、磁盘控制器和盘片组成。
磁盘驱动器:即机械部分,核心部件是磁头组件和盘片组件,温彻斯特盘是一种可移动头固定盘片的硬盘存储器

磁盘控制器:即电子部分,是磁盘存储器和主机的接口,主流的标准有 IDE、SCSI、SATA 等

盘片:一块磁盘存储器含有若干个记录面,每个记录面划分为若干条磁道,每条磁道由划分为若干个扇区。
磁头数(Heads):即记录面数,表示硬盘总共有多少个磁头,磁头用于读取 / 写入盘片上记录面的信息,一个记录面对应一个磁头。
柱面数(Cylinders):表示硬盘每一面盘片上有多少条磁道。在一个盘组中,不同记录面的相同编号(位置)的诸磁道构成一个圆柱面。
扇区数(Sectors):表示每一条磁道上有多少个扇区。

Ⅱ. 性能指标
- 磁盘的容量:一个磁盘所能存储的字节总数称为磁盘容量。
磁盘容量有非格式化容量和格式化容量之分,非格式化容量 > 格式化容量 。
非格式化容量:磁记录表面可以利用的磁化单元总数。
格式化容量:按照某种特定的记录格式所能存储信息的总量。 - 记录密度:盘片单位面积上记录的二进制的信息量。
道密度:沿磁道半径方向单位长度上的磁道数。如:60 道 / cm
位密度:磁道单位长度上能记录的二进制代码位数。如:600 bit / cm
面密度:是位密度和道密度的乘积。
磁盘所有磁道记录的信息量一定是相等的,并不是圆越大信息越多,所以每个磁道的位密度都不同,越内侧的磁道位密度越大

平均存取时间 = 寻道时间 + 旋转延迟时间 + 传输时间
寻道时间:磁头移动到目的磁道(常取平均值)
旋转延迟时间:磁头定位到所在扇区,平均为转半圈所需时间(常取平均值)
传输时间:传输数据所花费的时间
数据传输率:磁盘存储器在单位时间内向主机传送数据的字节数。
假设磁盘转数为 转 / 秒,每条磁道容量为 个字节,则数据传输率为
Ⅲ. 磁盘地址
计算机内部可以连接多个磁盘,主机向磁盘控制器发送寻址信息,磁盘地址包括: 驱动器号、柱面(磁道)号、盘面号、扇区号
- 驱动器号:一台电脑可能有多个磁盘,驱动器号用于选中一个硬盘驱动器
- 柱面(磁道)号:指明移动磁头臂到什么位置(寻道)
- 盘面号:选择激活哪个磁头
- 扇区号:通过旋转将特定扇区划过磁头下方
若系统中有 4 个驱动器,每个驱动器带一个磁盘,每个磁盘 256 个磁道、16 个盘面,每个盘面划分为 16 个扇区,则每个扇区地址要 18 位二进制代码。
驱动器号 2 bit
柱面(磁道)号 8 bit
盘面号 4 bit
扇区号 4 bit
Ⅳ. 工作过程
磁盘的主要操作是寻址、读盘、写盘。
- 每个操作都对应一个控制字,磁盘工作时,第一步是取控制字,第二步是执行控制字
- 磁盘属于机械式部件,其读写操作是串行的,不可能在同一时刻既读又写,也不可能在同一时刻读两组数据或写两组数据。
Ⅴ. 磁盘阵列 RAID
RAID(Redundant Array of Inexpensive Disks,廉价冗余磁盘阵列):是将多个独立的物理磁盘组成一个独立的逻辑盘,数据在多个物理盘上分割交叉存储、并行访问,具有更好的存储性能、可靠性和安全性。
- 通过同时使用多个磁盘,提高了传输率
- 通过在多个磁盘上并行存取来大幅提高存储系统的数据吞吐量
- 通过镜像功能,可以提高安全可靠性
- 通过数据检验,可以提高容错能力
在 RAID 1 ~ RAID 5 的几种方案中,无论何时有磁盘损坏,都可以随时拔出受损的磁盘再插入好的磁盘,而数据不会损坏。
RAID 0:无冗余和无校验的磁盘阵列。
逻辑上相邻的两个扇区在物理上存到两个磁盘,类似 “低位交叉编址的多体存储器”
RAID 0 没有容错能力
RAID 1:镜像磁盘阵列
很粗暴,存两份数据
RAID 1 容量减少一半,存储利用率低
RAID 2:采用纠错的海明码的磁盘阵列
逻辑上连续的几个 bit 物理上分散存储在各个盘中,再增加若干磁盘保存海明校验码
4 bit 信息位 + 3 bit 海明校验位可纠错一位,检错两位
RAID 3:位交叉奇偶校验的磁盘阵列
RAID 4:块交叉奇偶校验的磁盘阵列
RAID 5:无独立校验的奇偶校验磁盘阵列
3. 固态硬盘SSD
原理
基于闪存技术 Flash Memory,属于电可擦除 ROM,即 EEPROM
组成
- 闪存翻译层:负责翻译逻辑块号,找到对应页(Page),即地址变换
- 存储介质:多个闪存芯片(Flash Chip),每个芯片包含多个块(Block),每个块包含多个页(Page)
读写性能特性
- 以页(Page)为单位读写,相当于磁盘的 “扇区”
- 以块(Block)为单位 “擦除”,擦干净的块,其中的每页都可以写一次,读无限次
- 读快,写慢。要写的页如果有数据,则不能写入,需要将块内其它页全部复制到一个新的(擦出过的)块中,再写入新的页
- 支持随机访问,系统给定一个逻辑地址,闪存翻译层可通过电路迅速定位到对应的物理地址
与机械硬盘对比
- SSD 读写速度快,随机访问性能高,用电路控制访问位置;机械硬盘通过移动磁臂旋转磁盘控制访问位置,有寻道时间和旋转延迟
- SSD 安静无噪音、耐摔抗震、能耗低、造价更贵
- SSD 的一个 “块” 被擦除次数过多(重复写同一个块)可能会坏掉,而机械硬盘的扇区不会因为写的次数太多而坏掉
SSD磨损均衡技术
思想:将 “擦除” 平均分布在各个块上,以提升使用寿命
- 动态磨损均衡:写入数据时,优先选择累计擦除次数少的新闪存块
- 静态磨损均衡:SSD 监测并自动进行数据分配、迁移,让老旧的闪存块承担以读为主的储存任务,让较新的闪存块承担更多的写任务
五、高速缓冲存储器 Cache
1. 基本概念
局部性原理:
- 空间局部性:在最近的未来要用到的信息(指令和数据),很可能与现在正在使用的信息在存储空间上是临近的。如:数组元素、顺序执行的指令代码
- 时间局部性:在最近的未来要用到的信息,很可能是现在正在使用的信息。如:循环结构的指令代码
基于程序访问的局部性原理 - 增加 ”Cache - 主存“ 层,可以把 CPU 目前访问的地址 “周围” 的部分数据放到 Cache 中,用于缓和 CPU 与主存之间的速度矛盾
将主存的 存储空间分块 (如:每 1 KB 为一块), 主存与 Cache 之间以 “块” 为单位进行数据交换
操作系统中,通常将主存中的 “一个块” 称为 “一个页 / 页面 / 页框”
Cache 中的 “块” 也称为 “行”,每次被访问的主存块,一定会被立即调入 Cache
Cache 被集成在 CPU 内部,用 SRAM 实现,速度快,成本高,集成度低
假设主存容量 4 MB,每 1 KB 为一块,则

主存地址有 22 位:
主存被分为 4096 块:
综上,主存地址可分为:12 位块号 + 10 位块内地址
设访问一次 Cache 所需时间 ,访问一次主存所需时间 ,“Cache - 主存” 系统的平均访问时间
命中率 :CPU 欲访问的信息已在 Cache 中的比率
缺失(未命中)率
- 访问方式一:CPU 先访问 Cache,若 Cache 未命中再访问主存,平均访问时间
- 访问方式二:同时访问 Cache 和主存,若 Cache 命中则立即停止访问主存,平均访问时间
假设Cache的速度是主存的5倍,且Cache的命中率为95%,则采用Cache后,存储器性能提高多少? 设Cache的存取周期为,则主存的存取周期为
方式1:Cache和主存同时访问
若Cache和主存同时访问,命中时访问时间为,未命中时访问时间为 平均访问时间: $$ 0.95 \times t + 0.05 \times 5t = 1.2t $$ 故性能为原来的 $$ \frac{5t}{1.2t}\approx4.17\text{倍} $$ 性能提高:倍
方式2:先访问Cache,再访问主存(串行访问)
若先访问Cache再访问主存,命中时访问时间为,未命中时访问时间为 平均访问时间: $$ T_a=0.95 \times t + 0.05 \times 6t = 1.25t $$ 故性能为原来的 $$ \frac{5t}{1.25t}=4\text{倍} $$ 性能提高:倍
2. Cache 和主存的映射方式
CPU与Cache之间的数据交换以字为单位;Cache与主存之间的数据交换以Cache块为单位。
用于区分 Cache 与主存的数据块对应关系
三种映射方式:全相联映射、直接映射、组相联映射
Cache 中存储:有效位(0/1)+ 标记 + 整块数据。初始值为 0
“标记” 用于指明对应的内存块,不同映射方式,“标记” 的位数不同
- 全相联映射 :主存块可以放在 Cache 的任意位置
主存地址结构:标记(整个主存块号)+ 块内地址
- 优点:Cache 存储空间利用充分,命中率高
- 缺点:查找 “标记” 最慢,有可能需要对比所有行的标记

- 直接映射 :每个主存块只能放到特定的某个 Cache 行
主存地址结构:标记(主存块号前几位)+ 行号(主存块号末 位)+ 块内地址
若 Cache 总行数为 ,则主存块号末尾 位直接反映它在 Cache 中的位置
- 优点:对于任意一个地址,只需对比一次 “标记”,速度最快
- 缺点:Cache 存储空间利用不充分,命中率低

- 组相联映射 :Cache 块分为若干组,每个主存块可放到特定分组中的任意位置
主存地址结构:标记(主存块号前几位)+ 组号(主存块号末 位)+ 块内地址
路组相联映射:每 个Cache 行为一组
若 Cache 分为 组,则主存块号末尾 位反映它在 Cache 中的所属分组,然后再依次对比分组中的标记
- 优点:另外两种方式的折中,综合效果较好

CPU 访问主存地址步骤
- 确定所处位置
- 全相联映射:主存块号对比 Cache 中所有块的标记
- 直接映射:根据主存块号的后 位确定 Cache 行
- 组相联映射:根据主存块号的后 位确定所属分组号
- 命中规则:
- 全相联映射:若标记完全匹配,且有效位为 1,则 Cache 命中,访问块内地址单元
- 直接映射:若主存块号排除末尾 位后( 为 Cache 中块数)与 Cache 标记匹配,且有效位为 1,则 Cache 命中,访问块内地址单元
- 组相联映射:若主存块号排除末尾 位后( 为 Cache 分组数)与分组内的某个标记匹配,且有效位为 1,则 Cache 名字,访问块内地址单元
- 若未命中,则正常访问主存
3. Cache 替换算法
Cache 很小,主存很大,因此 Cache 很容易装满。只有全相联映射和组相联映射需要替换算法,直接映射不需要:
- 全相联映射:Cache 完全满了才需要替换,需要在全局选择替换哪一块
- 直接映射:如果对应位置非空,则毫无选择地直接替换
- 组相联映射:分组内满了才需要替换,需要在分组内选择替换哪一块
抖动现象:频繁的换入换出现象,刚被替换的块很快又被调入。
随机算法(RAND,Random)
若 Cache 已满,则随机选择一块替换
实现简单,但完全没有考虑局部性原理,命中率低,实际效果很不稳定先进先出算法(FIFO,First In First Out)
若 Cache 已满,则替换最先被调入 Cache 的块
实现简单,最开始按行号递增的次序依次放入初始的内存块,之后按先后顺序轮流替换
没有考虑局部性原理,最先被调入 Cache 的块也有可能是被频繁访问的近期最少使用算法(LRU,Least Recently Used)
为每个 Cache 块设置一个 “计数器”,用于记录每个 Cache 块已经有多久没被访问了。当 Cache 满后替换 “计数器” 最大的
Cache 块的总数为 ,则计数器只需 位。且 Cache 装满后所有计数器的值一定不重复。
实现过程:- 命中时,所命中的行的计数器清零,比其低的计数器 +1,比其高的计数器不变
- 未命中且还有空闲行时,新装入的行的计数器置为 0,其余非空闲行全 +1
- 未命中且无空闲行时,计数值最大的行的信息块被淘汰,新装行的块的计数器置为 0,其余全 +1
基于局部性原理,因此实际运行效果优秀,Cache 命中率高
若被频繁访问的主存块数量 > Cache 行的数量,则有可能发生 ”抖动“
最不经常使用算法(LFU,Least Frequently Used)
为每个 Cache 块设置一个 ”计数器“,用于记录每个 Cache 块被访问过几次。当 Cache 满后替换 ”计数器“ 最小的
若有多个计数器最小的行,可按照行号递增、FIFO 策略进行选择
曾经被经常访问的主存块在未来不一定会用到,并没有很好地遵循局部性原理,因此实际运行效果不如 LRU
4. Cache 写策略
CPU 修改了 Cache 中的数据副本,如何确保主存中数据母本的一致性
写命中:
- 写回法(write-back):当 CPU 对 Cache 写命中时,只修改 Cache 的内容,而不立即写入主存,只有当此块被换出时才写回主存,未被修改的块不必写回
脏位:新增脏位信息,表示是否被修改过
减少了访存次数,但存在数据不一致的隐患 - 全写法(写直通法,write-through):当 CPU 对 Cache 写命中时,必须把数据同时写入 Cache 和主存,一般使用写缓冲(write buffer)
写缓冲:是一个 SRAM 实现的 FIFO 队列,CPU 写完后,在专门的控制电路控制下逐一写回主存
使用写缓冲,CPU 写的速度很快,若写操作不频繁,则效果很好。若写操作很频繁,可能会因为写缓冲饱和而发生阻塞
访存次数增加,速度变慢,但更能保证数据一致性
写不命中:
- 写分配法(write-allocate):当 CPU 对 Cache 写不命中时,把主存中的块调入 Cache,在 Cache 中修改,通常搭配写回法使用
- 非写分配法(not-write-allocate):当 CPU 对 Cache 写不命中时,只写入主存,不调入 Cache。搭配全写法使用,只有 “读” 未命中时才调入 Cache
多级 Cache:

现在计算机通常采用多级 Cache 结构
离 CPU 越近速度越快容量越小,离 CPU 越远速度越慢容量越大
各级 Cache 间常采用 “全写法 + 非写分配法”;Cache 和主存间常采用 “写回法 + 写分配法”
做题总结
- 芯片:单元数,是每单元位数(数据引脚)。
- 逻辑地址位数 =
- 总芯片数 =
- DRAM物理地址引脚 =
- 判断对齐:地址对类型所占字节数取模等于0。
一、芯片基础概念
芯片格式:,例 位
- 单元数:一共有多少存储字;
- 单元位数:每个存储单元多少bit,等于芯片数据引脚数
SRAM、DRAM地址引脚区别(考试高频坑)
| 芯片类型 | 物理地址引脚 | 数据引脚 |
|---|---|---|
| SRAM | 等于逻辑地址位数,不复用 | 等于单元位数 |
| DRAM | 地址行/列分时复用,引脚数 = 逻辑地址位数 | 等于单元位数 |
例:DRAM 位
,逻辑地址24位;行12、列12;物理地址引脚12根,数据引脚8根。
二、位扩展(扩充存储字长,加宽数据线)
目的
每个存储字的位数不够,多片芯片并行,拼成更宽的数据位;存储单元总数不变,地址空间不变。
原题例子:8片 → 位。
接线特点
- ✅地址引脚:全部芯片并联共用,地址引脚数量不变
- ✅片选:所有芯片同时选中,一起工作
- ✅数据引脚:每一片输出一部分bit,拼接成更宽数据总线,数据引脚增加
计算
位扩展组数
只做位扩展:单元数不变,不需要新增片选译码电路。
三、字扩展(扩充存储单元数量,扩大地址空间)
目的
存储单元总数不够;数据位宽不变,增加内存总容量;增加可访问的地址数量。
例:2片 → 位
接线特点
- ✅低位地址引脚:所有芯片并联共用
- ✅数据引脚:全部芯片数据线并联到同一组数据总线,数据引脚不变
- ✅高位地址:外部译码,产生片选;同一时刻只选中一片芯片工作
⚠️译码的高位地址不接到芯片的地址引脚,芯片地址引脚只接低位。
计算
字扩展组数
四、字位同时扩展(既扩地址又扩位宽)
- 第一步:先做位扩展,组成一组,达到目标位宽;
- 第二步:多组之间做字扩展,片选区分不同组;
总芯片数 = 位扩展组数 × 字扩展组数。
例:芯片,目标
位扩展组数 ;字扩展组数 ;总芯片 片。
| 对比 | 位扩展 | 字扩展 |
|---|---|---|
| 作用 | 增加存储字的位数(位宽) | 增加存储单元数量(地址空间) |
| 地址引脚 | 不变,全部并联 | 低位并联;高位译码做片选,不进芯片引脚 |
| 数据引脚 | 增多,分片输出不同bit | 不变,全部并联 |
| 片选 | 全部芯片同时有效 | 同一时刻仅1片有效 |
五、对齐访问(按字节编址,总线64位=8字节存储字长)
- 按字节编址:每一个地址对应1字节;存储字长 = 总线宽度 = 一次总线传输的大小。
本题存储字长 =64bit =8字节;每一个存储字占连续8个字节地址。
存储字块边界地址一定是8的倍数,地址最低3位二进制=0。
- 数据类型对齐要求
| 类型 | 字节数 | 对齐要求 | 判断条件 |
|---|---|---|---|
| double | 8B | 8字节对齐 | 地址 \b\(\bmod8=0\),低3位=0 |
| int | 4B | 4字节对齐 | 地址 \b\(\bmod4=0\),低2位=0 |
例子:
double x地址1000H:1000 \b\(\bmod8=0\),对齐;1000H‑1007H全部在同一个存储字,一次总线传输读完。int y地址1006H:,非对齐;占用地址1006H,1007H,1008H,1009H
- 前2字节属于存储字
1000‑1007H,后2字节属于存储字1008‑100FH;跨两个存储字,需要2次总线传输,CPU内部拼接数据。
- 判断是否跨存储字
存储字大小字节;变量占字节;
变量末地址 = 起始地址
如果起始地址和末地址落在不同存储字块 → 跨存储字,多次访存。
注意:满足4字节对齐的int,依然有可能跨8字节存储字边界。
六、突发传送Burst
只给出起始存储字地址,之后连续自动传输后续多个存储字;适合读取连续内存块,提升效率;传输单位为完整存储字。
七、MAR和MDR寄存器
作用
- MAR 存储器地址寄存器 存放CPU要访问的内存单元地址(读、写内存的目标地址)。
MAR的位数 = 地址线位数,决定可寻址单元总数。 - MDR 存储器数据寄存器 存放从内存读出的数据 / 准备写入内存的数据。
MDR的位数 = 存储单元的位宽(编址单位大小)。
核心公式:
设一个1MB容量的存储器,字长为32位,问:
- 按字节编址,地址寄存器和数据寄存器各几位?编址范围为多大?
- 按字编址,地址寄存器和数据寄存器各几位?编址范围为多大?
已知条件: 总容量:,字长32位,1字=32bit=4B
(1) 按字节编址(1个编址单元 = 1B = 8bit)
可寻址单元数量:
MAR(地址寄存器):20位(需要表示个地址)
MDR(数据寄存器):8位(单元位宽为8bit)
编址范围:
(2) 按字编址(1个编址单元 = 1字 = 32bit = 4B)
单元个数 = 总字节数 ÷ 每个字字节数
MAR(地址寄存器):18位
MDR(数据寄存器):32位(单元位宽32bit)
编址范围:
Cache容量计算

