第5章 中央处理器
第5章 中央处理器¶
全书难点,也是综合题重灾区。易出综合题的:数据通路分析、指令执行阶段的节拍与控制信号安排、流水线性能分析。易出选择题的:各种寄存器的特点、指令周期、控制器概念、流水线概念。
b_200_3【知识树】第5章骨架¶
- CPU 功能与结构
- 六大功能、基本组成部件
- 用户可见 vs 用户不可见寄存器
- 指令执行过程
- 指令周期五阶段:IF / ID / EX / MEM / WB
- 单周期 / 多周期 / 流水线三种模型
- 数据通路
- 组合逻辑元件(操作元件)vs 时序逻辑元件(状态元件)
- 总线式 vs 专用数据通路
- 单总线数据通路的节拍安排
- 控制器
- 硬布线控制器 vs 微程序控制器
- 异常和中断
- 指令流水线
- 五段流水线、三种冒险及处理
- 超标量与动态流水线
- 多处理器
- SISD / SIMD / MIMD、向量处理器、硬件多线程、多核、SMP
b_200_0;PDF 第 200 页 · b_200_45.1 CPU 的功能和结构¶
CPU 的六大功能?¶
- 取指令并译码:取指、解析操作码、生成控制信号
- 更新 PC:确定下一条指令地址
- 执行算术与逻辑运算
- 取操作数或写结果:访问主存或 I/O
- 处理异常或中断
- 时序控制:用时钟协调各操作的顺序和持续时间
b_200_2;PDF 第 200 页 · b_200_7PC、IR、MAR、MDR 的位数各由什么决定? ★3考¶
- PC:位数由地址总线宽度决定 → 反映可直接寻址的内存空间
- IR:位数 = 指令字长
- MAR:位数由地址总线宽度决定(同 PC)
- MDR:位数 = 数据总线宽度
★ 考过 2013、2016、2021
💡 记忆法:"PC 和 MAR 看地址线,IR 看指令长,MDR 看数据线"。
b_201_6哪些是用户可见寄存器?哪些不可见? ★3考¶
- 用户可见(程序可直接读写):通用寄存器组 GPRs、专用地址寄存器(基址、变址、堆栈指针)、程序计数器 PC
- 按王道/统考口径,标志寄存器 FR 属于“只读型”用户可见寄存器:内容通常由 ALU 运算结果更新,程序依据条件码完成判断与转移;具体 ISA 是否提供显式读写或保存/恢复指令只作实现补充,不改变本题分类
- 用户不可见(完全透明):IR、MAR、MDR、页表基址寄存器
★ 考过 2010、2015、2021
💡 记忆法:"IR/MAR/MDR 三兄弟永远不可见"(和第 1 章"对所有程序员透明"是同一组)。
b_202_5;PDF 第 202 页 · b_202_75.2 指令执行过程¶
指令执行的一般流程是什么? ★1考¶
- 以 PC 的当前值为地址从主存取指令,同时 PC 自动更新为下一条顺序指令地址
- 译码,区分分支指令与非分支指令
- 分支指令:执行阶段判断分支条件,满足则 PC 更新为分支目标地址
- 非分支指令:取操作数 → 执行运算 → 写回结果
- 异常按各阶段的实际检测点产生(如译码发现非法操作码、执行阶段发现除零、访存阶段发现缺页)
- 可屏蔽外部中断通常在指令边界采样/响应
- 无待响应事件 → 按更新后的 PC 取下一条指令
- 有待响应事件 → 按体系结构规则保存断点/状态并转入处理程序
★ 考过 2011
b_206_12指令周期的五个阶段各做什么?¶
- IF 取指:按 PC 取指令送 IR,PC 更新
- ID 译码/读寄存器:译码、从寄存器堆读操作数、提取立即数
- EX 执行/计算地址:ALU 运算 / 计算访存有效地址 / 计算分支目标并判断是否转移;状态标志在此阶段生成
- MEM 访存:读写数据 Cache 或主存(寄存器-寄存器类指令不涉及此阶段)
- WB 写回:把结果写回寄存器堆
b_207_7定长指令周期和变长指令周期?¶
- 定长:所有指令的周期长度相同
- 变长:不同指令包含的时钟周期数可变
⚠️ 现代计算机普遍采用基于时钟信号定时的变长指令周期,以提高执行效率。
b_208_11单周期、多周期、流水线三种模型的 CPI 各是多少? ★3考¶
- 单周期:每条指令一个时钟周期,CPI = 1,但时钟周期由最慢的指令决定,快指令也占满整个周期 → 资源浪费
- 多周期:不同指令占不同数量的时钟周期,平均 CPI 通常大于 1;提高了时钟频率和资源利用率,但指令间仍串行
- 流水线:每个时钟周期启动一条新指令、多条指令重叠执行,理想 CPI = 1;单条指令的执行延迟并未减少,但整体吞吐率大幅提高
★ 考过 2016、2020、2025
⚠️ 最易错:CPI 都写成 1 不代表性能相同;单周期时钟被最慢指令拖长,在本书同一 ISA 的教学模型比较中吞吐率通常不占优。实际性能仍要比较指令数 × CPI × 时钟周期。
b_208_135.3 数据通路¶
组合逻辑元件和时序逻辑元件怎么区分? ★3考¶
- 组合逻辑元件(操作元件):输出仅由当前输入决定,不含记忆单元、不受时钟控制、无反馈通路
- 例:加法器、ALU、译码器、多路选择器 MUX、三态门
- 时序逻辑元件(状态元件):输出还依赖历史状态并含记忆单元;在本章的同步 CPU 数据通路中由时钟边沿更新
- 例:通用寄存器组、PC、状态/暂存寄存器、存储器
★ 考过 2017、2021、2025
💡 记忆法:"能记事的要时钟,不记事的不要"。
⚠️ 这是同步数据通路的做题口径;广义时序电路也可以采用异步实现,不能当作电子学的无条件定义。
b_211_11译码器、MUX、三态门的控制信号各几位? ★3考¶
- 译码器:n 位输入 → 2ⁿ 个互斥输出
- 多路选择器 MUX:N 路输入 → 至少需 ⌈log₂N⌉ 位控制信号;只有 N 是 2 的幂时才可直接写 log₂N
- 三态门:由 EN 控制通断,EN=1 输出 = 输入;EN=0 输出呈高阻态(与总线断开)
★ 考过 2015、2023、2024
b_212_0数据通路的最小时钟周期怎么算?¶
T ≥ T_clk_to_q + T_max + T_setup - T_clk_to_q:从时钟上升沿到寄存器输出稳定的寄存器延迟 - T_max:组合逻辑的关键路径延迟(所有输出稳定所需的最长时间) - T_setup:下一个寄存器的建立时间
⚠️ 其中 T_max 是关键因素 —— 缩短组合逻辑关键路径是提升 CPU 频率的主要手段。
b_212_6总线式和专用数据通路怎么取舍?¶
| 维度 | 总线式 | 专用 |
|---|---|---|
| 结构 | 简单,部件共享总线 | 复杂,大量点对点连线 |
| 扩展性 | 强,挂上总线即可 | 弱,需重新布线 |
| 传输效率 | 低,同一时刻只能传一组 | 高,可并行传输 |
| 硬件成本 | 低 | 高 |
| 典型应用 | 教学模型、嵌入式微控制器 | 高性能通用处理器(RISC) |
b_213_3;PDF 第 213 页 · b_213_4为什么单周期 CPU 不能用单总线结构?¶
因为单总线一个时钟周期只允许一次数据传输,而单周期 CPU 要求一条指令的所有操作(取指、译码、执行、访存、写回)都在一个时钟周期内完成 —— 单总线根本传不完。
b_213_11单总线数据通路里,为什么需要暂存器 Y 和 Z? ★3考¶
- 需要 Y:ALU 是无存储能力的组合逻辑电路,运算时两个输入必须同时有效。但单总线一次只能传一个数,所以要先把一个操作数经总线送入 Y,下个周期再把另一个送到 ALU 另一输入端
- 需要 Z:ALU 输出不能直接连到总线,否则可能通过总线反馈回输入端干扰运算结果,所以先暂存到 Z
★ 考过 2013、2015、2022
💡 记忆法:"Y 存前一个操作数,Z 挡住反馈回路"。
b_215_0单总线下加法指令的节拍怎么排? ★3考¶
控制信号命名规则:部件名 + in/out(PCout 表示 PC 送总线,PCin 表示写入 PC)。
取指阶段(假设访存需 5 个时钟周期): | 时钟 | 功能 | 控制信号 | |---|---|---| | C1 | (PC) → MAR | PCout, MARin | | C2~C6 | MEM(MAR) → MDR | MDRin, read | | C7 | (MDR) → IR | MDRout, IRin |
执行阶段: | 时钟 | 功能 | 控制信号 | |---|---|---| | C8 | (rs) → Y | GPRout, Yin | | C9 | (rs)+(rd) → Z | GPRout, ALUop=000 | | C10 | (Z) → rd | Zout, GPRin |
★ 考过 2009、2015、2019
b_214_7单总线下取数指令的执行阶段?¶
| 时钟 | 功能 | 控制信号 |
|---|---|---|
| C8 | (rs) → MAR | GPRout, MARin |
| C9~C13 | MEM(MAR) → MDR | MDRin, read |
| C14 | (MDR) → rd | MDRout, GPRin |
⚠️ 所有指令的取指阶段数据流都相同,区别只在执行阶段。
b_215_35.4 单周期专用数据通路(MIPS)¶
单周期数据通路为什么不设置 IR?¶
因为单周期要求一个时钟周期内完成整条指令,而仅"取指令到 IR"就要占一个时钟周期。所以单周期直接从指令存储器取指令并解析执行,不设 IR。
⚠️ 同理,单周期还要求指令和数据分开存储(独立的指令存储器和数据存储器),以便在同一周期内并行访问、避免冲突。
b_216_10R 型指令的数据通路怎么连?¶
add rd, rs, rt → R[rs] + R[rt] → R[rd]
- 寄存器堆两个读地址端 Ra、Rb 分别接 Rs、Rt
- 写地址端 Rw 接 Rd
- ALU 结果经 busW 连到寄存器堆写数据端
- RegWr 是写使能信号,RegWr=1 且无溢出时才写入(RegWr 与 Overflow 经"与"门组合)
- ALU 操作由 ALUctr 决定,支持 N 种运算需 ⌈log₂N⌉ 位
b_216_0支持 I 型指令要在 R 型通路上加哪三处?¶
addi rt, rs, imm16 → R[rs] + SignExt(imm16) → R[rt]
- ① 目的寄存器选择:写地址端加 MUX,由 RegDst 控制 —— RegDst=1 选 Rd(R型),=0 选 Rt(I型)
- ② 立即数扩展器:由 ExtOp 控制 —— 算术类用符号扩展,按位逻辑操作用零扩展
- ③ ALU 第二操作数选择:加 MUX,由 ALUSrc 控制 —— =0 选寄存器 Rt(R型),=1 选扩展后的立即数(I型)
💡 记忆法:"三个选择器管三件事:写谁、扩什么、算什么"。
b_217_2;PDF 第 217 页 · b_217_4lw 和 sw 的地址计算有区别吗?¶
完全一致:都是先对 imm16 符号扩展,再与寄存器 Rs 的内容相加得访存地址。
区别只在数据传输方向: - lw:从该地址读 32 位数据 → 写入寄存器 Rt - sw:把寄存器 Rt 的 32 位数据 → 写入该地址
b_217_5【做题模板】单周期数据通路怎样沿“五类指令”追控制信号?¶
不要孤立背 RegDst/ALUSrc/MemToReg,从源 → MUX → ALU → 存储器 → 写回端逐段追:
- R 型:读
rs,rt→ ALU 运算 → 写rd。 - 立即数型:读
rs+ 扩展后的imm→ ALU → 写rt。 - lw:读
rs+ 符号扩展位移 → 算地址 → 读数据存储器 → 写rt。 - sw:读
rs+ 符号扩展位移 → 算地址,同时把rt的值送数据存储器;不写寄存器。 - 条件分支:读两个源寄存器做比较,同时算目标 PC;满足条件才选择目标地址。
每走到一个 MUX 就问“本指令要哪一路”,每经过一个状态元件就问“本周期是否允许写入”。控制信号名随题图变化,但这条数据流不会变。
b_216_0;PDF 第 217 页 · b_217_2;PDF 第 217 页 · b_217_55.5 控制器¶
控制器的三项职责?¶
- 取出待执行的指令并计算下一条指令的位置(更新 PC)
- 对操作码解码,产生对应的时序信号和控制信号
- 管理 CPU、主存和 I/O 设备间的数据流向及时序
b_234_0硬布线控制器的 CU 有哪三类输入?¶
- 操作译码器输出的指令信息(n 位操作码译码成 2ⁿ 个输出,每种操作码唯一激活一条信号线)
- 时钟脉冲(频率即机器主频,用于划分节拍)
- 执行单元反馈的状态标志
⚠️ 为什么需要状态标志:像条件转移这类指令,执行不仅取决于操作码,还受状态标志影响。
b_234_2;PDF 第 234 页 · b_234_3硬布线控制器的优缺点?¶
- 优点:性能只受电路延迟限制,执行速度快
- 缺点:灵活性差 —— 修改或新增指令要重新设计电路;指令系统增强时电路规模急剧膨胀、调试困难
b_234_14微命令、微操作、微指令、微程序的层次关系?¶
- 微命令:控制部件发给执行部件的最基本控制信号,是控制序列的最小单位
- 微操作:执行部件收到微命令后执行的具体动作(与微命令一一对应)
- 微指令:若干微命令的集合,含操作控制字段 + 顺序控制字段
- 微程序:若干微指令的有序集合,对应一条机器指令
⚠️ 硬布线控制器中同样存在微命令和微操作,只是实现方式不同(不是只有微程序控制器才有)。
b_235_2;PDF 第 235 页 · b_235_6相容性微命令和互斥性微命令?¶
- 相容性微命令:可同时有效、协同完成某功能
- 互斥性微命令:同一时刻不允许同时有效
这个区分是字段编码分段的依据。
b_235_4主存储器和控制存储器有什么区别? ★1考¶
| 主存储器 | 控制存储器 CM | |
|---|---|---|
| 存什么 | 程序和数据 | 微程序 |
| 位置 | CPU 外部 | CPU 内部 |
| 实现 | 通常用 RAM | 通常用 ROM |
CM 中每个单元的地址称为微地址。
★ 考过 2017
b_235_17程序和微程序的区别?¶
- 程序:指令的有序集合,由软件开发者编写,存放在主存或辅存
- 微程序:微指令的有序集合,由计算机体系结构设计者编写,固化于控制存储器,用于解释执行机器指令
⚠️ 微程序对程序员完全透明。
b_235_19微程序控制器涉及的四个寄存器分别装什么?¶
- MAR:主存读写地址
- μPC(CMAR):待执行微指令在 CM 中的微地址
- IR:从主存读出的当前机器指令
- μIR(CMDR):从 CM 读出的当前微指令
💡 记忆法:"不带 μ 的管主存,带 μ 的管控存"。
b_235_23微程序控制器的工作过程四步?¶
- ① 执行取指令公共操作:取指微程序入口地址(通常是 CM 的 0 号单元)送 μPC,取指完成后机器指令进入 IR
- ② 根据 IR 中的操作码,由微地址形成部件产生该指令微程序的入口地址送 μPC
- ③ 从 CM 逐条读微指令送 μIR 并执行,直到该微程序结束
- ④ 自动转回取指微程序入口,处理下一条机器指令
b_236_7;PDF 第 236 页 · b_236_8控制存储器里一共存多少个微程序?¶
微程序总数 = 机器指令条数 + 公共微程序数(取指、间址、中断等)
因为所有指令的取指操作相同,可以把取指写成一个公共的取指微程序;间址、中断处理同理。
⚠️ 这是计算题考点,别忘了加公共微程序。
b_236_14三种微指令编码方式怎么权衡? ★1考¶
- 直接编码:每一位直接对应一个微命令,无须译码
- 优点:结构简单、可并行、速度最快;缺点:字长过长(n 个微命令要 n 位)
- 字段直接编码:把互斥性微命令归入同一字段、相容性的分到不同字段,各字段独立译码
- 显著缩短字长,但因需译码速度略低
- 字段间接编码:某字段的含义由另一字段的编码共同决定
- 字长最短,但译码线路复杂、时间开销大,仅用于特定场合
★ 考过 2012
b_237_4字段分段要遵守哪三条原则?¶
- 互斥性微命令放同一字段,相容性微命令放不同字段
- 每个字段位数不宜过多,避免译码电路复杂、延迟大
- 每个字段要预留一个编码表示"本字段无操作"(通常用全 0)
⚠️ 若某字段容纳 \(n_i\) 个互斥微命令,还要留一个“无操作”码,则字段位数通式为 \(\lceil\log_2(n_i+1)\rceil\)。所以 3 位字段最多只能表示 7 个互斥微命令,不是 8 个 —— 这是计算题的常见坑。
b_237_8经典算例:8 个微命令用三种编码各需几位?¶
设 ALU 操作 4 种(互斥)、存储器操作 4 种(互斥),两类之间相容: - 直接编码:8 位(每位一个微命令) - 字段直接编码:分两个字段,每字段 3 位(含无操作)→ 6 位 - 字段间接编码:一个 3 位操作字段 + 一个 1 位类型字段 → 4 位
b_237_14微指令的下地址怎么形成? ★1考¶
两种基本方式: - 增量方式(计数器方式):由 μPC 自动加 1,适用于顺序执行段 - 断定方式(下址字段方式):当前微指令中显式指定下条微地址
三种典型情形:微程序入口地址由操作码经微地址形成部件产生;顺序执行用增量方式;条件分支结合下址字段与条件信号确定。
★ 考过 2014
b_238_4;PDF 第 238 页 · b_238_5水平型和垂直型微指令怎么选?¶
- 水平型微指令(直接编码、字段直接编码、字段间接编码都属于):每位/每字段直接对应微命令,一条微指令可同时执行多个并行微操作
- 优点:并行能力强、执行效率高、微程序短;缺点:微指令字长长、编写困难
- 垂直型微指令:类似机器指令结构,有微操作码字段,需译码,一条通常只定义一个基本微操作
- 优点:微指令短、格式规整、易编写;缺点:微程序长、执行速度慢
💡 记忆法:"水平的横着宽(字长长、程序短),垂直的竖着长(字长短、程序长)"。
b_238_6硬布线和微程序控制器的五项对比? ★1考¶
| 对比项 | 微程序控制器 | 硬布线控制器 |
|---|---|---|
| 工作原理 | 控制信号以微程序存在 CM 中,执行时读出 | 组合逻辑电路即时产生 |
| 执行速度 | 慢 | 快 |
| 规整性 | 较规整 | 烦琐、不规整 |
| 应用场合 | CISC CPU | RISC CPU |
| 易扩充性 | 易扩充修改 | 扩充修改困难 |
★ 考过 2009
b_239_45.6 异常和中断¶
异常和中断的根本区别? ★2考¶
- 异常(内中断):CPU 内部检测到的同步事件,由当前指令直接引发,具有确定性和可重现性(除零、非法操作码、缺页)
- 中断(外中断):外部设备发起的异步事件,与当前指令无关,具有随机性
★ 考过 2015、2023
b_247_4异常和中断的响应时机有什么不同? ★1考¶
- 异常:CPU 通常在指令执行过程中或完成时立即响应
- 中断:仅在当前指令完整执行结束后才被检测(指令执行期间不采样中断信号)
★ 考过 2023
b_247_9异常和中断处理完后,从哪条指令继续? ★1考¶
- 异常:通常需重新执行第 i 条指令(如缺页异常在页面调入后重试访存)
- 中断:从第 i+1 条指令开始继续
⚠️ 若异常属于不可恢复的致命错误(如非法指令),操作系统将终止该用户进程。
★ 考过 2021
💡 记忆法:"异常重做当前条,中断接着下一条"。
b_247_17故障、自陷、终止怎么区分? ★1考¶
- 故障 Fault:指令启动之后、执行完成之前被检测到,CPU 尚未提交结果;处理后重新执行同一条指令(缺页、非法操作码、除零)
- 自陷 Trap:预先安排的主动事件,在指令正常执行完毕之后触发,CPU 已完整提交结果;处理后从自陷指令的下一条继续(断点调试、单步跟踪、系统调用 syscall、MIPS 的 teq)
- 终止 Abort:处理器无法可靠定位或恢复的严重同步异常类别,通常不能重启当前指令;成因可涉及硬件故障,但它仍属于异常分类
⚠️ 不要因 Abort 可能由硬件故障引发,就把它并入“外部中断”。Fault、Trap、Abort 是同步异常的三类;外中断是异步事件。
★ 考过 2020
b_248_2可屏蔽中断和不可屏蔽中断? ★4考¶
- 可屏蔽中断:通过 INTR 线发送,可由中断屏蔽寄存器选择性屏蔽
- 不可屏蔽中断:通过专用的 NMI 线发送,无法被软件屏蔽,用于电源掉电、内存校验错等高优先级事件
另两个分类维度:按入口地址获取方式分向量中断(硬件直接提供入口地址)和非向量中断(软件轮询确定中断源);按是否允许嵌套分单重中断和多重中断。
★ 考过 2009、2016、2020、2025
b_248_9异常和中断响应过程的三个阶段?¶
- ① 关中断:自动屏蔽可屏蔽中断(清零标志寄存器中的 IF 位,IF=0 关中断、IF=1 开中断),保证上下文保存的原子性
- ⚠️ 不可屏蔽中断和部分高优先级异常仍可能在此期间发生
- ② 保存断点和程序状态:断点(异常存当前指令地址,中断存下一条指令地址)+ PSW,压入内核栈(天然支持嵌套)
- ③ 识别事件类型并转移:现代处理器用向量中断 —— 每类事件有唯一类型号,系统初始化时把中断向量填入中断向量表,事件发生时以类型号为索引直接查表转移
⚠️ 整个响应过程由硬件自动完成,后续处理逻辑(缺页调入、系统调用分发)才由操作系统软件实现。
b_249_175.7 指令流水线¶
提升并行性的两条路子?¶
- 时间上的并行:把任务分解为多个子阶段、各阶段由专用部件处理、多任务在不同阶段同时推进 → 流水线技术
- 空间上的并行:在一个处理器内配置多个相同的功能部件并行工作 → 超标量处理器
b_252_6流水线对指令集有哪四点要求? ★1考¶
- 指令长度统一:简化取指与译码,避免取指周期不确定
- 指令格式规整:源操作数寄存器字段位置固定,支持译码前预取操作数
- 采用 LOAD/STORE 架构:只有访存指令碰内存,利于流水段功能划分
- 数据与指令按边界对齐存放:单次访存即可取完整操作数
⚠️ 这四点正好都是 RISC 的特征 —— 所以说 RISC 天生适合流水线。
★ 考过 2011
b_253_1流水线设计的两条原则? ★2考¶
- 流水段的数量以最复杂指令所需的功能段数为准
- 每个流水段的时长以最耗时的操作为准
★ 考过 2009、2025
b_253_8经典算例:流水线反而让单条指令变慢了?¶
各段延迟:取指 200ps、译码 100ps、执行 150ps、访存 200ps、写回 100ps - 单周期总执行时间 = 750ps(各段之和) - 流水线时钟周期 = 200ps(取最大段)→ 单条指令走完 5 段 = 1000ps
⚠️ 结论:流水线并不能缩短单条指令的执行延迟(反而变长了)。但对 N 条指令:单周期 N×750ps,流水线 (N+4)×200ps —— N 大时吞吐率显著更高。
b_253_0;PDF 第 253 页 · b_253_1为什么每个流水段后面都要加流水段寄存器?¶
用于锁存该段的输出结果,确保能在下一个时钟周期供下一流水段使用。所有寄存器和存储器用统一时钟 CLK 同步,每来一个时钟脉冲,各段结果锁存到段尾寄存器。
⚠️ 流水段寄存器本身也有时延,但考试中若无明确说明可忽略。
★ 考过 2018
b_254_0流水线的吞吐率公式? ★2考¶
- 定义:TP = n / Tₖ(n 是任务总数,Tₖ 是完成 n 个任务的总时间)
- k 段流水线、时钟周期 Δt,理想条件下完成 n 个任务需 (k + n − 1)·Δt
- 所以 TP = n / [(k + n − 1)·Δt]
- n → ∞ 时,最大吞吐率 = 1/Δt
★ 考过 2012、2013
💡 记忆法:"k + n − 1" —— 第一条指令要走满 k 段,之后每周期出一条。
b_254_3;PDF 第 254 页 · b_254_4【做题模板】流水线冒险题怎样画时空图?¶
- 先画阶段表,标出每条指令在哪一段产生结果、后继指令在哪一段需要结果。
- 再画“横轴为周期、纵轴为指令”的时空图;相同周期争同一硬件就是结构冒险。
- 若结果产生早于消费者需要,可画转发箭头;否则插入气泡,直到数据时序满足。
load-use要特别检查:经典五级中 load 的数据到 MEM 末才出现,紧邻消费者的 EX 来不及,通常仍需 1 个气泡。- 分支题从题图找“目标地址/方向在哪段确定”,被取入的错误路径指令数才是冲刷代价。
⚠️ 简单按序五级流水主要出现 RAW;WAR/WAW 通常要到乱序或多发射模型才出现,不能见到“流水线”就三类全报。
b_254_0;PDF 第 256 页 · b_256_2五段流水线里各类指令实际用几段?怎么对齐?¶
- lw 最复杂,需 5 段(IF/ID/EX/MEM/WB)
- R 型、I 型运算指令:只需 4 段 → 在 Write 前插入空 MEM 段
- sw、beq:只需 4 段 → 在 Exec 后插入空 Write 段
- j:只需 3 段 → 插入空 MEM 和空 Write 段
插空段要遵守两条原则: - 每条指令对任一功能部件至多使用一次 - 相同功能部件必须在固定阶段使用(如寄存器写回总在第 5 阶段)
b_256_2beq 的 MEM 段在干什么?¶
不是真的访存,而是把分支目标地址写入 PC。之所以安排在 MEM 段,是为了与 lw、sw 等指令对齐;写 PC 的延迟小于存储器访问,所以能在 MEM 段内完成。
b_255_19结构冒险是什么?怎么解决? ★1考¶
不同指令在同一时刻争用同一功能部件,本质是硬件资源的物理限制。
典型场景:指令与数据共享同一存储器时,第 i 条 LOAD 指令处于 MEM 段(访问数据),第 i+3 条指令同时处于 IF 段(取指令)→ 冲突。
两种解决办法: - 暂停后续指令的取指一个周期(插入停顿) - 增加硬件资源:寄存器堆读口写口分离(前半拍写、后半拍读);指令存储器与数据存储器分离(现代 L1 用分离的指令 Cache 和数据 Cache,从根本上消除该冲突)
★ 考过 2016
b_256_13数据冒险的根本原因?为什么只有 RAW? ★5考¶
根本原因:后面指令用到前面指令的结果时,前面指令的结果还未产生或写回。
在按序发射、按序完成的流水线中(统考只涉及这种),所有数据冒险都是写后读 RAW(Read After Write)冲突。
典型例子:
★ 考过 2012、2014、2016、2019、2023
b_257_2解决 RAW 冲突的第一种办法:延迟执行 ★1考¶
把相关指令及其后续指令暂停若干时钟周期,直到前一条指令的结果可安全读取。分两种实现:软件插入 nop 指令、硬件自动插入气泡(阻塞)。
⚠️ 关键细节:若寄存器堆支持前半个时钟周期写、后半个时钟周期读,则 add 的 WB 段与 sub 的 ID 段可重叠,延迟从 3 个周期减到 2 个周期。
★ 考过 2024
b_257_14解决 RAW 冲突的第二种办法:转发(旁路)¶
设置转发通路,把前一条指令在执行阶段生成的中间结果(暂存于 EX/MEM 流水段寄存器)直接送到 ALU 的输入端,无须等它写回寄存器堆。
效果:相邻两条运算类指令、以及相隔一条无关指令的两条运算类指令之间的 RAW 冲突,都能靠转发完全消除、零停顿。
💡 记忆法:"结果算出来就直接递过去,不用等入库再取"。
b_258_1什么是 load-use 冒险?为什么转发救不了?¶
load r2, 12(r1) 紧跟 add r4, r3, r2:
- load 要到 MEM 段结束才从存储器读出数据(存入 MEM/WB 流水段寄存器)
- 而 add 在 EX 段就需要 r2,此时 load 的 MEM 段才刚在同一周期进行 → 结果还没出来,无从转发
处理办法: - 由编译器在 add 前插入一条 nop,这样 add 的 EX 段就能从 MEM/WB 寄存器转发取到最新值(延迟 + 转发) - 最好的办法是编译时优化、调整指令顺序,从根本上避免 load-use 相关
b_258_6控制冒险是怎么产生的?延迟损失时间片 C 是什么? ★2考¶
遇到转移、返回、中断或异常时 PC 被修改,导致流水线断流。
延迟损失时间片 C = 因流水线阻塞产生的延迟时钟周期数。
分支损失由该数据通路在哪一段生成目标地址、在哪一段判定方向并更新 PC决定,不能脱离图固定背“第 5 周期末”。若 IF 为第 1 周期,经典五级流水的 MEM 是第 4 周期;很多实现会在 EX,甚至更早阶段完成判定。
王道算例给出 C=3 时,应按题图中“从取到分支到新 PC 生效”之间被冲刷/停顿的周期数推导,而不是把“MEM=第 5 周期”当通则。
★ 考过 2014、2023
b_258_13;PDF 第 258 页 · b_258_15解决控制冒险的两类方法?¶
- 延迟分支处理:软件在分支指令后插入若干 nop,或硬件自动插入气泡。插入 nop 的数量 = 分支延迟周期数
- 分支预测技术:尽早生成转移目标地址并预测方向
- 静态预测:用简单规则,总是预测转移发生或总是不发生
- 动态预测:根据运行时的转移历史动态调整,准确率更高
- ⚠️ 预测错误要清空已进入流水线的错误路径指令,从正确目标重新取指,损失等于分支延迟周期数
⚠️ 另外记住:Cache 缺失、中断或异常也会引起流水线阻塞。
b_259_4提升指令级并行的两条策略?¶
- 多发射技术:配置多个内部功能部件,每个时钟周期同时处理多条指令
- 超流水线技术:增加流水线级数,让更多指令重叠执行
b_259_9超标量和超长指令字的区别? ★1考¶
- 超标量流水线(动态多发射):每个时钟周期并发发射多条独立指令,需配置多个功能部件。简单实现按序发射,现代处理器多结合动态调度支持乱序执行
- 超长指令字 VLIW(静态多发射):由编译器挖掘并行性,把多条可并行指令打包成一条超长指令字(含多个操作码字段)。并行性由软件静态确定,控制相对简单
★ 考过 2017
💡 记忆法:"超标量靠硬件动态找并行,VLIW 靠编译器静态排好"。
b_259_12超流水线和多发射的 CPI 各是多少? ★1考¶
- 超流水线 CPU:流水线充满后每周期完成一条指令,CPI = 1,但主频更高
- 多发射 CPU:每周期可完成多条指令,CPI < 1,但硬件成本更高、控制更复杂
★ 考过 2020
b_260_3流水段是不是越多越快?¶
不是。 两个原因: - 段数增加引入更多流水线寄存器,其延迟限制了时钟周期的进一步缩短;同时单条指令从进入到流出的周期数增加;有冒险时段数越多性能损失越显著 - 处理结构冲突、数据冒险和控制转移的控制逻辑急剧复杂化,增加硬件开销甚至成为新瓶颈
b_278_4WAR 和 WAW 相关什么时候才会出现?¶
只有在非按序执行(乱序)的流水线中才可能出现,因为允许后进入的指令超越先进入的指令完成。统考只考按序发射按序完成,所以只涉及 RAW。 - WAR(读后写):I2 的目的操作数是 I1 的源操作数;若 I2 抢先写,I1 会读到错误的新值 - WAW(写后写):I1 和 I2 的目的操作数相同;若 I2 抢先写,最终值会错误地变成 I1 的结果
b_278_85.8 多处理器¶
SISD、SIMD、MISD、MIMD 怎么分? ★1考¶
按指令流和数据流的数量分: - SISD:传统串行计算机,常规单处理器属于此类 - SIMD:数据级并行,一个控制单元 + 多个处理单元,所有单元执行同一条指令但各有独立地址寄存器操作不同数据 - MISD:多指令流处理同一数据流,理论存在但几乎无实际应用 - MIMD:常规多处理器属于此类,主流并行模型
★ 考过 2022
b_272_5SIMD 在什么场景下会失效?¶
处理含条件分支(switch、case)的代码时效率显著降低 —— 因为各处理单元需要根据不同数据执行不同操作,难以保持同步。
SIMD 擅长的是数组 for 循环这类规则、同构的数据处理(一条指令可在 16 个 ALU 中并行处理 16 对数据)。
b_272_9向量处理器属于哪一类?¶
SIMD 的典型实现。 通过专用指令直接操作一维数组(向量):把数据从存储器加载到向量寄存器,以流水化方式批量处理,再写回。在数值模拟等规则计算场景优势显著。
b_272_11MIMD 的两种系统怎么区分?¶
- 多计算机系统:每个节点有私有存储器和独立地址空间,不能用普通访存指令访问其他节点内存,靠消息传递通信 → 消息传递型 MIMD
- 多处理器系统:有统一的全局地址空间,所有处理器可用普通访存指令访问任意存储单元 → 共享存储型 MIMD
⚠️ 总结口径:SIMD 是数据级并行;MIMD 是线程级/任务级并行,并行程度更高、适用范围更广。
b_272_14硬件多线程为什么能降低切换开销?¶
因为为每个线程配备独立的通用寄存器组、PC 等状态部件。线程切换时只需激活对应线程的寄存器组,无须把上下文写入或读出内存。
b_273_1细粒度、粗粒度、同时多线程的区别?¶
- 细粒度多线程:典型实现逐周期从不同就绪线程取指,以细粒度交错隐藏延迟;调度器可以跳过未就绪线程,并非物理上必须严格轮转
- 粗粒度多线程:连续执行同一线程,仅当遇到高延迟事件(如 Cache 缺失)阻塞时才切换;需清空流水线再重新填充,切换开销大于细粒度
- 同时多线程 SMT:单个时钟周期内同时发射并执行来自多个线程的多条指令,既有指令级并行又有线程级并行
⚠️ 前两种在同一时刻仍只执行一个线程的指令,目的只是靠切换隐藏长延迟;只有 SMT 是真正的同时。Intel 的超线程就是 SMT 的典型代表(实际提升 10%~30%)。
b_273_3多核处理器的 Cache 怎么组织?¶
每个核通常配备私有的 L1 Cache(有时还有 L2),多个核共享更高层级的 Cache(如 L3),所有核通过互连网络共享主存。
⚠️ 多核 vs 单核多线程:多核支持多线程在物理上同时执行(每核独立跑一个线程);单核的细/粗粒度多线程只是时间交错,任一时刻只有一个线程在跑(除非支持 SMT)。
b_274_0滚石头的例子怎么区分三种并行?¶
四块石头、每块滚 1 分钟: - 单核串行:逐一滚,4 分钟 - 双核:两名工人各滚两块,2 分钟 → 任务级并行 - 向量处理器:一根长木板同时推四块,1 分钟 → 数据级并行(对所有数据施加完全相同的操作)
b_274_5UMA 和 NUMA 的区别?¶
共享内存多处理器 SMP 按访问延迟特性分两类: - UMA(统一存储访问):所有 CPU 访问任意内存单元的延迟基本相同 - NUMA(非统一存储访问):延迟取决于请求 CPU 与目标内存的物理位置;主存分区分别连到不同 CPU,访问本地内存明显快于远程内存
背景:早期北桥架构下多 CPU 争用前端总线 FSB 成为瓶颈 → NUMA 把内存控制器集成到各 CPU 内部,CPU 间用高速互连总线(如 Intel QPI)相连。
b_274_6SMP 里的 Cache 一致性和单机的有什么不同?¶
- 单处理器:一致性指 Cache 与主存的数据同步
- SMP:多个 CPU 的 Cache 可能同时缓存同一物理地址的副本,一致性协议要约束各核对同一地址写入的可观察顺序,并传播新值或使旧副本失效
⚠️ 这不等于物理上“任意瞬间所有副本位值完全相同、传播延迟为零”。还要区分 Cache coherence(单地址一致性)与 memory consistency(跨地址可见顺序);互斥锁是程序同步机制,不是 Cache 一致性协议本身的组成。
b_275_25.9 本章疑难点¶
计算机怎么区分内存里的指令和数据?¶
- 时间上:取指发生在取指阶段,取操作数发生在执行阶段
- 空间上:取指阶段读出的内容锁存到 IR 供译码;执行阶段读出的内容写入通用寄存器并送 ALU
⚠️ 所以区分不由内存决定,而由 CPU 的控制信号在特定时序下引导其流向不同寄存器来实现。
b_277_13指令周期和时钟周期是什么关系?¶
取决于处理器结构: - 多周期 CPU:一个指令周期包含多个时钟周期 - 单周期 CPU:指令周期恰好等于一个时钟周期
时钟周期是 CPU 操作最基本的时序单位。
b_277_15【易混点】第5章成对概念对照¶
| 易混对 | 分界线 |
|---|---|
| 用户可见 vs 不可见寄存器 | GPR/PC/基址变址可见(FR 只读可见);IR/MAR/MDR 不可见 |
| 单周期 vs 多周期 vs 流水线 | CPI=1 但最慢 / CPI>1 / CPI=1 且时钟周期短 |
| 组合逻辑元件 vs 时序逻辑元件 | 不记事、不要时钟 vs 记事、要时钟 |
| 总线式 vs 专用数据通路 | 简单可扩展但传输慢 vs 并行快但布线复杂 |
| 硬布线 vs 微程序控制器 | 快、难改、RISC vs 慢、易改、CISC |
| 主存储器 vs 控制存储器 | CPU 外 RAM 存程序 vs CPU 内 ROM 存微程序 |
| 水平型 vs 垂直型微指令 | 字长长程序短、并行强 vs 字长短程序长、易编写 |
| 异常 vs 中断 | 内部同步、当前指令引发 vs 外部异步、与指令无关 |
| 故障 vs 自陷 | 执行完成前检测、重执行本条 vs 执行完毕后触发、执行下一条 |
| 可屏蔽 vs 不可屏蔽中断 | INTR 可屏蔽 vs NMI 不可屏蔽(掉电、校验错) |
| 结构 vs 数据 vs 控制冒险 | 争资源 vs 数据没写回 vs PC 被改 |
| 转发 vs load-use | 运算结果可转发;load 的数据 MEM 段才出来,转发也来不及 |
| 超标量 vs 超长指令字 | 硬件动态多发射 vs 编译器静态打包 |
| 细/粗粒度多线程 vs SMT | 时间交错、同时刻只跑一个 vs 同周期发射多线程指令 |
| UMA vs NUMA | 访问延迟相同 vs 本地快、远程慢 |
b_278_3【必背数字】第5章¶
- 指令周期五阶段:IF / ID / EX / MEM / WB
- 单周期 CPI = 1;多周期 CPI > 1;流水线理想 CPI = 1;多发射 CPI < 1
- MUX 控制信号位数至少 ⌈log₂N⌉;译码器 n 位输入 → 2ⁿ 输出
- 最小时钟周期 ≥ T_clk_to_q + T_max + T_setup
- 在本书把每条机器指令映射为一个微程序的模型中:微程序总数 = 机器指令条数 + 公共微程序数
- 3 位字段最多表示 7 个互斥微命令(要留一个表示无操作)
- 本书“4 个 ALU + 4 个存储器微命令”分组例:直接编码 8 位、字段直接 6 位、字段间接 4 位;换分组要重新算
- 取指微程序入口在本书示例中通常放 CM 0 号单元;实际入口地址由实现规定
- k 段流水线完成 n 个任务需 (k + n − 1)·Δt,最大吞吐率 1/Δt
- 五段流水线满载时同时有 5 条指令在执行
- 本书给定数据通路例中 bne 分支延迟损失 C = 3;其他实现要按分支在哪段判定重新数
- 超线程收益取决于工作负载与实现,本书给出的百分比只作示例,不能当通用性能保证
b_254_3;PDF 第 254 页 · b_254_4;PDF 第 254 页 · b_254_5