第3章 存储系统
第3章 存储系统¶
历年命题重点,Cache 和虚拟存储器容易出综合题。选择题高发区:存储器特点、存储器扩展(芯片选择、连接方式、地址范围)、交叉存储器、Cache 计算与替换算法、虚拟存储器与 TLB。这章要和《操作系统》的内存管理对着复习。
b_82_3【知识树】第3章骨架¶
- 存储器概述
- 四种分类:存储元件 / 存取方式 / 可更改性 / 可保存性
- 层次结构:Cache-主存层(解决速度)、主存-辅存层(解决容量)
- 性能指标:存取时间 vs 存储周期、带宽
- 主存储器
- SRAM(触发器)vs DRAM(电容)
- DRAM 三大关键技术:地址引脚复用、刷新、行缓冲与突发传输
- ROM 与 Flash、SSD
- 多模块存储器:连续编址 vs 交叉编址
- 主存与 CPU 连接
- 位扩展 / 字扩展 / 字位同时扩展
- 外部存储器
- 磁盘:结构、性能指标、地址、RAID
- SSD:闪存翻译层、磨损均衡
- Cache
- 局部性原理
- 三种映射方式
- 替换算法、写策略
- 虚拟存储器
- 页式 / 段式 / 段页式
- 页表、地址转换、TLB
b_82_0;PDF 第 82 页 · b_82_63.1 存储器概述¶
按存取方式,存储器分哪四类? ★1考¶
- 随机存取存储器 RAM:任意单元可读写,存取时间与物理位置无关(半导体存储器)
- 顺序存取存储器:按顺序存取,存取时间取决于数据位置(磁带)
- 直接存取存储器:先定位到目标区域,再顺序读取(机械磁盘)
- 相联存储器:按内容而非地址存取,用于 TLB、路由表
★ 考过 2011
b_83_4什么是破坏性读出?谁需要它?¶
读取操作会破坏存储单元原有信息,读出后必须立即执行再生操作恢复数据。
典型代表是 DRAM(靠电容存电荷)。SRAM 是非破坏性读出,无须再生。
b_83_0MAR 和 MDR 的位数分别由什么决定? ★1考¶
- MAR 的位数 = 地址线位数 → 决定主存的最大可寻址范围
- MDR 的位数 = 数据线宽度 → 决定一次能并行存取多少位
例:36 位地址 → 寻址范围 0 ~ 2³⁶−1,共 64GB(字节编址);64 位数据线 → 每次并行存取 8 字节。
★ 考过 2021
💡 记忆法:"MAR 管多大,MDR 管多宽"。
b_83_12存储层次里的两个关键层级各解决什么问题?¶
- Cache-主存层:解决 CPU 与主存速度不匹配,调度由硬件自动完成,对所有程序员透明
- 主存-辅存层:解决主存容量不足,调度由硬件与操作系统协同完成,对应用程序员透明
⚠️ 两层的透明对象不同:Cache 层对所有程序员透明,主存-辅存层只对应用程序员透明(系统程序员看得见)。
b_84_2从 CPU 看,两个层次各自"像"什么?¶
- Cache-主存层:速度接近 Cache,容量和单位成本接近主存
- 主存-辅存层:速度接近主存,容量和单位成本接近辅存
在本书抽象的 Cache—主存、主存—辅存层次中,可按“上一层保存下一层内容的子集副本”理解。
⚠️ 不能外推为所有现代多级 Cache 都严格包含;实际系统还可能采用非包含式或独占式层级。
b_84_8存取时间和存储周期有什么区别?¶
- 存取时间 Ta:完成一次读/写操作所需的时间
- 存储周期 Tm:连续两次独立读/写操作所需的最小时间间隔
存储周期 > 存取时间,因为每次读写后存储器需要恢复内部状态。对破坏性读出的 DRAM,因为要再生,甚至可达 Tm = 2Ta。
💡 记忆法:"存取是干活,周期是干活 + 喘气"。
b_85_0;PDF 第 85 页 · b_85_13.2 主存储器¶
SRAM 和 DRAM 用什么存信息?¶
- SRAM:双稳态触发器(六晶体管 MOS),靠电路的两个稳定状态存 0/1
- DRAM:栅极电容上的电荷,有电荷表示 1、无电荷表示 0,仅需一个晶体管 + 一个电容
💡 记忆法:"S 用触发器,D 用电容" —— 电容会漏电,所以 D 要刷新。
b_87_9SRAM 和 DRAM 的八项对比?¶
| 特点 | SRAM | DRAM |
|---|---|---|
| 存储信息 | 触发器 | 电容 |
| 破坏性读出 | 否 | 是 |
| 需要刷新 | 不需要 | 需要 |
| 送行列地址 | 同时送 | 分两次送(复用) |
| 运行速度 | 快 | 慢 |
| 集成度 | 低 | 高 |
| 存储成本 | 高 | 低 |
| 主要用途 | 高速缓存 | 主机内存 |
b_90_0DRAM 为什么要用地址引脚复用技术? ★1考¶
DRAM 容量大、所需地址位数多。把行地址和列地址通过相同的引脚分两次先后输入,可以让地址引脚数量减少一半。
由 RAS(行选通)和 CAS(列选通) 信号控制分时传送。
★ 考过 2014
b_88_9DRAM 刷新有什么特点?¶
- 按行刷新:只需提供行地址和 RAS 信号,即可选中一整行执行读操作
- 芯片内部有刷新计数器自动产生行地址,其位数与行地址位数相同
- 2048×2048 的阵列只需 2048 次刷新即可覆盖全芯片(无须列地址)
- 刷新周期 = 对某一特定行完成一次刷新到下次再刷新该行的时间间隔
b_89_0DRAM 芯片的行列数为什么设计成"行 ≤ 列"的近似正方形? ★1考¶
两个约束叠加: - 因为地址引脚复用,引脚数由行、列地址位数中的较大者决定 → 要使 r 与 c 尽可能接近 - 因为按行刷新,行数越少刷新开销越低 → 还需满足 r ≤ c
所以设计成"行数略小于或等于列数"的近似正方形。
★ 考过 2018
b_89_2行缓冲器的容量怎么算? ★1考¶
行缓冲器容量 = 列数 × 每个存储单元的位数(即一行中所有存储单元的数据总量)。
例:4 列 × 8 位 = 32 位。
作用:某行被选中后全部数据一次性加载进行缓冲器,后续每个时钟周期连续输出一个单元,支持突发传输。
★ 考过 2022
b_89_5SDRAM 比异步 DRAM 强在哪?¶
- 异步 DRAM:芯片接口不按系统时钟的固定边沿组织命令与数据,控制器要按规定时序等待就绪;这不等于“CPU 软件不断轮询”,更不等于 CPU 必然什么也做不了
- SDRAM(同步 DRAM):命令、地址和数据传送与时钟同步,控制器可按已知周期安排流水化/突发访问,更容易提高总线利用率
💡 DRAM 读周期因果链:地址译码 → 破坏性读出 → 放大并输出 → 数据再生 → 恢复阵列。正因为读出会破坏电荷,才需要再生与定期刷新。
连续访问同一行(页)内数据时可实现突发传输。
b_89_10;PDF 第 89 页 · b_89_11ROM 相比 RAM 的两个优点? ★1考¶
- 结构简单,位密度高于 SRAM 等可读写存储器
- 断电后数据不丢失,可靠性高
两者都是随机访问。类型:MROM(厂商固化)、PROM(一次编程)、EPROM(可多次,但每次擦除需紫外线照射整片、擦写次数有限、写入慢)。
★ 考过 2010
b_90_4Flash 存储器的特点? ★1考¶
在 EPROM 基础上发展而来,兼具 ROM 和 RAM 的部分优点: - 断电后信息可长期保存 - 支持电擦除与在线重写,无须紫外线照射 - 读取速度接近 RAM,但写入速度显著较慢 —— 读写性能不对称
现代主板的 BIOS 就存在 Flash 里,所以用户能自己刷新 BIOS。
★ 考过 2012
b_90_83.3 多模块存储器¶
连续编址(高位交叉)为什么不能提高吞吐率?¶
高位地址是模块号,低位是模块内地址。访问连续主存块时总是先在一个模块内访问完才转到下一个模块,各模块不能并行,本质上仍是顺序存取。
b_91_3交叉编址(低位交叉)怎么分配地址? ★1考¶
低位地址作模块号,高位地址作模块内地址,即 模块号 = 单元地址 % m。
所以单元 0, m, 2m… 在 M₀;单元 1, m+1, 2m+1… 在 M₁,连续地址被打散到不同模块,可以并行访问。
★ 考过 2017
💡 记忆法:"低位交叉才交叉" —— 低位当模块号,连续地址才会横跨多个模块。
b_91_6交叉存储器轮流启动,模块数怎么定?连续取 m 个字要多久? ★2考¶
- 设存储模块周期为 T、相邻模块启动间隔为 r,一般要求模块数 m ≥ ⌈T/r⌉
- 只有 T/r 恰为整数、并取理想最小模块数时,才可简写为 m=T/r
- 这样再次轮到同一模块前至少经过 mr≥T,上次操作已经完成
- 连续存取 m 个字的时间:t₁ = T + (m−1)r
- 对比顺序方式:t₂ = mT
★ 考过 2012、2013
b_92_0【做题模板】交叉存储器与突发传输为什么要画时间轴?¶
公式只适合标准模型;遇到综合题按下面五步画“甘特式时间轴”:
- 先把地址拆成模块号 + 模块内地址,确认连续地址落到哪些模块。
- 标出地址阶段、首字延迟 \(T\)、相邻启动间隔 \(r\) 和单次数据传送时间。
- 每隔 \(r\) 尝试启动下一模块;若同一模块距上次启动不足 \(T\),就在冲突处等待。
- 再判断地址与数据阶段能否重叠、突发期间是否释放总线、每个节拍传几个字。
- 用“最后一个数据传完的时刻 − 起始时刻”求总时间,再由有效字节数除以总时间求实际传输率。
只有在无冲突、流水稳定且题设时序与教材标准模型一致时,才可直接用 \(T+(q-1)r\)。
b_92_0;PDF 第 92 页 · b_92_3交叉存储器什么时候会发生访存冲突? ★1考¶
理想情况下 m 体交叉可按间隔 r 轮流启动模块。判断冲突的通用条件是:
同一模块两次启动之间的实际间隔小于该模块完成一次访问所需的周期 T。
因此只要某模块尚未恢复可用就再次被访问,后一请求就要延迟;并不要求“相邻 m 次访问全都在同一个模块”。
★ 考过 2015
b_92_6同时启动方式为什么要求数据对齐?¶
先看一次并行启动时所有模块提供的总位宽是否恰好等于数据总线宽度;满足时才可把这些模块看成一个并行访问组。
王道这里的 8 个 8 bit 模块 + 64 bit 数据总线例题中,并行访问粒度才是连续 8 字节(07、815…)。若访问 4B 的 int 从地址 6 开始,会横跨两个 8B 传输块,因而需两次总线访问。
⚠️ 这不是所有存储器都固定“8B 对齐”的通则;并行粒度、总线宽度、是否允许非对齐访问及其代价都由具体系统/题设决定。
b_92_8;PDF 第 92 页 · b_92_93.4 主存与 CPU 的连接¶
位扩展怎么连?¶
用于增加存储字的长度(CPU 数据总线宽度 > 单芯片数据位宽)。 - 地址线、片选线、读写控制线:各芯片并联接系统总线 - 数据线:单独引出,分别接系统数据总线的不同位 - 所有芯片同时工作,共同提供一个完整字
例:8 片 8K×1 位 → 8K×8 位。
b_103_0字扩展怎么连? ★2考¶
用于增加存储单元数量(扩大地址空间)。 - 地址线:接系统地址总线的低位 - 数据线、读写控制线:并联 - 系统地址总线的高位经译码器生成片选信号,分时选中不同芯片 - 各芯片分时工作,同一时刻只有一个被选中
例:4 片 16K×8 位 → 64K×8 位,用 A₁₅A₁₄ 译码产生 4 个片选,地址范围依次为 00…/01…/10…/11… 开头的四段。
★ 考过 2010、2016
b_103_9字位同时扩展怎么做?¶
先位扩展再字扩展: - 先把若干芯片按位扩展组成一组(满足字长要求) - 再把多组按字扩展连接 - 系统地址线低位接组内芯片的地址引脚,高位经译码器生成各组的片选信号
例:8 片 16K×4 位 → 每 2 片一组(位扩展成 16K×8 位),共 4 组 → 64K×8 位。
💡 记忆法:"先并后选" —— 先并联凑字长,再译码选组。
b_104_03.5 外部存储器¶
磁盘的存储区域三个概念? ★1考¶
- 记录面数 = 磁头数量(每个磁头负责一个记录面)
- 柱面数 = 单个记录面上的磁道数量(所有记录面上相同编号的磁道构成一个柱面)
- 扇区数 = 每条磁道包含的扇区数量,扇区是磁盘读写的最小单位
⚠️ 扇区按固定圆心角度划分,导致从外到内位密度逐渐增加,磁盘存储能力受限于最内圈的最大记录密度。
★ 考过 2019
b_108_2;PDF 第 108 页 · b_108_3;PDF 第 108 页 · b_108_4;PDF 第 108 页 · b_108_5;PDF 第 108 页 · b_108_6磁盘的非格式化容量和格式化容量怎么算?¶
- 非格式化容量 = 记录面数 × 柱面数 × 每磁道磁化单元数
- 格式化容量 = 记录面数 × 柱面数 × 每道扇区数 × 每扇区字节数
非格式化容量 > 格式化容量,因为要预留扇区间隙、同步字段等格式开销。
b_108_13磁盘的响应时间由哪几部分组成? ★3考¶
响应时间 = 排队延迟 + 控制器时间 + 寻道时间 + 旋转等待时间 + 数据传输时间
其中后三项合称存取时间: - 寻道时间:磁头移到目标磁道;只有题设把行程/寻道时间按相应区间均匀化时,才可用“给定最大寻道时间的一半”作教材近似,实际平均值应以设备参数或题设分布为准 - 旋转等待时间:目标扇区转到磁头下;只有目标相位相对磁头均匀分布、转速恒定时,期望才等于旋转半周 - 数据传输时间:读写一个扇区的时间
★ 考过 2013、2015、2022
💡 记忆法:"先看分布,再谈一半";转半圈同样依赖随机到达相位均匀。
b_108_14;PDF 第 108 页 · b_108_15磁盘的最大数据传输速率怎么算?¶
Dr = r × N(r 是转速,单位转/秒;N 是单磁道容量,单位字节)。
b_109_2;PDF 第 109 页 · b_109_18磁盘地址由哪三部分组成? ★1考¶
柱面(磁道)号 | 盘面(磁头)号 | 扇区号
例:16 个盘面、每面 256 个磁道、每道 16 个扇区 → 柱面号 8 位、盘面号 4 位、扇区号 4 位,共 16 位。
★ 考过 2022
b_109_5RAID 0 到 RAID 5 分别是什么? ★1考¶
- RAID0:无冗余、无校验(条带化,速度快容量大但不具备容错能力)
- RAID1:镜像磁盘阵列(两盘互为备份,有效容量减半)
- RAID2:海明码纠错
- RAID3:位交叉奇偶校验
- RAID4:块交叉奇偶校验
- RAID5:无独立校验盘的分布式奇偶校验
★ 考过 2013
💡 记忆法:"0 条带 1 镜像,2 海明 3 位 4 块 5 分布"。
b_109_13SSD 的读写单位为什么不一样?¶
- 读/写以"页"为单位(512B ~ 4KB)
- 擦除以"块"为单位(一块含 32~128 页,16KB ~ 512KB)
- 只有整块被擦除后,才能向其中的页写入新数据
这就是随机写慢的根源:擦除比页访问慢一个数量级;且修改一个已有有效数据的页时,必须先把该块所有有效页复制到新的已擦除块,再写入。
b_110_1;PDF 第 110 页 · b_110_2SSD 的磨损均衡分哪两种?¶
- 动态磨损均衡:写入时优先选择擦写次数较少的空闲块
- 静态磨损均衡:即使没有新数据写入也定期迁移冷数据。通常把长期不变的冷数据搬到擦写次数较高的块,释放擦写次数较低的块去承接后续热点写入,使全盘磨损逐渐接近
⚠️ 不做磨损均衡的后果:读写集中在少数块上,一块 256GB 的 SSD 可能仅因几兆字节的闪存损坏而报废。
b_110_6;PDF 第 110 页 · b_110_83.6 Cache 基本原理¶
时间局部性和空间局部性分别指什么?¶
- 时间局部性:某条指令或数据当前被访问,不久将来很可能再次被访问(来源:循环、重复调用的子程序)
- 空间局部性:某存储单元被访问,其邻近单元不久也很可能被访问(来源:指令顺序存放执行、数组连续存储)
b_114_5;PDF 第 114 页 · b_114_6按行遍历和按列遍历二维数组,局部性差在哪? ★4考¶
数组按行优先存储时: - 按行访问(程序 A):访问顺序与存放顺序一致,连续访问相邻地址 → 空间局部性良好 - 按列访问(程序 B):每次访问跨越一整行(2048 元素 = 8192 字节)→ 若 Cache 行小于 8KB,几乎每次都落在不同 Cache 行,空间局部性极差
⚠️ 两个程序对数组的时间局部性都很差(每个元素只访问一次);但对 for 循环体的指令访问,两者都是空间局部性好(顺序存放)+ 时间局部性好(执行 2048×2048 次)。
★ 考过 2010、2014、2016、2020、2017、2023
b_114_18Cache 命中率和平均访问时间怎么算? ★2考¶
- 命中率 H = Nc / (Nc + Nm)(Nc 命中次数,Nm 未命中次数)
- 平均访问时间 Ta = H·Tc + (1−H)(Tm + Tc) = Tc + (1−H)·Tm
⚠️ 注意这个公式的前提是先访 Cache、未命中再访主存(统考默认方式)。Tm 称为缺失损失。
★ 考过 2009、2025
💡 记忆法:Ta = Tc + 缺失率 × 缺失损失 —— 命中时间是必付的,缺失损失是按概率追加的。
b_116_2;PDF 第 116 页 · b_116_3经典算例:Cache 快 5 倍、命中率 95%,性能提升几倍?¶
设 Cache 存取时间 t,主存 5t。 T = t + 0.05 × 5t = 1.25t 性能提升 = 5t / 1.25t = 4 倍(不是 5 倍)。
b_116_7;PDF 第 116 页 · b_116_10实现 Cache 要解决哪四个关键问题?¶
- 数据查找:如何快速判断数据在不在 Cache
- 地址映射:主存块怎么放进 Cache、地址怎么转换
- 替换策略:Cache 满了替换谁
- 写入策略:怎么保证 Cache 与主存一致
b_116_03.7 Cache 三种映射方式¶
直接映射的公式和地址结构? ★3考¶
- 公式:Cache 行号 = 主存块号 mod Cache 总行数
- 地址结构:标记 | Cache行号 | 块内地址
- 标记长度 t = m − c(m 是主存块号位数,c 是 Cache 行号位数)
特点:实现最简单、只需 1 个比较器,但块冲突概率最高、空间利用率最低,且无须替换算法(位置唯一,直接覆盖)。
★ 考过 2010、2011、2015
b_116_17全相联映射的地址结构和优缺点?¶
- 地址结构:标记 | 块内地址(没有行号字段)
- 主存块可装入任意 Cache 行
优点:冲突概率最低、空间利用率最高、命中率最高。 缺点:要与所有行的标记并行比较,速度慢、成本高,需要相联存储器,不适合大容量 Cache。
b_117_7;PDF 第 117 页 · b_117_10组相联映射的公式和地址结构? ★7考¶
组间直接映射,组内全相联。 - 公式:Cache 组号 = 主存块号 mod Cache 组数 Q - 地址结构:标记 | 组号 | 块内地址 - 每组 r 行称为 r 路组相联
两个退化端点:Q = 1 时退化为全相联;Q = 总行数(每组 1 行)时退化为直接映射。
★ 考过 2009、2016、2018、2019、2020、2023、2025
💡 记忆法:"组间直接找组,组内全相联随便放"。
b_118_5三种映射各需要几个比较器? ★2考¶
- 直接映射:1 个(位置唯一)
- 全相联映射:每行一个(要全部并行比较)
- r 路组相联:r 个(组内 r 行并行比较)
比较器的位数 = 标记字段长度。
★ 考过 2018、2022
b_119_1【做题模板】Cache 地址题固定哪四步?¶
- 统一成字节地址:先处理按字/按字节编址,避免把“字数”直接当字节数。
- 求主存块号:块内偏移位数 \(=\log_2(块大小/字节)\),去掉低位即得到块号。
- 定位行或组:直接映射对总行数取模;组相联对组数取模;全相联没有行/组字段。
- 比较标记并判命中:剩余高位是 tag;还要同时检查有效位。未命中时再按题设执行替换和写策略。
最后再做一次硬件反查:一次访问需要并行比较几个候选行,比较器个数就应与该范围一致。
b_119_1;PDF 第 119 页 · b_119_3三种映射方式的三项排序?¶
- 命中率:直接映射最低 < 组相联 < 全相联最高
- 判断开销与时间:直接映射最小最快 < 组相联 < 全相联最大最慢
- 标记存储开销:直接映射最少 < 组相联 < 全相联最多
⚠️ 这是同容量、同块大小、可比替换策略和同一访问序列下对冲突潜力与硬件开销的教材趋势。不能保证任意具体实现的实际命中率都严格满足这个顺序。
b_119_33.8 替换算法与写策略¶
哪种映射方式不需要替换算法?¶
直接映射。 因为每个主存块只能映射到唯一的 Cache 行,该行被占用时新块直接覆盖旧块。全相联和组相联才需要替换算法。
b_119_5四种替换算法各自的思路?¶
- RAND 随机:随机选一行替换。实现简单,但未利用局部性原理,命中率低
- FIFO 先进先出:替换最早装入的行。未考虑局部性,最早进的可能仍是热点
- LRU 最近最少使用:替换最近最久未被访问的行,基于局部性原理,平均命中率高于 FIFO —— 考查重点
- LFU 最不经常使用:替换累计访问次数最少的行
⚠️ LRU 与 LFU 的区别:LRU 关注"最近是否用过",LFU 关注"总共用了多少次"。
b_119_7王道“计数器近似 LRU”模型需要几位? ★2考¶
在本书给定的每行年龄计数器模型中,位数取决于组的路数: - 2 路组相联 → 1 位 - 4 路组相联 → 2 位
本书按 log₂(路数) 位处理。
⚠️ 这是统考教材的简化计数器模型,不是“精确 LRU 硬件永远只需 log₂r 位”的通用结论。精确记录 r 路的完整新旧次序需要区分 r! 种状态,实现也可能采用矩阵、栈、树形伪 LRU 等不同编码。
★ 考过 2018、2020
b_119_11LRU 计数器的三条更新规则? ★2考¶
- 命中时:命中行计数器清零,比它低的计数器加 1,其余不变
- 未命中且有空闲行:新装入行计数器置 0,其他非空闲行全加 1
- 未命中且无空闲行:替换计数值最大的行,新行计数器置 0,其余全加 1
★ 考过 2012、2021
b_119_15什么是抖动?什么时候发生?¶
当工作集、映射关系和替换策略组合不当,少数块会被反复换入换出,造成高频替换和很低的命中率,这类现象称为抖动。
例:访问序列 1,2,3,4,5,1,2,3,4,5…,且这些块竞争同一 4 行集合、采用会依次淘汰下一个所需块的策略时,才会出现该例中的 0% 命中率。0% 是这个特定访问序列的结果,不是抖动的定义。
b_120_0全写法(直写法)的原理和特点? ★2考¶
写命中时数据同时写入 Cache 和主存。 - 优点:从体系结构可见的一致性目标看,主存最终保持最新副本,替换时可直接覆盖、无须写回,实现简单 - 缺点:每次写操作都要访问主存,降低性能 - 不需要脏位
优化手段:加写缓冲(Write Buffer),CPU 同时写 Cache 和写缓冲,由写缓冲异步写入主存。⚠️ 但高频写操作下写缓冲可能饱和甚至溢出。
★ 考过 2015、2020
b_120_6回写法的原理和特点? ★2考¶
写命中时只写 Cache,不立即写主存,仅在该块被替换出 Cache 时才写回。 - 优点:减少主存访问次数,效率高 - 缺点:存在数据不一致风险 - 必须设置脏位(修改位):脏位为 1 表示已修改、替换时必须写回;为 0 表示与主存一致、可直接覆盖
★ 考过 2018、2020
💡 记忆法:"直写不用脏位,回写必须有脏位"。
b_120_12写不命中的两种处理方法?¶
- 写分配法(通用定义):先在 Cache 中分配一行并从下一层取入相应块,再对 Cache 中的目标字节执行写;若搭配全写法,还要把该写传播到下一层
- 非写分配法:直接写主存,不把块调入 Cache
⚠️ 常见搭配:回写法 + 写分配、全写法 + 非写分配。
⚠️ 原书口径冲突:p120 写成“先写主存,再调块”,而 p128 的层次化定义是“先加载块到 Cache,再更新 Cache”。概念题按通用/write-allocate 定义;若计算题明确给出具体事务顺序,则按题设。
b_120_15Cache 总容量怎么算? ★2考¶
Cache 总容量 = (每行标记信息位数 + 每行数据位数) × Cache 总行数
每行标记信息包含: - 有效位、标记位 —— 所有 Cache 都必须有 - 脏位 —— 仅回写策略才有 - LRU 替换位 —— 仅用 LRU 算法才有,位数取决于组内行数
★ 考过 2015、2021
b_121_0经典算例:256MB 主存、8 行、行长 64B 的直接映射 Cache 总容量? ★2考¶
- 主存地址位数 = log₂(2²⁸) = 28 位
- 块内地址 = log₂64 = 6 位
- Cache 行号 = log₂8 = 3 位
- 标记位 = 28 − 6 − 3 = 19 位
- 每行标记信息 = 1(有效位)+ 19 = 20 位;每行数据 = 64B = 512 位
- 总容量 = 8 × (512 + 20) = 4256 位
★ 考过 2010、2021
b_121_4为什么要用分离的指令 Cache 和数据 Cache? ★1考¶
在流水线执行中,取指部件和执行部件会同时访问同一 Cache 而产生冲突。分离 Cache 既能消除这类冲突,又能针对指令和数据不同的局部性特征分别优化。
★ 考过 2014
b_121_13多级 Cache 的典型策略是什么?¶
- L1 离 CPU 最近,速度最快、容量最小;L2 较远、较慢、较大
- L1 通常采用分离的指令/数据 Cache
- L1 和 L2 通常都用回写法:L1 写命中只更新 L1;L1 块被替换时若为脏块则写回 L2;L2 替换时再写回主存
好处:L1 无须在写命中时访问主存,脏块写回由更快的 L2 承接,避免写缓冲饱和。
b_122_1;PDF 第 122 页 · b_122_23.9 虚拟存储器¶
虚拟存储器为什么只能用回写法? ★1考¶
因为辅存(磁盘)访问延迟极高,每次写操作都同步更新辅存不可行。所以采用类似回写的策略:页面被修改时标记为脏页,仅在该页被置换出主存时才写回辅存。
★ 考过 2016
b_135_9虚拟存储器的分页机制类似哪种映射方式?¶
类似全相联映射 —— 任一虚页可装入主存中任意可用的物理页框,从而提高主存利用率、支持高效地址重定位。
b_135_4;PDF 第 135 页 · b_135_8页表项里有哪三个关键位?各管什么?¶
- 有效位(装入位):该虚页是否已调入主存。为 1 → 页表项存物理页号;为 0 → 存该页在外存的地址
- 脏位(修改位):页面是否被修改过,置换时据此决定是否写回磁盘
- 引用位(使用位):页面是否被访问过,供 Clock、LRU 等替换算法使用
b_136_0;PDF 第 136 页 · b_136_1虚拟地址怎么转成物理地址? ★4考¶
- 虚拟地址 = 虚页号 | 页内偏移;物理地址 = 物理页号 | 页内偏移
- ⚠️ 因为页面大小相同,两者的页内偏移完全一致(这是解题关键)
四步: - ① 页表基址寄存器指向当前进程的页表起始地址 - ② 从虚拟地址取出虚页号作索引查页表项 - ③ 有效位为 1 → 取出物理页号 - ④ 与页内偏移拼接成物理地址
若有效位为 0 → 缺页异常,由操作系统处理。
★ 考过 2011、2013、2018、2019、2021、2022、2024
b_136_11缺页时系统做什么? ★4考¶
- 根据页表项中的外存地址,把该页从磁盘调入一个空闲物理页框
- 若主存已满 → 按替换算法选一页置换,根据脏位决定是否写回磁盘
- 完成后更新页表相应项
★ 考过 2014、2019、2023、2025
b_136_4为什么需要 TLB?它是什么做的? ★1考¶
不用 TLB 时,每次访存要先访问主存中的页表取物理页号,再访问主存取数据,访存次数翻倍、性能下降。
TLB(快表)由高速 SRAM 构成,缓存最近用到的页表项,通常采用全相联或组相联映射。主存中的页表相应地称为慢表。
★ 考过 2018
b_137_2TLB 表项里存什么?标记字段怎么划分? ★2考¶
表项包含虚拟页号(作标记)+ 物理页号 + 控制位(有效位、脏位等)。 - 全相联映射下:TLB 标记 = 完整的虚拟页号 - 组相联映射下:虚拟页号的高位作标记、低位作组索引
★ 考过 2016、2021
b_137_4有 TLB 和 Cache 时,一次访存的完整流程? ★1考¶
- ① CPU 给出虚拟地址;在教材的典型全相联 TLB 硬件中,虚页号可与候选项标记并行比较
- ② TLB 命中 → 直接得实页号完成地址转换;TLB 缺失 → 访问主存页表取页表项,转换后装入 TLB(TLB 满则执行替换算法)
- ③ 得到物理地址后,Cache 按映射方式划分为标记 | 组号 | 块内地址
- ④ 用组号定位 Cache 组,组内各行标记并行比较;命中则按块内地址取数据送 CPU
★ 考过 2024
⚠️ “全相联”描述的是任意虚页可放入任意 TLB 项,不单独决定比较器的物理实现。若题目明确是全并行相联查找,才按每个候选项并行比较;也可以有分时复用或分组实现。
b_137_7TLB、Page、Cache 三种缺失能有哪几种组合? ★1考¶
关键推理:TLB 是页表项的缓存 → Page 缺失时 TLB 必然缺失;Cache 是主存的副本 → Page 缺失时 Cache 也一定缺失。
⚠️ 这依赖王道的简化一致性模型:页失效时系统会同步使相关 TLB/Cache 项失效(含必要的 shootdown),且 TLB 不保留可命中的无效页表项。统考组合题按此模型。
所以只有 5 种可能组合: | TLB | Page | Cache | 访存开销 | |---|---|---|---| | 命中 | 命中 | 命中 | 无须访存 | | 命中 | 命中 | 缺失 | 访存 1 次 | | 缺失 | 命中 | 命中 | 访存 1 次 | | 缺失 | 命中 | 缺失 | 访存 2 次 | | 缺失 | 缺失 | 缺失 | 缺页异常,访问磁盘 + 至少 2 次访存 |
⚠️ 不可能出现的组合:TLB 命中而 Page 缺失、Page 缺失而 Cache 命中。
★ 考过 2010
b_138_0三种缺失分别由谁处理?¶
- Cache 缺失:硬件自动完成
- 缺页:操作系统通过缺页异常处理程序完成
- TLB 缺失:硬件或软件都可以处理
b_138_2页式虚拟存储器的优缺点?¶
- 优点:页面大小固定,页表结构简单,调入操作方便
- 缺点:程序大小通常不是页长整数倍 → 最后一页产生内部碎片;页是虚拟地址空间的固定大小划分单元,缺乏程序逻辑意义,在模块化、保护和共享方面不如段式
⚠️ 物理内存对应的划分单位叫页框/物理块,不能把“页”本身说成物理内存划分单位。
b_136_6段式虚拟存储器和页式的根本差别?¶
- 段按程序的逻辑结构划分,各段长度因程序而异;页是固定大小的物理划分
- 段表每行要记录段号、有效位、段起点和段长(因为段长可变)
- 地址转换:段号查段表 → 取出段起始地址 → 与段内地址相加(不是拼接!)
⚠️ 分段对程序员不透明,分页对程序员透明。 - 段式优点:逻辑独立性好,便于编译、管理、修改、保护和共享 - 段式缺点:段长可变、主存分配困难、产生外部碎片
b_139_0;PDF 第 139 页 · b_139_1段页式虚拟存储器怎么工作?¶
- 程序先分段,每段再分页,主存也分成同样大小的页,调入调出仍以页为单位
- 每个程序一个段表,每段一个页表
- 虚拟地址 = 段号 | 段内页号 | 页内地址
- 转换:段号查段表得页表起始地址 → 段内页号查页表得实页号 → 与页内地址拼接
优点:兼有页式和段式的优点(可按段共享保护,又无外部碎片)。缺点:需两次查表,开销大。
b_139_7;PDF 第 139 页 · b_139_8虚拟存储器和 Cache 的四点相同? ★1考¶
- 最终目标都是提高系统性能,都体现容量、速度、价格的梯度
- 都把数据划分为小信息块作为基本交换单位(虚存的页比 Cache 块大得多)
- 都涉及地址映射、替换算法、更新策略
- 都基于局部性原理
★ 考过 2024
b_139_10;PDF 第 139 页 · b_139_11虚拟存储器和 Cache 的四点不同? ★2考¶
- 目的:Cache 解决速度差异,虚存解决容量问题
- 实现:Cache 完全由硬件实现、对所有程序员透明;虚存由操作系统和硬件共同实现,对应用程序员透明但对 OS 开发者不透明
- 不命中的代价:Cache 不命中访问主存,延迟增加数十倍;缺页要访问磁盘,延迟增加可达十万倍
- 通路:CPU 可直接访问 Cache 和主存;辅存与 CPU 无直接通路,缺页必须先调入主存
★ 考过 2016、2024
b_140_33.10 本章疑难点¶
Cache 行长和命中率是什么关系?¶
行长要取适中值: - 过大:① 缺失损失增加(未命中时要从主存传更多数据);② Cache 总容量固定时行数减少、映射灵活性下降,反而可能降低命中率 - 过小:缺失代价小,但难以利用空间局部性,命中率偏低
b_152_8影响 Cache 命中率的三个主要因素?¶
- 映射方式:全相联最高、直接映射最低、组相联居中
- Cache 容量:越大命中率通常越高
- 块大小:过小难利用空间局部性,过大降低有效容量并增加缺失损失
此外 Cache 级数、指令/数据 Cache 是否分离也有显著影响。
b_152_2虚拟存储的页面设大还是设小好?¶
适中最好: - 过小:页表项剧增、页表庞大,且难以利用空间局部性 - 过大:页表变小,但内部碎片增加、页面调入调出的传输开销更大、缺页处理时间更长
实际系统通常选 4KB ~ 几 MB。
b_152_5取指令 Cache 缺失怎么处理?¶
- 保持程序计数器 PC 不变(确保缺失处理完能重新取同一条指令)
- 根据 PC 从主存读取该指令
- 将该指令所在主存块调入 Cache,更新有效位和标记位
b_152_13【易混点】第3章成对概念对照¶
| 易混对 | 分界线 |
|---|---|
| 存取时间 vs 存储周期 | 周期 = 存取 + 恢复时间,周期 > 存取时间,DRAM 可达 2 倍 |
| SRAM vs DRAM | 触发器 vs 电容;非破坏性 vs 破坏性;不刷新 vs 要刷新;Cache vs 主存 |
| 连续编址 vs 交叉编址 | 高位作模块号(不能并行)vs 低位作模块号(可并行) |
| 位扩展 vs 字扩展 | 位扩展并联同时工作扩字长;字扩展译码分时工作扩容量 |
| 直接 vs 全相联 vs 组相联 | 1 个比较器 / 每行一个 / r 个;无须替换算法 / 需要 / 需要 |
| LRU vs LFU | 最近是否用过 vs 总共用了多少次 |
| 全写法 vs 回写法 | 同时写主存、无脏位 vs 替换时才写、必须有脏位 |
| 写分配 vs 非写分配 | 调块入 Cache vs 只写主存 |
| Cache vs 虚拟存储器 | 解决速度 vs 解决容量;纯硬件 vs 软硬件协同;数十倍 vs 十万倍代价 |
| 分页 vs 分段 | 页对程序员透明、定长、内部碎片;段不透明、变长、外部碎片 |
| 页内偏移 vs 块内地址 | 虚实地址的页内偏移完全一致,这是地址转换题的突破口 |
b_152_7【必背数字】第3章¶
- 平均访问时间 Ta = Tc + (1−H)·Tm
- 命中率 H = Nc / (Nc + Nm)
- 直接映射:行号 = 主存块号 mod 总行数,地址 = 标记|行号|块内地址
- 组相联:组号 = 主存块号 mod 组数,地址 = 标记|组号|块内地址
- 比较器个数:直接 1、全相联 每行 1 个、r 路组相联 r 个
- 本书“每行 LRU 计数器”模型:r 路时每行至少 ⌈log₂r⌉ 位;真实 LRU 要表达整组次序,实际硬件也可能采用伪 LRU,须按题设
- Cache 总容量 = (标记信息位 + 数据位) × 总行数
- 磁盘:仅在题设作相应均匀假设时,平均寻道可取给定最大行程时间的一半;随机到达相位均匀时,平均旋转等待为转半圈
- 磁盘最大传输率 Dr = r × N
- 交叉存储器:模块数 m ≥ ⌈T/r⌉;标准无冲突流水模型连续取 q 个字 t = T + (q−1)r
- 在本书串行地址转换、映射状态一致的模型下,TLB/Page/Cache 命中或缺失有 5 种合法组合
- 虚存页面典型大小 4KB ~ 几 MB
b_121_8;PDF 第 121 页 · b_121_9