跳转至

第5章 中央处理器

2027 王道 · 专题阅读 · 保留代码与校订注 · 与版本锁一致

第5章 中央处理器

全书难点,也是综合题重灾区。易出综合题的:数据通路分析、指令执行阶段的节拍与控制信号安排、流水线性能分析。易出选择题的:各种寄存器的特点、指令周期、控制器概念、流水线概念。

回源 · PDF 第 200 页 · b_200_3

【知识树】第5章骨架

  • CPU 功能与结构
  • 六大功能、基本组成部件
  • 用户可见 vs 用户不可见寄存器
  • 指令执行过程
  • 指令周期五阶段:IF / ID / EX / MEM / WB
  • 单周期 / 多周期 / 流水线三种模型
  • 数据通路
  • 组合逻辑元件(操作元件)vs 时序逻辑元件(状态元件)
  • 总线式 vs 专用数据通路
  • 单总线数据通路的节拍安排
  • 控制器
  • 硬布线控制器 vs 微程序控制器
  • 异常和中断
  • 指令流水线
  • 五段流水线、三种冒险及处理
  • 超标量与动态流水线
  • 多处理器
  • SISD / SIMD / MIMD、向量处理器、硬件多线程、多核、SMP
回源 · PDF 第 200 页 · b_200_0;PDF 第 200 页 · b_200_4

5.1 CPU 的功能和结构

CPU 的六大功能?

  • 取指令并译码:取指、解析操作码、生成控制信号
  • 更新 PC:确定下一条指令地址
  • 执行算术与逻辑运算
  • 取操作数或写结果:访问主存或 I/O
  • 处理异常或中断
  • 时序控制:用时钟协调各操作的顺序和持续时间
回源 · PDF 第 200 页 · b_200_2;PDF 第 200 页 · b_200_7

PC、IR、MAR、MDR 的位数各由什么决定? ★3考

  • PC:位数由地址总线宽度决定 → 反映可直接寻址的内存空间
  • IR:位数 = 指令字长
  • MAR:位数由地址总线宽度决定(同 PC)
  • MDR:位数 = 数据总线宽度

★ 考过 2013、2016、2021

💡 记忆法:"PC 和 MAR 看地址线,IR 看指令长,MDR 看数据线"。

回源 · PDF 第 201 页 · b_201_6

哪些是用户可见寄存器?哪些不可见? ★3考

  • 用户可见(程序可直接读写):通用寄存器组 GPRs、专用地址寄存器(基址、变址、堆栈指针)、程序计数器 PC
  • 按王道/统考口径,标志寄存器 FR 属于“只读型”用户可见寄存器:内容通常由 ALU 运算结果更新,程序依据条件码完成判断与转移;具体 ISA 是否提供显式读写或保存/恢复指令只作实现补充,不改变本题分类
  • 用户不可见(完全透明):IR、MAR、MDR、页表基址寄存器

★ 考过 2010、2015、2021

💡 记忆法:"IR/MAR/MDR 三兄弟永远不可见"(和第 1 章"对所有程序员透明"是同一组)。

回源 · PDF 第 202 页 · b_202_5;PDF 第 202 页 · b_202_7

5.2 指令执行过程

指令执行的一般流程是什么? ★1考

  • 以 PC 的当前值为地址从主存取指令,同时 PC 自动更新为下一条顺序指令地址
  • 译码,区分分支指令与非分支指令
  • 分支指令:执行阶段判断分支条件,满足则 PC 更新为分支目标地址
  • 非分支指令:取操作数 → 执行运算 → 写回结果
  • 异常按各阶段的实际检测点产生(如译码发现非法操作码、执行阶段发现除零、访存阶段发现缺页)
  • 可屏蔽外部中断通常在指令边界采样/响应
  • 无待响应事件 → 按更新后的 PC 取下一条指令
  • 有待响应事件 → 按体系结构规则保存断点/状态并转入处理程序

★ 考过 2011

回源 · PDF 第 206 页 · b_206_12

指令周期的五个阶段各做什么?

  • IF 取指:按 PC 取指令送 IR,PC 更新
  • ID 译码/读寄存器:译码、从寄存器堆读操作数、提取立即数
  • EX 执行/计算地址:ALU 运算 / 计算访存有效地址 / 计算分支目标并判断是否转移;状态标志在此阶段生成
  • MEM 访存:读写数据 Cache 或主存(寄存器-寄存器类指令不涉及此阶段)
  • WB 写回:把结果写回寄存器堆
回源 · PDF 第 207 页 · b_207_7

定长指令周期和变长指令周期?

  • 定长:所有指令的周期长度相同
  • 变长:不同指令包含的时钟周期数可变

⚠️ 现代计算机普遍采用基于时钟信号定时的变长指令周期,以提高执行效率。

回源 · PDF 第 208 页 · b_208_11

单周期、多周期、流水线三种模型的 CPI 各是多少? ★3考

  • 单周期:每条指令一个时钟周期,CPI = 1,但时钟周期由最慢的指令决定,快指令也占满整个周期 → 资源浪费
  • 多周期:不同指令占不同数量的时钟周期,平均 CPI 通常大于 1;提高了时钟频率和资源利用率,但指令间仍串行
  • 流水线:每个时钟周期启动一条新指令、多条指令重叠执行,理想 CPI = 1;单条指令的执行延迟并未减少,但整体吞吐率大幅提高

★ 考过 2016、2020、2025

⚠️ 最易错:CPI 都写成 1 不代表性能相同;单周期时钟被最慢指令拖长,在本书同一 ISA 的教学模型比较中吞吐率通常不占优。实际性能仍要比较指令数 × CPI × 时钟周期。

回源 · PDF 第 208 页 · b_208_13

5.3 数据通路

组合逻辑元件和时序逻辑元件怎么区分? ★3考

  • 组合逻辑元件(操作元件):输出仅由当前输入决定,不含记忆单元、不受时钟控制、无反馈通路
  • 例:加法器、ALU、译码器、多路选择器 MUX、三态门
  • 时序逻辑元件(状态元件):输出还依赖历史状态并含记忆单元;在本章的同步 CPU 数据通路中由时钟边沿更新
  • 例:通用寄存器组、PC、状态/暂存寄存器、存储器

★ 考过 2017、2021、2025

💡 记忆法:"能记事的要时钟,不记事的不要"。

⚠️ 这是同步数据通路的做题口径;广义时序电路也可以采用异步实现,不能当作电子学的无条件定义。

回源 · PDF 第 211 页 · b_211_11

译码器、MUX、三态门的控制信号各几位? ★3考

  • 译码器:n 位输入 → 2ⁿ 个互斥输出
  • 多路选择器 MUX:N 路输入 → 至少需 ⌈log₂N⌉ 位控制信号;只有 N 是 2 的幂时才可直接写 log₂N
  • 三态门:由 EN 控制通断,EN=1 输出 = 输入;EN=0 输出呈高阻态(与总线断开)

★ 考过 2015、2023、2024

回源 · PDF 第 212 页 · b_212_0

数据通路的最小时钟周期怎么算?

T ≥ T_clk_to_q + T_max + T_setup - T_clk_to_q:从时钟上升沿到寄存器输出稳定的寄存器延迟 - T_max:组合逻辑的关键路径延迟(所有输出稳定所需的最长时间) - T_setup:下一个寄存器的建立时间

⚠️ 其中 T_max 是关键因素 —— 缩短组合逻辑关键路径是提升 CPU 频率的主要手段。

回源 · PDF 第 212 页 · b_212_6

总线式和专用数据通路怎么取舍?

维度 总线式 专用
结构 简单,部件共享总线 复杂,大量点对点连线
扩展性 强,挂上总线即可 弱,需重新布线
传输效率 低,同一时刻只能传一组 高,可并行传输
硬件成本 低 高
典型应用 教学模型、嵌入式微控制器 高性能通用处理器(RISC)
回源 · PDF 第 213 页 · b_213_3;PDF 第 213 页 · b_213_4

为什么单周期 CPU 不能用单总线结构?

因为单总线一个时钟周期只允许一次数据传输,而单周期 CPU 要求一条指令的所有操作(取指、译码、执行、访存、写回)都在一个时钟周期内完成 —— 单总线根本传不完。

回源 · PDF 第 213 页 · b_213_11

单总线数据通路里,为什么需要暂存器 Y 和 Z? ★3考

  • 需要 Y:ALU 是无存储能力的组合逻辑电路,运算时两个输入必须同时有效。但单总线一次只能传一个数,所以要先把一个操作数经总线送入 Y,下个周期再把另一个送到 ALU 另一输入端
  • 需要 Z:ALU 输出不能直接连到总线,否则可能通过总线反馈回输入端干扰运算结果,所以先暂存到 Z

★ 考过 2013、2015、2022

💡 记忆法:"Y 存前一个操作数,Z 挡住反馈回路"。

回源 · PDF 第 215 页 · 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

回源 · PDF 第 214 页 · b_214_7

单总线下取数指令的执行阶段?

时钟 功能 控制信号
C8 (rs) → MAR GPRout, MARin
C9~C13 MEM(MAR) → MDR MDRin, read
C14 (MDR) → rd MDRout, GPRin

⚠️ 所有指令的取指阶段数据流都相同,区别只在执行阶段。

回源 · PDF 第 215 页 · b_215_3

5.4 单周期专用数据通路(MIPS)

单周期数据通路为什么不设置 IR?

因为单周期要求一个时钟周期内完成整条指令,而仅"取指令到 IR"就要占一个时钟周期。所以单周期直接从指令存储器取指令并解析执行,不设 IR。

⚠️ 同理,单周期还要求指令和数据分开存储(独立的指令存储器和数据存储器),以便在同一周期内并行访问、避免冲突。

回源 · PDF 第 216 页 · b_216_10

R 型指令的数据通路怎么连?

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⌉ 位

回源 · PDF 第 216 页 · 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型)

💡 记忆法:"三个选择器管三件事:写谁、扩什么、算什么"。

回源 · PDF 第 217 页 · b_217_2;PDF 第 217 页 · b_217_4

lw 和 sw 的地址计算有区别吗?

完全一致:都是先对 imm16 符号扩展,再与寄存器 Rs 的内容相加得访存地址。

区别只在数据传输方向: - lw:从该地址读 32 位数据 → 写入寄存器 Rt - sw:把寄存器 Rt 的 32 位数据 → 写入该地址

回源 · PDF 第 217 页 · 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 就问“本指令要哪一路”,每经过一个状态元件就问“本周期是否允许写入”。控制信号名随题图变化,但这条数据流不会变。

回源 · PDF 第 216 页 · b_216_0;PDF 第 217 页 · b_217_2;PDF 第 217 页 · b_217_5

5.5 控制器

控制器的三项职责?

  • 取出待执行的指令并计算下一条指令的位置(更新 PC)
  • 对操作码解码,产生对应的时序信号和控制信号
  • 管理 CPU、主存和 I/O 设备间的数据流向及时序
回源 · PDF 第 234 页 · b_234_0

硬布线控制器的 CU 有哪三类输入?

  • 操作译码器输出的指令信息(n 位操作码译码成 2ⁿ 个输出,每种操作码唯一激活一条信号线)
  • 时钟脉冲(频率即机器主频,用于划分节拍)
  • 执行单元反馈的状态标志

⚠️ 为什么需要状态标志:像条件转移这类指令,执行不仅取决于操作码,还受状态标志影响。

回源 · PDF 第 234 页 · b_234_2;PDF 第 234 页 · b_234_3

硬布线控制器的优缺点?

  • 优点:性能只受电路延迟限制,执行速度快
  • 缺点:灵活性差 —— 修改或新增指令要重新设计电路;指令系统增强时电路规模急剧膨胀、调试困难
回源 · PDF 第 234 页 · b_234_14

微命令、微操作、微指令、微程序的层次关系?

  • 微命令:控制部件发给执行部件的最基本控制信号,是控制序列的最小单位
  • 微操作:执行部件收到微命令后执行的具体动作(与微命令一一对应)
  • 微指令:若干微命令的集合,含操作控制字段 + 顺序控制字段
  • 微程序:若干微指令的有序集合,对应一条机器指令

⚠️ 硬布线控制器中同样存在微命令和微操作,只是实现方式不同(不是只有微程序控制器才有)。

回源 · PDF 第 235 页 · b_235_2;PDF 第 235 页 · b_235_6

相容性微命令和互斥性微命令?

  • 相容性微命令:可同时有效、协同完成某功能
  • 互斥性微命令:同一时刻不允许同时有效

这个区分是字段编码分段的依据。

回源 · PDF 第 235 页 · b_235_4

主存储器和控制存储器有什么区别? ★1考

主存储器 控制存储器 CM
存什么 程序和数据 微程序
位置 CPU 外部 CPU 内部
实现 通常用 RAM 通常用 ROM

CM 中每个单元的地址称为微地址。

★ 考过 2017

回源 · PDF 第 235 页 · b_235_17

程序和微程序的区别?

  • 程序:指令的有序集合,由软件开发者编写,存放在主存或辅存
  • 微程序:微指令的有序集合,由计算机体系结构设计者编写,固化于控制存储器,用于解释执行机器指令

⚠️ 微程序对程序员完全透明。

回源 · PDF 第 235 页 · b_235_19

微程序控制器涉及的四个寄存器分别装什么?

  • MAR:主存读写地址
  • μPC(CMAR):待执行微指令在 CM 中的微地址
  • IR:从主存读出的当前机器指令
  • μIR(CMDR):从 CM 读出的当前微指令

💡 记忆法:"不带 μ 的管主存,带 μ 的管控存"。

回源 · PDF 第 235 页 · b_235_23

微程序控制器的工作过程四步?

  • ① 执行取指令公共操作:取指微程序入口地址(通常是 CM 的 0 号单元)送 μPC,取指完成后机器指令进入 IR
  • ② 根据 IR 中的操作码,由微地址形成部件产生该指令微程序的入口地址送 μPC
  • ③ 从 CM 逐条读微指令送 μIR 并执行,直到该微程序结束
  • ④ 自动转回取指微程序入口,处理下一条机器指令
回源 · PDF 第 236 页 · b_236_7;PDF 第 236 页 · b_236_8

控制存储器里一共存多少个微程序?

微程序总数 = 机器指令条数 + 公共微程序数(取指、间址、中断等)

因为所有指令的取指操作相同,可以把取指写成一个公共的取指微程序;间址、中断处理同理。

⚠️ 这是计算题考点,别忘了加公共微程序。

回源 · PDF 第 236 页 · b_236_14

三种微指令编码方式怎么权衡? ★1考

  • 直接编码:每一位直接对应一个微命令,无须译码
  • 优点:结构简单、可并行、速度最快;缺点:字长过长(n 个微命令要 n 位)
  • 字段直接编码:把互斥性微命令归入同一字段、相容性的分到不同字段,各字段独立译码
  • 显著缩短字长,但因需译码速度略低
  • 字段间接编码:某字段的含义由另一字段的编码共同决定
  • 字长最短,但译码线路复杂、时间开销大,仅用于特定场合

★ 考过 2012

回源 · PDF 第 237 页 · b_237_4

字段分段要遵守哪三条原则?

  • 互斥性微命令放同一字段,相容性微命令放不同字段
  • 每个字段位数不宜过多,避免译码电路复杂、延迟大
  • 每个字段要预留一个编码表示"本字段无操作"(通常用全 0)

⚠️ 若某字段容纳 \(n_i\) 个互斥微命令,还要留一个“无操作”码,则字段位数通式为 \(\lceil\log_2(n_i+1)\rceil\)。所以 3 位字段最多只能表示 7 个互斥微命令,不是 8 个 —— 这是计算题的常见坑。

回源 · PDF 第 237 页 · b_237_8

经典算例:8 个微命令用三种编码各需几位?

设 ALU 操作 4 种(互斥)、存储器操作 4 种(互斥),两类之间相容: - 直接编码:8 位(每位一个微命令) - 字段直接编码:分两个字段,每字段 3 位(含无操作)→ 6 位 - 字段间接编码:一个 3 位操作字段 + 一个 1 位类型字段 → 4 位

回源 · PDF 第 237 页 · b_237_14

微指令的下地址怎么形成? ★1考

两种基本方式: - 增量方式(计数器方式):由 μPC 自动加 1,适用于顺序执行段 - 断定方式(下址字段方式):当前微指令中显式指定下条微地址

三种典型情形:微程序入口地址由操作码经微地址形成部件产生;顺序执行用增量方式;条件分支结合下址字段与条件信号确定。

★ 考过 2014

回源 · PDF 第 238 页 · b_238_4;PDF 第 238 页 · b_238_5

水平型和垂直型微指令怎么选?

  • 水平型微指令(直接编码、字段直接编码、字段间接编码都属于):每位/每字段直接对应微命令,一条微指令可同时执行多个并行微操作
  • 优点:并行能力强、执行效率高、微程序短;缺点:微指令字长长、编写困难
  • 垂直型微指令:类似机器指令结构,有微操作码字段,需译码,一条通常只定义一个基本微操作
  • 优点:微指令短、格式规整、易编写;缺点:微程序长、执行速度慢

💡 记忆法:"水平的横着宽(字长长、程序短),垂直的竖着长(字长短、程序长)"。

回源 · PDF 第 238 页 · b_238_6

硬布线和微程序控制器的五项对比? ★1考

对比项 微程序控制器 硬布线控制器
工作原理 控制信号以微程序存在 CM 中,执行时读出 组合逻辑电路即时产生
执行速度 慢 快
规整性 较规整 烦琐、不规整
应用场合 CISC CPU RISC CPU
易扩充性 易扩充修改 扩充修改困难

★ 考过 2009

回源 · PDF 第 239 页 · b_239_4

5.6 异常和中断

异常和中断的根本区别? ★2考

  • 异常(内中断):CPU 内部检测到的同步事件,由当前指令直接引发,具有确定性和可重现性(除零、非法操作码、缺页)
  • 中断(外中断):外部设备发起的异步事件,与当前指令无关,具有随机性

★ 考过 2015、2023

回源 · PDF 第 247 页 · b_247_4

异常和中断的响应时机有什么不同? ★1考

  • 异常:CPU 通常在指令执行过程中或完成时立即响应
  • 中断:仅在当前指令完整执行结束后才被检测(指令执行期间不采样中断信号)

★ 考过 2023

回源 · PDF 第 247 页 · b_247_9

异常和中断处理完后,从哪条指令继续? ★1考

  • 异常:通常需重新执行第 i 条指令(如缺页异常在页面调入后重试访存)
  • 中断:从第 i+1 条指令开始继续

⚠️ 若异常属于不可恢复的致命错误(如非法指令),操作系统将终止该用户进程。

★ 考过 2021

💡 记忆法:"异常重做当前条,中断接着下一条"。

回源 · PDF 第 247 页 · b_247_17

故障、自陷、终止怎么区分? ★1考

  • 故障 Fault:指令启动之后、执行完成之前被检测到,CPU 尚未提交结果;处理后重新执行同一条指令(缺页、非法操作码、除零)
  • 自陷 Trap:预先安排的主动事件,在指令正常执行完毕之后触发,CPU 已完整提交结果;处理后从自陷指令的下一条继续(断点调试、单步跟踪、系统调用 syscall、MIPS 的 teq)
  • 终止 Abort:处理器无法可靠定位或恢复的严重同步异常类别,通常不能重启当前指令;成因可涉及硬件故障,但它仍属于异常分类

⚠️ 不要因 Abort 可能由硬件故障引发,就把它并入“外部中断”。Fault、Trap、Abort 是同步异常的三类;外中断是异步事件。

★ 考过 2020

回源 · PDF 第 248 页 · b_248_2

可屏蔽中断和不可屏蔽中断? ★4考

  • 可屏蔽中断:通过 INTR 线发送,可由中断屏蔽寄存器选择性屏蔽
  • 不可屏蔽中断:通过专用的 NMI 线发送,无法被软件屏蔽,用于电源掉电、内存校验错等高优先级事件

另两个分类维度:按入口地址获取方式分向量中断(硬件直接提供入口地址)和非向量中断(软件轮询确定中断源);按是否允许嵌套分单重中断和多重中断。

★ 考过 2009、2016、2020、2025

回源 · PDF 第 248 页 · b_248_9

异常和中断响应过程的三个阶段?

  • ① 关中断:自动屏蔽可屏蔽中断(清零标志寄存器中的 IF 位,IF=0 关中断、IF=1 开中断),保证上下文保存的原子性
  • ⚠️ 不可屏蔽中断和部分高优先级异常仍可能在此期间发生
  • ② 保存断点和程序状态:断点(异常存当前指令地址,中断存下一条指令地址)+ PSW,压入内核栈(天然支持嵌套)
  • ③ 识别事件类型并转移:现代处理器用向量中断 —— 每类事件有唯一类型号,系统初始化时把中断向量填入中断向量表,事件发生时以类型号为索引直接查表转移

⚠️ 整个响应过程由硬件自动完成,后续处理逻辑(缺页调入、系统调用分发)才由操作系统软件实现。

回源 · PDF 第 249 页 · b_249_17

5.7 指令流水线

提升并行性的两条路子?

  • 时间上的并行:把任务分解为多个子阶段、各阶段由专用部件处理、多任务在不同阶段同时推进 → 流水线技术
  • 空间上的并行:在一个处理器内配置多个相同的功能部件并行工作 → 超标量处理器
回源 · PDF 第 252 页 · b_252_6

流水线对指令集有哪四点要求? ★1考

  • 指令长度统一:简化取指与译码,避免取指周期不确定
  • 指令格式规整:源操作数寄存器字段位置固定,支持译码前预取操作数
  • 采用 LOAD/STORE 架构:只有访存指令碰内存,利于流水段功能划分
  • 数据与指令按边界对齐存放:单次访存即可取完整操作数

⚠️ 这四点正好都是 RISC 的特征 —— 所以说 RISC 天生适合流水线。

★ 考过 2011

回源 · PDF 第 253 页 · b_253_1

流水线设计的两条原则? ★2考

  • 流水段的数量以最复杂指令所需的功能段数为准
  • 每个流水段的时长以最耗时的操作为准

★ 考过 2009、2025

回源 · PDF 第 253 页 · b_253_8

经典算例:流水线反而让单条指令变慢了?

各段延迟:取指 200ps、译码 100ps、执行 150ps、访存 200ps、写回 100ps - 单周期总执行时间 = 750ps(各段之和) - 流水线时钟周期 = 200ps(取最大段)→ 单条指令走完 5 段 = 1000ps

⚠️ 结论:流水线并不能缩短单条指令的执行延迟(反而变长了)。但对 N 条指令:单周期 N×750ps,流水线 (N+4)×200ps —— N 大时吞吐率显著更高。

回源 · PDF 第 253 页 · b_253_0;PDF 第 253 页 · b_253_1

为什么每个流水段后面都要加流水段寄存器?

用于锁存该段的输出结果,确保能在下一个时钟周期供下一流水段使用。所有寄存器和存储器用统一时钟 CLK 同步,每来一个时钟脉冲,各段结果锁存到段尾寄存器。

⚠️ 流水段寄存器本身也有时延,但考试中若无明确说明可忽略。

★ 考过 2018

回源 · PDF 第 254 页 · 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 段,之后每周期出一条。

回源 · PDF 第 254 页 · b_254_3;PDF 第 254 页 · b_254_4

【做题模板】流水线冒险题怎样画时空图?

  1. 先画阶段表,标出每条指令在哪一段产生结果、后继指令在哪一段需要结果。
  2. 再画“横轴为周期、纵轴为指令”的时空图;相同周期争同一硬件就是结构冒险。
  3. 若结果产生早于消费者需要,可画转发箭头;否则插入气泡,直到数据时序满足。
  4. load-use 要特别检查:经典五级中 load 的数据到 MEM 末才出现,紧邻消费者的 EX 来不及,通常仍需 1 个气泡。
  5. 分支题从题图找“目标地址/方向在哪段确定”,被取入的错误路径指令数才是冲刷代价。

⚠️ 简单按序五级流水主要出现 RAW;WAR/WAW 通常要到乱序或多发射模型才出现,不能见到“流水线”就三类全报。

回源 · PDF 第 254 页 · 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 阶段)

回源 · PDF 第 256 页 · b_256_2

beq 的 MEM 段在干什么?

不是真的访存,而是把分支目标地址写入 PC。之所以安排在 MEM 段,是为了与 lw、sw 等指令对齐;写 PC 的延迟小于存储器访问,所以能在 MEM 段内完成。

回源 · PDF 第 255 页 · b_255_19

结构冒险是什么?怎么解决? ★1考

不同指令在同一时刻争用同一功能部件,本质是硬件资源的物理限制。

典型场景:指令与数据共享同一存储器时,第 i 条 LOAD 指令处于 MEM 段(访问数据),第 i+3 条指令同时处于 IF 段(取指令)→ 冲突。

两种解决办法: - 暂停后续指令的取指一个周期(插入停顿) - 增加硬件资源:寄存器堆读口写口分离(前半拍写、后半拍读);指令存储器与数据存储器分离(现代 L1 用分离的指令 Cache 和数据 Cache,从根本上消除该冲突)

★ 考过 2016

回源 · PDF 第 256 页 · b_256_13

数据冒险的根本原因?为什么只有 RAW? ★5考

根本原因:后面指令用到前面指令的结果时,前面指令的结果还未产生或写回。

在按序发射、按序完成的流水线中(统考只涉及这种),所有数据冒险都是写后读 RAW(Read After Write)冲突。

典型例子:

I1: add R1, R2, R3    # 结果写 R1,但要到 WB 段才写回
I2: sub R4, R1, R5    # ID 段就要读 R1 → 读到旧值

★ 考过 2012、2014、2016、2019、2023

回源 · PDF 第 257 页 · b_257_2

解决 RAW 冲突的第一种办法:延迟执行 ★1考

把相关指令及其后续指令暂停若干时钟周期,直到前一条指令的结果可安全读取。分两种实现:软件插入 nop 指令、硬件自动插入气泡(阻塞)。

⚠️ 关键细节:若寄存器堆支持前半个时钟周期写、后半个时钟周期读,则 add 的 WB 段与 sub 的 ID 段可重叠,延迟从 3 个周期减到 2 个周期。

★ 考过 2024

回源 · PDF 第 257 页 · b_257_14

解决 RAW 冲突的第二种办法:转发(旁路)

设置转发通路,把前一条指令在执行阶段生成的中间结果(暂存于 EX/MEM 流水段寄存器)直接送到 ALU 的输入端,无须等它写回寄存器堆。

效果:相邻两条运算类指令、以及相隔一条无关指令的两条运算类指令之间的 RAW 冲突,都能靠转发完全消除、零停顿。

💡 记忆法:"结果算出来就直接递过去,不用等入库再取"。

回源 · PDF 第 258 页 · 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 相关

回源 · PDF 第 258 页 · b_258_6

控制冒险是怎么产生的?延迟损失时间片 C 是什么? ★2考

遇到转移、返回、中断或异常时 PC 被修改,导致流水线断流。

延迟损失时间片 C = 因流水线阻塞产生的延迟时钟周期数。

分支损失由该数据通路在哪一段生成目标地址、在哪一段判定方向并更新 PC决定,不能脱离图固定背“第 5 周期末”。若 IF 为第 1 周期,经典五级流水的 MEM 是第 4 周期;很多实现会在 EX,甚至更早阶段完成判定。

王道算例给出 C=3 时,应按题图中“从取到分支到新 PC 生效”之间被冲刷/停顿的周期数推导,而不是把“MEM=第 5 周期”当通则。

★ 考过 2014、2023

回源 · PDF 第 258 页 · b_258_13;PDF 第 258 页 · b_258_15

解决控制冒险的两类方法?

  • 延迟分支处理:软件在分支指令后插入若干 nop,或硬件自动插入气泡。插入 nop 的数量 = 分支延迟周期数
  • 分支预测技术:尽早生成转移目标地址并预测方向
  • 静态预测:用简单规则,总是预测转移发生或总是不发生
  • 动态预测:根据运行时的转移历史动态调整,准确率更高
  • ⚠️ 预测错误要清空已进入流水线的错误路径指令,从正确目标重新取指,损失等于分支延迟周期数

⚠️ 另外记住:Cache 缺失、中断或异常也会引起流水线阻塞。

回源 · PDF 第 259 页 · b_259_4

提升指令级并行的两条策略?

  • 多发射技术:配置多个内部功能部件,每个时钟周期同时处理多条指令
  • 超流水线技术:增加流水线级数,让更多指令重叠执行
回源 · PDF 第 259 页 · b_259_9

超标量和超长指令字的区别? ★1考

  • 超标量流水线(动态多发射):每个时钟周期并发发射多条独立指令,需配置多个功能部件。简单实现按序发射,现代处理器多结合动态调度支持乱序执行
  • 超长指令字 VLIW(静态多发射):由编译器挖掘并行性,把多条可并行指令打包成一条超长指令字(含多个操作码字段)。并行性由软件静态确定,控制相对简单

★ 考过 2017

💡 记忆法:"超标量靠硬件动态找并行,VLIW 靠编译器静态排好"。

回源 · PDF 第 259 页 · b_259_12

超流水线和多发射的 CPI 各是多少? ★1考

  • 超流水线 CPU:流水线充满后每周期完成一条指令,CPI = 1,但主频更高
  • 多发射 CPU:每周期可完成多条指令,CPI < 1,但硬件成本更高、控制更复杂

★ 考过 2020

回源 · PDF 第 260 页 · b_260_3

流水段是不是越多越快?

不是。 两个原因: - 段数增加引入更多流水线寄存器,其延迟限制了时钟周期的进一步缩短;同时单条指令从进入到流出的周期数增加;有冒险时段数越多性能损失越显著 - 处理结构冲突、数据冒险和控制转移的控制逻辑急剧复杂化,增加硬件开销甚至成为新瓶颈

回源 · PDF 第 278 页 · b_278_4

WAR 和 WAW 相关什么时候才会出现?

只有在非按序执行(乱序)的流水线中才可能出现,因为允许后进入的指令超越先进入的指令完成。统考只考按序发射按序完成,所以只涉及 RAW。 - WAR(读后写):I2 的目的操作数是 I1 的源操作数;若 I2 抢先写,I1 会读到错误的新值 - WAW(写后写):I1 和 I2 的目的操作数相同;若 I2 抢先写,最终值会错误地变成 I1 的结果

回源 · PDF 第 278 页 · b_278_8

5.8 多处理器

SISD、SIMD、MISD、MIMD 怎么分? ★1考

按指令流和数据流的数量分: - SISD:传统串行计算机,常规单处理器属于此类 - SIMD:数据级并行,一个控制单元 + 多个处理单元,所有单元执行同一条指令但各有独立地址寄存器操作不同数据 - MISD:多指令流处理同一数据流,理论存在但几乎无实际应用 - MIMD:常规多处理器属于此类,主流并行模型

★ 考过 2022

回源 · PDF 第 272 页 · b_272_5

SIMD 在什么场景下会失效?

处理含条件分支(switch、case)的代码时效率显著降低 —— 因为各处理单元需要根据不同数据执行不同操作,难以保持同步。

SIMD 擅长的是数组 for 循环这类规则、同构的数据处理(一条指令可在 16 个 ALU 中并行处理 16 对数据)。

回源 · PDF 第 272 页 · b_272_9

向量处理器属于哪一类?

SIMD 的典型实现。 通过专用指令直接操作一维数组(向量):把数据从存储器加载到向量寄存器,以流水化方式批量处理,再写回。在数值模拟等规则计算场景优势显著。

回源 · PDF 第 272 页 · b_272_11

MIMD 的两种系统怎么区分?

  • 多计算机系统:每个节点有私有存储器和独立地址空间,不能用普通访存指令访问其他节点内存,靠消息传递通信 → 消息传递型 MIMD
  • 多处理器系统:有统一的全局地址空间,所有处理器可用普通访存指令访问任意存储单元 → 共享存储型 MIMD

⚠️ 总结口径:SIMD 是数据级并行;MIMD 是线程级/任务级并行,并行程度更高、适用范围更广。

回源 · PDF 第 272 页 · b_272_14

硬件多线程为什么能降低切换开销?

因为为每个线程配备独立的通用寄存器组、PC 等状态部件。线程切换时只需激活对应线程的寄存器组,无须把上下文写入或读出内存。

回源 · PDF 第 273 页 · b_273_1

细粒度、粗粒度、同时多线程的区别?

  • 细粒度多线程:典型实现逐周期从不同就绪线程取指,以细粒度交错隐藏延迟;调度器可以跳过未就绪线程,并非物理上必须严格轮转
  • 粗粒度多线程:连续执行同一线程,仅当遇到高延迟事件(如 Cache 缺失)阻塞时才切换;需清空流水线再重新填充,切换开销大于细粒度
  • 同时多线程 SMT:单个时钟周期内同时发射并执行来自多个线程的多条指令,既有指令级并行又有线程级并行

⚠️ 前两种在同一时刻仍只执行一个线程的指令,目的只是靠切换隐藏长延迟;只有 SMT 是真正的同时。Intel 的超线程就是 SMT 的典型代表(实际提升 10%~30%)。

回源 · PDF 第 273 页 · b_273_3

多核处理器的 Cache 怎么组织?

每个核通常配备私有的 L1 Cache(有时还有 L2),多个核共享更高层级的 Cache(如 L3),所有核通过互连网络共享主存。

⚠️ 多核 vs 单核多线程:多核支持多线程在物理上同时执行(每核独立跑一个线程);单核的细/粗粒度多线程只是时间交错,任一时刻只有一个线程在跑(除非支持 SMT)。

回源 · PDF 第 274 页 · b_274_0

滚石头的例子怎么区分三种并行?

四块石头、每块滚 1 分钟: - 单核串行:逐一滚,4 分钟 - 双核:两名工人各滚两块,2 分钟 → 任务级并行 - 向量处理器:一根长木板同时推四块,1 分钟 → 数据级并行(对所有数据施加完全相同的操作)

回源 · PDF 第 274 页 · b_274_5

UMA 和 NUMA 的区别?

共享内存多处理器 SMP 按访问延迟特性分两类: - UMA(统一存储访问):所有 CPU 访问任意内存单元的延迟基本相同 - NUMA(非统一存储访问):延迟取决于请求 CPU 与目标内存的物理位置;主存分区分别连到不同 CPU,访问本地内存明显快于远程内存

背景:早期北桥架构下多 CPU 争用前端总线 FSB 成为瓶颈 → NUMA 把内存控制器集成到各 CPU 内部,CPU 间用高速互连总线(如 Intel QPI)相连。

回源 · PDF 第 274 页 · b_274_6

SMP 里的 Cache 一致性和单机的有什么不同?

  • 单处理器:一致性指 Cache 与主存的数据同步
  • SMP:多个 CPU 的 Cache 可能同时缓存同一物理地址的副本,一致性协议要约束各核对同一地址写入的可观察顺序,并传播新值或使旧副本失效

⚠️ 这不等于物理上“任意瞬间所有副本位值完全相同、传播延迟为零”。还要区分 Cache coherence(单地址一致性)与 memory consistency(跨地址可见顺序);互斥锁是程序同步机制,不是 Cache 一致性协议本身的组成。

回源 · PDF 第 275 页 · b_275_2

5.9 本章疑难点

计算机怎么区分内存里的指令和数据?

  • 时间上:取指发生在取指阶段,取操作数发生在执行阶段
  • 空间上:取指阶段读出的内容锁存到 IR 供译码;执行阶段读出的内容写入通用寄存器并送 ALU

⚠️ 所以区分不由内存决定,而由 CPU 的控制信号在特定时序下引导其流向不同寄存器来实现。

回源 · PDF 第 277 页 · b_277_13

指令周期和时钟周期是什么关系?

取决于处理器结构: - 多周期 CPU:一个指令周期包含多个时钟周期 - 单周期 CPU:指令周期恰好等于一个时钟周期

时钟周期是 CPU 操作最基本的时序单位。

回源 · PDF 第 277 页 · 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 本地快、远程慢
回源 · PDF 第 278 页 · 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;其他实现要按分支在哪段判定重新数
  • 超线程收益取决于工作负载与实现,本书给出的百分比只作示例,不能当通用性能保证
回源 · PDF 第 254 页 · b_254_3;PDF 第 254 页 · b_254_4;PDF 第 254 页 · b_254_5