第 5 章 中央处理器
本章地位:组成原理分值最重、大题最集中的一章(选择题 + 大题合计常达 8~13 分)。三大主战场:① 数据通路微操作序列——给出单总线结构,写出 MOV / ADD / LOAD / JMP 的执行步骤,每一步写清「谁上总线、谁接收」;② 微指令格式与控存容量计算——控制字段 + 判别测试字段 + 下地址字段逐段求位数,须代具体数验证;③ 流水线性能计算——总时间 \(T=(k+n-1)\Delta t\)、吞吐率、加速比、效率四件套,再叠加停顿与 load-use 冒险。概念题主考寄存器可见性、四个周期的微操作、硬布线与微程序对比、编码方式辨析。本章所有计算全部代具体数值逐步演算。
5.1 CPU 的功能与结构 高频考点
- 指令控制:控制程序的执行顺序(取指、PC 自增、转移);
- 操作控制:按指令要求产生完成一条指令所需的全部微操作命令(控制信号);
- 时间控制:把各种微操作安排在恰当的时序位置(哪个周期、哪个节拍)上;
- 数据加工:由 ALU 对数据进行算术运算与逻辑运算;
- 中断处理:响应并处理异常和 I/O 中断。
5.1.1 运算器与控制器:CPU 的两大部件
- 算术逻辑单元 ALU:执行加、减、与、或、移位等运算,是组合逻辑电路(无记忆);
- 累加寄存器 ACC / 通用寄存器组 R0~R(n−1):存放操作数与运算结果;
- 暂存寄存器 Y / Z:暂存不能同时上总线的两个操作数与 ALU 的输出(见 5.3);
- 程序状态字寄存器 PSW:记录进位 CF、溢出 OF、零 ZF、负 SF 等标志位,是条件转移指令的判断依据;
- 内部总线:连接各寄存器与 ALU,传送数据。
- 程序计数器 PC:存放下一条欲执行指令的主存地址;
- 指令寄存器 IR:存放当前正在执行的指令;
- 指令译码器 ID:对 IR 中的操作码译码,识别指令类型(不译地址码);
- 时序系统:产生节拍与脉冲,为微操作定时;
- 微操作信号发生器(控制单元 CU):综合「操作码译码结果 + 时序信号 + 状态标志」,发出每一步的微操作命令——它是硬布线与微程序两种设计方式的分水岭。
② 指令译码器只对操作码译码,形式地址→有效地址的变换在执行周期由 ALU / 寻址机构完成;
③ ALU 是组合逻辑,一撤输入输出就消失,所以输出必须落进 Z 寄存器;
④ PSW(条件码)属运算器一侧,时序系统、译码器属控制器——归类选择题常在这里挖坑。
5.1.2 寄存器大盘点:用户可见 vs 不可见
| 寄存器 | 所属 | 作用 | 汇编程序员可见性 |
|---|---|---|---|
| PC | 控制器 | 存下一条指令的地址 | 不可直接访问(转移 / 调用指令可修改,考题一般判为不可见) |
| IR | 控制器 | 存当前执行的指令 | 不可见 |
| MAR | CPU 内、主存接口 | 存欲访问主存单元的地址 | 不可见 |
| MDR | CPU 内、主存接口 | 存与主存交换的数据 / 指令 | 不可见 |
| 通用寄存器 / ACC | 运算器 | 存操作数与结果 | 可见(指令能直接点名) |
| PSW 标志位 | 运算器 | CF / OF / ZF / SF | 可见(条件转移的依据) |
| 暂存器 Y / Z | 运算器 | 暂存 ALU 的操作数与结果 | 不可见(硬件自用) |
| 基址 / 变址寄存器、SP | 地址寄存器 | 寻址与栈管理 | 可见 |
下列寄存器中,对汇编语言程序员完全透明(不可见)的是( )
A. 通用寄存器 R0 B. PSW 中的零标志 ZF C. 存储器数据寄存器 MDR D. 变址寄存器 IX
查看解答
C。逐项分析:
A 可见:MOV 指令可直接指定 R0;B 可见:JZ / JNZ 等条件转移直接测试 ZF;D 可见:变址寻址指令显式使用 IX;
C 不可见:MDR 是 CPU 与主存交换数据的中转站,由硬件自动装卸,任何指令都无法点名访问它——对程序员完全透明。同理透明的还有 MAR、IR、暂存器 Y/Z。
判断下列说法的正误:(1) 指令译码器既译操作码又译地址码;(2) PSW 属于运算器的组成部分;(3) PC 的内容是当前正在执行的指令本身;(4) 时序系统属于控制器。
查看答案
(1) 错:译码器只对操作码译码;地址码经寻址机构在执行周期形成有效地址。
(2) 对:条件码由 ALU 运算产生,PSW 划归运算器一侧。
(3) 错:PC 存的是下一条指令的主存地址,指令本身在 IR 中。
(4) 对:时序系统(时钟、节拍、脉冲发生器)为控制器提供时间基准,属控制器。
5.2 指令执行过程 高频考点
5.2.1 三级时序:指令周期 → 机器周期 → 时钟周期
- 指令周期:CPU 取出并执行完一条指令所需的全部时间,常由若干机器周期组成;
- 机器周期(CPU 周期):完成一个基本操作(如访存一次)的时间,通常等于一个存取周期,由若干时钟周期组成;
- 时钟周期(节拍):CPU 操作的最小时间单位,等于主频的倒数 \(T_{\text{clk}} = 1/f\)。
② 「所有指令的指令周期都相同」是错的,唯有取指周期完全相同(每条指令都必须先取指);
③ 完成一条指令的三步「取指 → 分析 → 执行」中,分析(译码)不含访存,可与取指的后半重叠。
5.2.2 四个周期及其微操作
C1: (PC) → MAR, 1 → R ; PC 内容送 MAR,同时发读命令
C2: M(MAR) → MDR, (PC) + 1 → PC ; 读出指令送 MDR,PC 自动加"1"指向下条
C3: (MDR) → IR, OP(IR) → ID ; 指令送 IR 保存,操作码送译码器译码
C1: Ad(IR) → MAR, 1 → R ; 指令中的形式地址送 MAR,发读命令
C2: M(MAR) → MDR ; 从主存读出有效地址 EA
C3: (MDR) → Ad(IR) ; EA 送回指令的地址码字段,供执行周期用
C1: 0 → EInt ; 关中断(硬件强制,防保存断点期间再被中断)
C2: (SP) - 1 → SP, (SP) → MAR ; 栈指针减"1",断点存放地址送 MAR
C3: (PC) → MDR, 1 → W ; 断点(返回地址)送 MDR,发写命令
C4: (MDR) → M(MAR) ; 断点压入堆栈保存
C5: 向量地址 → PC ; 中断服务程序入口地址送 PC,转服务程序
下列关于指令周期的叙述中,错误的是( )
A. 取指周期结束时,指令本身已存放于 IR,PC 已指向下一条指令
B. 间址周期结束时,取得的有效地址存放在指令的地址码字段(MDR 送 Ad(IR))
C. 中断周期内关中断、保存断点、引出服务程序均由中断隐指令(硬件)自动完成
D. 任何一条指令的指令周期都由取指、间址、执行、中断四个周期顺序组成
查看解答
D。逐项分析:
A 对:取指三步走完,指令进 IR、PC 已加 1;B 对:这是间址周期的标准收尾——EA 回填地址码字段,执行周期直接用它访存;C 对:「隐指令」即靠硬件完成的虚拟指令;
D 错:四个周期中只有取指与执行是每条指令必有的——间址周期仅间接寻址指令需要,中断周期仅在该指令执行后恰有中断请求并被响应时才插入。「都有四个周期」把可选说成必选。
某机主频 8 MHz,每个机器周期含 4 个时钟周期,一条指令平均经历 3 个机器周期。求时钟周期、平均指令周期、CPI 与 MIPS。
查看答案
时钟周期:
\[ T_{\text{clk}}=\frac{1}{8\times10^{6}}=125\ \text{ns}\quad(\checkmark) \]CPI \(=3\times4=12\) 个时钟周期;平均指令周期:
\[ 12\times125\ \text{ns}=1500\ \text{ns}=1.5\ \mu\text{s}\quad(\checkmark) \]\[ \text{MIPS}=\frac{f}{\text{CPI}\times10^{6}}=\frac{8\times10^{6}}{12\times10^{6}}\approx0.67\quad(\checkmark) \]
5.3 数据通路与微操作序列 大题重点
5.3.1 单总线结构:为什么必须设暂存器 Y、Z
② ALU 是组合逻辑,输入端不能接总线两份——两个操作数不能同拍从总线进 ALU,故设 Y 暂存前一个操作数;输出若直接回总线会与输入形成不稳定回路,故结果先落 Z,下一拍再送目的寄存器。
② 一个节拍内可以完成「数据上总线 + 若干寄存器接收」,如 C1 拍 (PC)→MAR 与 1→R(发读命令)同时进行;
③ 含访存的微操作(M(MAR)→MDR)要等存储器读/写完成,一般独占一拍。
5.3.2 典型指令的微操作序列(大题模板)
取指周期 C1~C3:同 5.2.2 节((PC)→MAR→读存→MDR→IR,PC+1)
执行周期:
C4: (R1) → R0 ; R1 内容上总线,R0 同拍接收,一步完成
取指周期:
C1: (PC) → MAR, 1 → R ; 指令地址送 MAR,发读命令
C2: M(MAR) → MDR, (PC) + 1 → PC ; 取出指令,PC 加"1"
C3: (MDR) → IR, OP(IR) → ID ; 指令进 IR,译码
执行周期(直接寻址,无需间址周期):
C4: Ad(IR) → MAR, 1 → R ; 形式地址=有效地址,送 MAR,发读命令
C5: M(MAR) → MDR ; 从主存读出操作数
C6: (MDR) → R0 ; 数据上总线,R0 接收
某单总线 CPU 结构如图 5-2,主存按字编址。指令 LOAD R0, @ADDR(一重间接寻址,功能 R0 ← M[M[ADDR]])。写出该指令从取指到执行结束的全部微操作序列。
查看解答
一重间接寻址需经历取指 + 间址 + 执行三个周期:
取指周期:
C1: (PC) → MAR, 1 → R C2: M(MAR) → MDR, (PC)+1 → PC C3: (MDR) → IR, OP(IR) → ID
间址周期(把形式地址 ADDR 变换为有效地址 EA):
C4: Ad(IR) → MAR, 1 → R C5: M(MAR) → MDR C6: (MDR) → Ad(IR)
执行周期(按 EA 取数送 R0):
C7: Ad(IR) → MAR, 1 → R C8: M(MAR) → MDR C9: (MDR) → R0
套路总结:间接寻址 = 多一次「读地址」的访存循环,间址与执行两个周期结构完全相同,只是第一次取出的是地址、第二次取出的是数据;每拍都只一个数据上总线。
C4: (R1) → Y ; 第一个操作数 R1 上总线,锁入暂存器 Y
C5: (R0) + (Y) → Z ; 第二个操作数 R0 上总线进 ALU,与 Y 相加,结果锁入 Z
C6: (Z) → R0 ; 上一拍结果 Z 上总线,写回 R0
在图 5-2 的单总线数据通路上,有同学把 ADD R0, R1 的执行周期写成两拍:C4: (R0)+(R1) → Z;C5: (Z) → R0。指出错误原因,并给出正确写法。
查看解答
错误在 C4:(R0) 与 (R1) 同拍上总线,违反「单总线同一时刻只能有一个发送者」的铁律;且 ALU 若两个输入端都接总线,同一条线上的同一个数不可能既是 R0 又是 R1。
正确写法必须三拍:
C4: (R1) → Y(先锁一个操作数) C5: (R0) + (Y) → Z(另一个操作数这时才上总线) C6: (Z) → R0(结果回写)
套路总结:单总线上一次运算 = 「送 Y → 运算进 Z → 送目的」三步。若题目是 ADD R0, R1, R2(三地址,结果送第三寄存器),只是最后一拍目的改为 R2。
在图 5-2 数据通路上写出下列指令执行周期的微操作序列:(1) STORE R0, ADDR(直接寻址:M[ADDR] ← (R0));(2) JMP ADDR(直接寻址转移);(3) JZ ADDR(零标志 ZF = 1 才转移)。
查看答案
(1) STORE 执行周期(先给地址、再给数据、后写存):
C4: Ad(IR) → MAR, 1 → W C5: (R0) → MDR C6: (MDR) → M(MAR)
(2) JMP 直接寻址只要一拍:
C4: Ad(IR) → PC(下一取指周期即从 ADDR 开始)
(3) 条件转移需先测标志:
C4: 若 ZF = 1,则 Ad(IR) → PC;否则 PC 不变(顺序执行下一条)
注意对比:LOAD 用读命令 1→R,STORE 用写命令 1→W;转移类指令执行周期只动 PC,不访存取数据。
5.4 控制器的设计:硬布线与微程序 高频考点
微操作信号发生器(CU)有两种实现路线:硬布线(用组合逻辑电路直接产生控制信号,快但难改)与微程序(把控制信号编成微指令存入控存,慢但规整)。408 对二者均考概念与对比,微程序侧再加编码与容量计算。
5.4.1 硬布线控制器
| 对比项 | 硬布线控制器 | 微程序控制器 |
|---|---|---|
| 实现方式 | 组合逻辑电路(门电路)直接产生微操作命令 | 微指令存于控制存储器 CM,逐条读出产生微命令 |
| 速度 | 快(无需访控存) | 慢(每条机器指令需多次读控存) |
| 规整性 / 扩展性 | 电路庞杂,难修改、难扩展 | 规整,增改指令只需改微程序 |
| 应用 | RISC CPU、高速机器 | CISC CPU(x86 直到现在仍保留微程序层) |
5.4.2 微程序控制器:原理与组成
- 微命令(微操作控制信号):控制部件发出的最细粒度控制命令,如「MDR → 总线」「1 → R」,是执行部件动作的「开关」;
- 微指令:同一节拍(一个时钟周期)内可并行发出的一组微命令的编码,再加顺序控制信息;
- 微程序:解释一条机器指令的微指令序列;
- 控制存储器 CM:存放全部微程序的专用 ROM(在 CPU 内),其一个字就是一条微指令。
② 执行一条机器指令要多次读控存(每个节拍读一条微指令),所以微程序控制器的速度慢于硬布线;
③ 「微程序」与「机器语言程序」分属两级:程序员写机器指令序列,CPU 用微程序解释每条机器指令——微程序对程序员透明。
5.4.3 微指令的编码方式
- 直接编码(直接控制):操作控制字段中每一位就是一个微命令,1 表示发出。n 个微命令需 n 位——速度最快(无需译码),但字长过长;
- 字段直接编码:把微命令分成若干字段,互斥的微命令放在同一段(留一种状态表示「都不发出」),字段内经译码器产生微命令,各字段并行工作。字长缩短,速度略降,是最常用的折中;
- 字段间接编码:一个字段的微命令需由另一个字段(解释字段)参与解释才能确定——字长更短,速度更慢、更不直观;
- 混合编码:直接编码 + 字段编码混合使用,常用的微命令用直接位,其余分组。
② +1 别忘了:7 个互斥微命令要 \( \lceil\log_2 8\rceil=3 \) 位而不是 \( \lceil\log_2 7\rceil=3 \) 位恰好相同,但 8 个互斥微命令必须 4 位(\( 2^3=8 \) 个状态被 8 个命令占满,没有「都不发」了);
③ 直接编码不需要译码器,字段编码每字段后接一个译码器。
5.4.4 微地址形成方式与水平型/垂直型微指令
- 增量方式:由 CMAR(μPC)自动 +1 得到后继地址(与 PC 同理),遇转移时把转移微地址装入 CMAR——微指令中可省去「下地址」字段,但需微程序计数器,且分支能力弱;
- 断定方式(下址字段方式):每条微指令的顺序控制字段直接给出后继微地址,无需计数器,分支灵活——代价是每条微指令都要带下地址字段,字长增加;
- 测试网络(地址转移逻辑):后继地址由设计者指定的判别测试字段 P 和状态反馈(标志位、操作码)共同修改形成,用于条件分支微地址的多路选择。
| 对比项 | 水平型微指令 | 垂直型微指令 |
|---|---|---|
| 一条微指令定义 | 多个并行微命令 | 一个微操作(类似机器指令风格) |
| 微指令字长 | 长 | 短 |
| 并行能力 / 速度 | 强、快 | 弱、慢(只能串行) |
| 微程序长度 | 短 | 长 |
| 掌握难度 | 难以掌握(要了解数据通路细节) | 与机器指令相似,易掌握 |
5.4.5 微指令格式设计计算(大题重点)
某机采用字段直接编码的微程序控制器,共有微命令 26 个,划分为 4 个互斥组,各组分别含 8、7、6、5 个互斥微命令(组间可并行);判别测试字段 2 位;控制存储器共 128 个存储单元。求:(1) 操作控制字段位数;(2) 微指令字长;(3) 控存容量。
查看解答
(1) 逐组按 \( b=\lceil\log_2(m+1)\rceil \) 求位:
组 1(8 个命令):\( 8+1=9 \) 状态 → \( \lceil\log_2 9\rceil=4 \) 位
组 2(7 个命令):\( 7+1=8 \) 状态 → \( \lceil\log_2 8\rceil=3 \) 位
组 3(6 个命令):\( 6+1=7 \) 状态 → \( \lceil\log_2 7\rceil=3 \) 位
组 4(5 个命令):\( 5+1=6 \) 状态 → \( \lceil\log_2 6\rceil=3 \) 位
操作控制字段 \( =4+3+3+3=13 \) 位。
(2) 下地址字段:\( \lceil\log_2 128\rceil=7 \) 位(\( \checkmark \):\( 2^7=128 \));判别测试 2 位。微指令字长:
\[ 13+2+7=22\ \text{位} \](3) 控存容量:
\[ 128\times22=2816\ \text{bit}=352\ \text{B}\quad(\checkmark:\ 2816/8=352) \]验算 4 位 ≥ log₂9 ≈ 3.17 ✓、3 位 ≥ log₂8 = 3 ✓。套路总结:先分组求控制字段,下地址永远等于「控存单元数的地址位数」,容量 = 单元数 × 字长,单位写成 bit 再换 B。
下列关于微指令编码的说法中,正确的是( )
A. 字段直接编码中,同一字段内的微命令必须可以并行执行 B. 互斥的微命令应编排在同一字段内 C. 字段间接编码比字段直接编码速度更快 D. 直接编码方式字长最短
查看答案
B。逐项分析:
A 错:字段直接编码的分组原则是「同段互斥、异段可并行」,同一字段内的微命令互斥,不能同时发出;B 对:正是分组原则本身;
C 错:间接编码要经过解释字段的二次译码,更慢,但省位;D 错:直接编码每个微命令占一位,n 个命令就 n 位,字长最长(换来的是无需译码、速度最快)。
5.5 指令流水线 大题必考
5.5.1 五段流水线与时空图
IF 取指段 | 指令 ← M[PC],同时 PC 自动加"1"指向下一条指令
ID 译码段 | 指令译码,并从寄存器堆读出所需的源操作数
EX 执行段 | ALU 运算 / 计算访存有效地址 / 计算转移目标地址并判断分支条件
MEM 访存段 | LOAD:从主存读数;STORE:把数写回主存;其余指令空过
WB 写回段 | 运算结果或读出的数据写回寄存器堆
5.5.2 性能指标:总时间、吞吐率、加速比、效率
五段流水线,每段时间 Δt = 10 ns,连续执行 10 条无冒险的指令。求总时间、实际吞吐率(用 MIPS 表示)、加速比与效率。
查看解答
① 总时间(k = 5,n = 10):
\[ T=(5+10-1)\times10=140\ \text{ns}\quad(\checkmark) \]② 吞吐率:
\[ TP=\frac{10}{140\ \text{ns}}=\frac{10}{140\times10^{-9}\ \text{s}}\approx7.14\times10^{7}\ \text{条/s}=71.4\ \text{MIPS}\quad(\checkmark) \]③ 加速比(串行需 \(10\times5=50\) 拍):
\[ S=\frac{10\times5}{5+10-1}=\frac{50}{14}\approx3.57\quad(\checkmark) \]④ 效率:
\[ E=\frac{10}{14}\approx71.4\%\quad(\checkmark) \]验算:S = k × E = 5 × 0.714 = 3.57 ✓。套路总结:先代 T=(k+n−1)Δt,其余三个量全由 T 派生;S=kE 是最稳的交叉验证。
5.5.3 冒险(Hazard)与对策
- 结构冒险(硬件资源冲突):不同指令同一拍争用同一部件。典型:取指(IF)与取数(MEM)同时访存。对策:指令与数据分开放(哈佛结构 / 一体机中取指 Cache 与数据 Cache 分离,即「存储器一半放指令一半放数据」);或后一条指令暂停一拍。
- 数据冒险(数据相关):后续指令要用前面指令尚未写回的结果。按读写顺序分 RAW(读后写,真相关,按序流水中最常见)、WAR(写后读)、WAW(写后写)、RAR(无冲突)。对策:转发 / 旁路(forwarding:把 EX 段末的结果直接从流水线寄存器送往需要它的段,不等 WB)、暂停(插气泡 stall)、编译器调整指令顺序。
- 控制冒险(转移冒险):转移 / 分支指令要等判断结果出来才知道下条指令地址,已预取的指令可能作废。对策:分支预测(静态按「总是不转移」/ 动态按历史方向预测)、延迟分支(延迟槽里放一条无论转移与否都要执行的指令)、尽早判分支 / 暂停等判。
在例 6 的五段流水线(Δt = 10 ns)上执行 10 条指令,其中发生 2 次 load-use 冒险(各暂停 1 拍)、1 次转移预测失败(损失 3 拍),其余冒险均由转发消除。重求总时间、加速比与效率。
查看解答
① 总时间 = 理想时间 + 各类停顿:
\[ T=\big[(5+10-1)+2\times1+1\times3\big]\Delta t=19\Delta t=190\ \text{ns}\quad(\checkmark) \]② 加速比(串行仍为 \(10\times5=50\) 拍):
\[ S=\frac{50}{19}\approx2.63\quad(\checkmark) \]③ 效率:
\[ E=\frac{50}{5\times19}=\frac{10}{19}\approx52.6\%\quad(\checkmark) \]验算:S = k × E = 5 × 0.526 = 2.63 ✓。套路总结:含停顿的题只在 T 上加停顿拍数,分母里的「理想 50 拍」不变;停顿越密集,流水线越退向串行。
五段流水线(带完整转发通路)顺序执行下列指令:
I1: ADD R1, R2, R3 ; R1 ← (R2) + (R3)
I2: SUB R4, R1, R5 ; R4 ← (R1) − (R5)
I3: LOAD R6, 100(R7) ; R6 ← M[(R7)+100]
I4: OR R8, R6, R9 ; R8 ← (R6) OR (R9)
问:哪些相邻指令对存在 RAW 数据冒险?转发能否完全消除?全程共损失几拍?
查看解答
I2 与 I1 关于 R1 RAW:I1 在 EX 段末(第 3 拍)已算出 R1,I2 在第 4 拍才进 EX——结果在 EX/MEM 流水寄存器里等着,转发可完全消除,0 拍损失。
I4 与 I3 关于 R6 RAW 且是 load-use:I3 的 R6 在第 4 拍(MEM 段)末才读出,而 I4 在第 5 拍初的 EX 段就要用——此时数据尚未进入任何流水寄存器,转发路径接不上,必须先停 1 拍(I4 的 EX 推迟到第 6 拍),再由 MEM/WB 寄存器转发。
结论:共损失 1 拍。区分两类情况就是两句话:ALU 结果「早一拍」转发行;LOAD 结果「恰好晚一拍」停一拍再转发。
5.5.4 高级流水技术辨析
| 技术 | 思想 | 并行方式 | 关键特征 |
|---|---|---|---|
| 超标量 | 每个时钟周期发射多条指令到多条流水线 | 空间并行(多套部件) | 不能缩短单条指令时间;CPI 可小于 1;依赖编译优化 + 硬件调度 |
| 超流水线 | 把流水段分得更细(段数更多、每段更短) | 时间并行(提高主频) | Δt 更小、吞吐率更高;段多则冒险代价更大、功耗高 |
| 动态调度 | 硬件在运行时重排指令执行顺序(乱序执行、保留站 / 记分板) | 时间并行 | 不改变程序语义;让后续不相关指令先执行,填充分析停顿 |
| VLIW(超长指令字) | 编译器把多个可并行操作打包成一条超长指令 | 空间并行(静态打包) | 并行性由编译器静态挖掘,硬件简单;代码膨胀、依赖编译器 |
判断下列说法的正误:(1) 五段流水线把每条指令的执行时间缩短为原来的 1/5;(2) 超标量处理机一个时钟周期内可发射多条指令;(3) 超流水线通过细分流水段、缩短时钟周期来提高吞吐率;(4) VLIW 的并行调度由编译器静态完成;(5) 动态调度改变程序的语义。
查看答案
(1) 错:流水线提高的是吞吐率,单条指令仍要走完五段(5Δt,还可能更长);「缩短为 1/5」混淆了吞吐率与延迟。
(2) 对:超标量的定义即每拍发射多条,CPI 可低于 1。
(3) 对:段分细 → Δt 变短 → 主频与吞吐率上升。
(4) 对:VLIW 靠编译器把并行操作打包,与动态调度(硬件乱序)相对。
(5) 错:乱序执行只改变执行顺序,数据相关与控制相关仍被保证,程序结果(语义)不变。
5.6 章末自测 真题风格
限时 50 分钟,先做后看答案。难度:★★ 基础 / ★★★ 强化 / ★★★★ 冲刺。计算题全部要求代入具体数值逐步演算并用第二种方式验算。
下列部件中,不属于运算器组成的是( )
A. 算术逻辑单元 ALU B. 累加寄存器 ACC C. 程序状态字寄存器 PSW D. 指令译码器 ID
查看答案
D。译码器属控制器(对操作码译码);ALU、ACC、PSW(条件码由运算产生)均属运算器。
对汇编语言程序员完全透明(不可见)的寄存器组是( )
A. 通用寄存器、变址寄存器 B. MAR、MDR、IR C. PSW 标志位、栈指针 SP D. 基址寄存器、条件码寄存器
查看答案
B。MAR / MDR / IR 都是硬件幕后中转站,指令无法点名访问;A、C、D 中所列寄存器都能被指令直接或间接使用(传送、寻址、条件转移),对程序员可见。
取指周期结束后,下列说法正确的是( )
A. 指令存放在 PC 中 B. PC 已自动加 1,指向下一条指令 C. 操作码已完成译码并算出有效地址 D. 指令的执行结果已存放于 ACC
查看答案
B。A 错:指令在 IR,PC 只存地址;C 错:译码在其后一拍或与取指末拍重叠,「算出有效地址」属执行周期;D 错:执行还没开始。取指周期唯一确定发生的两件事:指令进 IR、PC 加 1。
单总线数据通路中设置暂存器 Y、Z 的根本原因是( )
A. 增大通用寄存器容量 B. ALU 是组合逻辑且总线每拍只能传一个数据 C. 提高主存的读写速度 D. 保存中断断点
查看答案
B。两个操作数不能同拍上总线 → 先送 Y;ALU 输出不能直接回总线(组合逻辑、会与输入构成回路)→ 先落 Z。与 A、C、D 均无关。
某机微指令采用字段直接编码,共 18 个微命令,分为 3 组,各组互斥微命令数均为 6;判别测试字段 2 位;控制存储器共 512 个单元。则操作控制字段为 \(\underline{\hspace{1cm}}\) 位,微指令字长 \(\underline{\hspace{1cm}}\) 位,控存容量 \(\underline{\hspace{1cm}}\) bit。
查看答案
每组 \(6+1=7\) 状态 → \( \lceil\log_2 7\rceil=3 \) 位,控制字段 \(3\times3=9\) 位;
下地址 \(=\lceil\log_2 512\rceil=9\) 位(\(\checkmark\):\(2^9=512\));字长:
\[ 9+2+9=20\ \text{位} \]控存容量 \(=512\times20=10240\) bit(\(\checkmark\):\(512\times20=2^9\times20=10240\),即 1280 B)。
与硬布线控制器相比,微程序控制器的特点是( )
A. 速度更快,且易于扩展指令 B. 速度较慢,但设计规整、易于扩展指令 C. 控制存储器位于 CPU 之外,可用 RAM 改写 D. 每条机器指令只读一次控存
查看答案
B。微程序靠逐条读控存产生微命令,速度慢于门电路,但「改 ROM 里的微程序」即可增改指令,规整灵活。C 错:控存是 CPU 内的 ROM;D 错:每个节拍读一条微指令,一条机器指令要多次读控存。
五段流水线每段 Δt = 2 ns,连续执行 20 条无停顿指令。总时间为 \(\underline{\hspace{1cm}}\) ns,加速比约为 \(\underline{\hspace{1cm}}\),效率约为 \(\underline{\hspace{1cm}}\)。
查看答案
\[ T=(5+20-1)\times2=48\ \text{ns}\quad(\checkmark) \]
\[ S=\frac{20\times5}{24}=\frac{100}{24}\approx4.17\quad(\checkmark) \]
\[ E=\frac{20}{24}\approx83.3\%\quad(\checkmark) \]
验算:S = k × E = 5 × 0.833 ≈ 4.17 ✓。
五段流水线 Δt = 1 ns,执行 10 条指令,其中 3 次 load-use 冒险各停 1 拍,其余相关全部由转发消除。求总时间(ns)、实际吞吐率(MIPS)与效率。
查看答案
\[ T=\big[(5+10-1)+3\big]\times1=17\ \text{ns}\quad(\checkmark) \]
\[ TP=\frac{10}{17\ \text{ns}}=\frac{10}{17\times10^{-9}}\approx5.88\times10^{8}\ \text{条/s}=588\ \text{MIPS}\quad(\checkmark) \]
\[ E=\frac{10\times5}{5\times17}=\frac{10}{17}\approx58.8\%\quad(\checkmark) \]
下列数据冒险中,仅靠转发(旁路)技术无法完全消除、必须配合暂停的是( )
A. 相邻两条 ALU 运算指令的 RAW 相关 B. LOAD 指令之后紧跟一条立即使用其装入数据的指令 C. 相隔两条指令的 RAW 相关 D. 两条指令读同一寄存器的 RAR 相关
查看答案
B。load-use:数据在 MEM 段末才可用,与需求时刻差一拍,转发路径覆盖不到,必须停 1 拍后再转发。A、C 的 ALU 结果可从 EX/MEM、MEM/WB 流水寄存器转发(0 拍);D 读读不冲突,无冒险。
分别举一例说明结构冒险、数据冒险、控制冒险,并各给出两种对策;再说明为什么「指令 Cache 与数据 Cache 分离」能消除结构冒险,而「转发」却消除不了 load-use 冒险。
查看解答
① 结构冒险:第 i 条指令 MEM 段访存取数与第 i+1 条指令 IF 段取指同拍争用同一个主存。对策:指令与数据分开存储(分体 Cache);争用方暂停一拍。
② 数据冒险:ADD R1,R2,R3 后紧跟 SUB R4,R1,R5(RAW)。对策:EX/MEM、MEM/WB 转发;编译器调度指令顺序(拉开距离);必要时暂停。
③ 控制冒险:BEQ 分支指令在 EX/ID 段才判出方向,已取入的错误路径指令作废。对策:静态 / 动态分支预测;延迟分支;尽早计算转移目标地址。
原理辨析:结构冒险是空间资源冲突——再加一套资源(指令 / 数据 Cache 分离)即可根除;而 load-use 是时间缺口——数据 MEM 段末才从主存到达,比需求时刻晚一拍,转发只能搬运「已存在的结果」,不能让主存提前读出,故必须停一拍等待。
5.7 本章考点总结
| 考点 | 常考题型 | 热度 | 核心方法 |
|---|---|---|---|
| CPU 功能与寄存器 | 选择题 | ★★★★ 高频 | 五项功能;运算器 = ALU + 通用寄存器 + Y/Z + PSW;控制器 = PC + IR + ID + 时序 + CU;能被指令点名 = 可见,幕后中转(MAR / MDR / IR / Y / Z)= 不可见 |
| 三级时序与四周期 | 选择 / 判断 | ★★★★ | 指令周期 ⊇ 机器周期 ⊇ 时钟周期(=1/主频);取指、间址、执行、中断按需出现;中断周期三件事(关中断、存断点、引出服务程序)由中断隐指令完成 |
| 微操作序列 | 大题 | ★★★★★ 必考 | 单总线每拍只一个发送者;运算走「送 Y → 算入 Z → 送目的」三拍;LOAD 用 1→R,STORE 用 1→W;间接寻址多一轮读地址;转移只改 PC |
| 硬布线 vs 微程序 | 选择 / 简答 | ★★★★ | 硬布线 = 门电路,快、难改(RISC);微程序 = 控存 ROM(CPU 内)存微指令,规整、易扩展、慢;微命令→微指令→微程序→控存四级链 |
| 微指令编码与格式设计 | 大题 | ★★★★★ 必考 | 互斥微命令放同段,段位 \( \lceil\log_2(m+1)\rceil \);字长 = 控制字段 + 判别测试 + 下地址(\( \lceil\log_2 \text{控存字数} \rceil \));容量 = 字数 × 字长 |
| 流水线性能计算 | 选择 / 大题 | ★★★★★ 必考 | \( T=(k+n-1)\Delta t \);TP、S、E 全由 T 派生;S = k × E 验算;含停顿时 T 加停顿拍数、串行拍数不变 |
| 冒险与对策 | 选择 / 分析 | ★★★★★ 高频 | 结构冒险→资源分体;数据 RAW→转发 / 暂停 / 调度;load-use 必停一拍再转发;控制冒险→分支预测 / 延迟分支 |
| 高级流水辨析 | 选择题 | ★★★ | 超标量一拍多发(CPI<1)、超流水段更细提主频、动态调度硬件乱序、VLIW 编译器打包;都提吞吐不降单条延迟 |