中央处理器
考点定位
- 大纲章节:CPU 的功能和基本结构、指令执行过程、数据通路的功能和基本结构、控制器的功能和工作原理(硬布线/微程序)、指令流水线(含流水线冒险与对策、超标量与动态调度概念、多发射/超长指令字/多线程)
- 常见题型:微操作序列书写(大题,配控制信号)、微指令编码字段设计与位数计算(选择/大题)、流水线时空图绘制与加速比/吞吐率计算(大题高频)、冒险类型判断与对策(选择)、寄存器可见性分类(选择)、硬布线与微程序对比(选择)
- 考查频率:高(408 计组分值最重的一章,近十年几乎每年都有本章大题:流水线计算与微操作/微指令设计轮流出大题,选择题年年覆盖)
- 前置知识:指令格式与寻址方式见指令系统;MAR/MDR 与主存读写时序见存储器层次结构;ALU 与补码运算见数据的表示和运算
- 工程师读者注意:你天天接触的"乱序执行、分支预测"是工程语境,考试考的是教材口径的时空图计数、微命令层级定义、冒险三分类的准确定义——特别是"转发不能消除 load-use 停顿""字段直接编码要留全 0 状态"这类细粒度口径,按本节作答
- 本章测验:CPU与指令流水线-章节测
一、CPU 的功能与基本结构
1.1 功能总览
CPU = 运算器 + 控制器 + 若干寄存器 + 内部总线/数据通路 + 中断系统。功能四条:
- 指令控制:控制指令的执行顺序(取指、PC 自增、转移)
- 操作控制:产生每条指令所需的微命令(控制信号)序列
- 时间控制:按节拍有序发出微命令(时序发生器)
- 数据加工:算术/逻辑运算(ALU)
外加中断处理:响应并处理异常与中断请求。
1.2 运算器的组成
运算器(ALU 部件)完成数据加工,典型组成:
1.3 控制器的组成
控制器是"指挥部":取指令、分析指令、执行指令(发微命令)、控制程序输入/输出及异常处理。典型组成:
按实现方式分硬布线控制器与微程序控制器(见本章第四节,是考试重心)。
1.4 寄存器分类(用户可见性——选择题高频)
记忆口诀:"通用地变栈标可见,P I 两 M μ 不可见"(PC、IR、MAR、MDR、μIR 对用户透明)。
二、指令执行过程
2.1 指令周期 → 机器周期 → 时钟周期
三层包含关系(自顶向下逐级细分):
- 指令周期:取出并执行完一条指令的全部时间。
- 机器周期:完成一个基本操作(读/写一次主存等)的时间,常以存取周期为基准,含若干节拍。
- 时钟周期(节拍):最小时间单位,一个时钟脉冲控制一拍。
一条指令的指令周期由若干机器周期组成。408 教材口径把机器周期细分为四类:
2.2 取指周期完整推演(微操作 + 控制信号,大题模板)
设单总线结构 CPU(内部总线连接各寄存器),取指周期每拍微操作与控制信号(微命令)如下。这张表是微操作序列大题的"标准开头",必须能默写:
要点:PC 自增在取指周期内完成(工程直觉里"执行完才加"是错的);若指令字长与存储字长不等、或按字节编址取多字节指令, 的 是指令字长(字节数)。
2.3 间址周期微操作(间接寻址指令专用)
任务:把形式地址 A 变换为有效地址 EA(或直接取得操作数)。以一次间址为例:
N 重间址就重复 N 次间址周期,最后一步取出的是操作数本身(留在 MDR 供执行周期使用)。
2.4 中断周期微操作(响应中断的硬件动作)
触发条件:执行周期结束时检测到有中断请求且允许中断(开中断)。任务:保存断点、转向服务程序。采用堆栈保存断点的典型微操作序列:
随后回到取指周期,执行中断服务程序的第一条指令。注意:执行中断服务程序是软件的事,中断周期只做上述硬件动作——选择题常在这里设错。
2.5 四类周期的数据流小结
三、数据通路的功能与基本结构
3.1 功能与组成
数据通路:数据在 CPU 功能部件之间传送的路径。由 ALU、通用寄存器、暂存器、内部总线、MAR/MDR(到主存的接口)以及各部件入口/出口的控制门(门控电路)组成。控制器发出的微命令(如 PCout、MARin)控制这些门的开/闭,从而决定数据"从哪来、到哪去"。
数据通路的基本结构有两类:
- CPU 内部总线方式(单总线/多总线):结构简单、灵活,但总线是独占资源,需要暂存器配合;速度受总线争用限制。
- 专用数据通路方式:根据指令需求为高频数据流向专门布线(多总线/直达线),无争用、速度快,但结构复杂、硬件多——RISC 流水线 CPU 的选择。
3.2 单总线结构:寄存器间传送如何实现
关键约束(选择题反复考):
- 同一时刻内部总线上只能有一个部件发送数据(多个 out 不能同拍打开);但可以有多个接收方(多个 in 同时有效)。
- ALU 是组合逻辑电路,输入端必须保持稳定才能得到正确输出,且输出不能直接挂回总线形成环——所以一端接暂存器 Y(锁存总线来的操作数),输出经暂存器 Z 再回总线。
- 单总线结构中,一个操作数来自 Y(上一拍锁存),另一个来自总线,所以两个寄存器相加至少要 3 拍。
3.3 典型传送的微操作序列(大题标准写法)
例 1:寄存器间传送
例 2:寄存器加法
注意 T1 拍 R2out 打开时 Y 闭锁保持 R1 的值,ALU 两输入端 与总线(R2)稳定,结果锁入 Z——这就是"暂存器存在的理由"。
例 3:从主存取数 间接寻址加法 ADD R0,(R1)(取指 + 执行全序列)
例 4:写主存(存数)指令 STA addr,(ACC) 写入直接地址 addr 单元
写法口诀:"源 out、目的 in,经过总线一拍一传送;ALU 进出靠 Y、Z;访存必经 MAR/MDR"。
3.3 多总线结构与专用通路
考试大多以单总线为背景(微操作序列大题);流水线一节默认专用通路(否则一拍一个阶段做不到)。
四、控制器:硬布线与微程序
4.1 控制器的功能与两类实现
控制单元 CU 的输入:操作码译码信号、时序信号(节拍/机器周期)、状态反馈(FLAGS、中断请求);输出:微命令(控制信号)序列。产生微命令序列的方式有两类:
- 组合逻辑(硬布线)控制器:用组合逻辑电路直接由输入"算出"微命令。速度快,但设计/修改困难,指令功能扩展要改电路——适合 RISC。
- 微程序控制器:把每条指令的微命令序列编成微程序存入控制存储器(ROM),执行指令 = 执行对应微程序。规整、易扩展(改 ROM 内容即可),但每条微指令都要访问控存,速度慢——适合 CISC。
4.2 微程序控制器的层级定义(名词链条,选择高频)
执行机器指令的流程:公共取指微程序取出指令 → 操作码经微地址形成部件(映射机构)产生该指令微程序的入口地址 → 逐条执行微指令 → 结束后回到取指微程序。
4.3 微指令的编码方式(位数计算——计算大题高频)
操作控制字段的三种编码方式:
(1)直接编码(直接控制)方式:每一位对应一个微命令,"1"发出、"0"不发出,无需译码。
优点:速度快、并行能力强(各位独立);缺点:字长太长(几十个微命令就要几十位)。
(2)字段直接编码方式:把互斥的微命令分成一组(一个字段),字段内的编码经译码器产生微命令;相容(可并行)的微命令必须分在不同字段。每个字段要留一个编码(通常 000)表示"该字段不发出任何微命令":
优点:显著缩短字长;缺点:要经过译码器,速度略慢;微命令分组需人工分析互斥性。
(3)字段间接编码方式:某字段译码后的含义还要由另一字段的编码参与解释(字段间联动)。可进一步压缩字长,但削弱了并行性、译码更复杂,通常作为字段直接编码的补充。
高频陷阱:字段 3 位 ≠ 能编码 8 个微命令,留全 0 状态后只有 个。
4.4 微地址(后继微指令地址)的形成方式
此外还有两类"入口/特殊地址"来源:由机器指令操作码映射(经微地址形成部件产生微程序入口,也称"功能转移")和由硬件直接产生(如中断向量地址、复位后取指微程序首地址)。断定方式中,判别测试字段 指明要不要测试外部状态(如 FLAGS、中断请求),不测试则直接取下址字段。
4.5 水平型与垂直型微指令
字段直接/间接编码都是水平型微指令采用的压缩手段;水平型 ≠ 字段直接编码(水平型也可全直接编码)。混合型微指令介于两者之间。常考判断:"水平型微指令的并行操作能力比垂直型强"——对;"垂直型微指令就是字段间接编码"——错。
4.6 硬布线与微程序控制器对比
记忆锚点:"硬布线快而难改(RISC),微程序慢而易改(CISC)"。
五、指令流水线
5.1 流水线的基本思想与分类
流水线 = 把重复性任务分解为若干子过程,各子过程用独立部件并行处理重叠的不同对象——时间并行(与"资源重复"的空间并行相对)。按级别分:指令流水线(部件级→处理机级)、算术流水线(部件级)、处理机级/处理机间流水线(宏流水)。
流水线有效工作的条件(选择考点):
- 各段耗时尽量相等(否则最慢段成为瓶颈,时钟周期取最长段时间);
- 只有连续不断的同类任务流入才能发挥效益(断流即损失);
- 需要专门的流水寄存器/锁存器隔离各段(各段并行工作在不同指令上)。
5.2 五段流水线结构(MIPS 风格,408 标准模型)
设计要点(后面算冒险的根据):寄存器堆采用同一拍"前半周期写、后半周期读"(WB 与依赖它的 ID 可同拍);指令存储器与数据存储器分体(或分 I-Cache/D-Cache),否则取指与取数冲突。
5.3 时空图(大题必考,表格化)
可单步逐拍点亮、切换冒险模式的交互动画见交互演示页"指令流水线时空图"。以下为 8 条指令、5 段、无冒险的理想时空图(行 = 指令,列 = 时钟周期):
填满期(第 5 拍起)每拍流出一条指令;总时间 ( 段、 条: 拍)。
5.4 性能指标:吞吐率、加速比、效率(公式 + 例题)
设流水线分 段、每段时间 (不等长时 取最长段)、连续处理 条指令、额外停顿 拍:
三个必须内化的结论:加速比上限是段数 ( 不大时远达不到);停顿 直接进分母; 由瓶颈段决定(某段 2 拍其他 1 拍,时钟周期不变但该段占 2 格)。
例题 1(模拟题) 五段流水线,时钟周期 1 ns,执行 12 条指令,其中 2 次 load-use 冒险各停 1 拍,其余无冒险。求总时间、加速比、实际吞吐率。
解: ns;; 条/ns。错因提醒:漏加停顿 2 拍(算成 16 拍)是最常见失误。
例题 2(模拟题) 某流水线 5 段,各段时间为 10、8、10、12、6 ns。时钟周期取多少?执行 100 条指令的总时间?
解:瓶颈段 12 ns → ns。总时间 ns。若被问"该流水线可再细分瓶颈段为两段各 6 ns",时钟周期变为 10 ns——改造题的套路。
5.5 流水线冒险三类:定义与对策(选择大题双高频)
(1)结构冒险(资源冲突)
定义:多条指令同拍争用同一硬件资源(同一存储器、同一功能部件)。 典型:第 条在 MEM 段取操作数、第 条同拍在 IF 段取指令,二者争同一主存。 对策:① 资源重复——指令存储器与数据存储器分体(I-Cache/D-Cache 分离,这是哈佛结构的由来);② 让后者暂停一拍(气泡);③ 预取指令队列缓冲。
(2)数据冒险(数据相关)
定义:后一条指令需要的操作数要等前一条指令产生——流水线重叠使"写"还没发生"读"就要发生。三种相关:RAW(写后读,最主要)、WAR(读后写)、WAW(写后写);按序单发射五段流水线只可能发生 RAW。
典型:add $t0,$t1,$t2 之后紧跟 sub $t4,$t0,$t3($t0 还没写回,sub 就要读)。
对策:
- 暂停/插入气泡(stall):硬件检测到依赖,让后续指令在 ID 段等待,重复该拍。通用但损失性能。
- 转发/旁路(forwarding / bypass):把 EX 段 ALU 的输出(或 MEM 段的数据)经专用通路直接送到后续指令 EX 段的 ALU 输入端,不等 WB 写回寄存器堆。能消除大多数 RAW 停顿。
- load-use 冒险必然残留 1 拍:lw 的数据在 MEM 段末才有,紧随其后的指令 EX 段在 MEM 段前一拍就要用——转发也救不了,必须停 1 拍(MEM→EX 转发只能延后一拍)。
- 编译器调度(软件):把无关指令插到依赖指令之间,填充气泡。
例题 3(模拟题) 五段流水线(寄存器堆同拍先写后读),序列:lw $t0,0($s1);add $t2,$t0,$t1。分别求无转发、有转发时的停顿拍数。
解:无转发时 add 的 ID 段最早与 lw 的 WB 同拍(第 5 拍),比正常(第 3 拍)晚 2 拍 → 停 2 拍;有转发(MEM→EX)时 add 的 EX 延至 lw 的 MEM 下一拍 → 停 1 拍。错因提醒:以为"有转发就零停顿"——load-use 至少 1 拍,这是选择题最爱。
(3)控制冒险(转移冲突)
定义:转移/分支指令(以及中断、异常)改变执行顺序,而在分支方向确定前,后续指令地址未知,流水线已预取的指令可能作废。 对策:
- 尽早判定分支:把比较与目标地址计算从 EX 提前到 ID 段(增加专用比较器),预测错误代价从 2 拍降为 1 拍。
- 分支预测:静态(编译期固定:总是预测不转移/按循环回边预测转移/ opcode 位)与动态(硬件记录历史:2 位饱和计数器、分支目标缓冲器 BTB 缓存目标地址)。预测对则零代价,错则冲刷流水线。
- 延迟转移(延迟槽):编译器把一条与分支无关的指令填到分支指令后的"延迟槽"中,无论分支是否转移它都照常执行(RISC 经典)。
- 预取两个方向的指令(分支目标与顺序后继各存一份),判定后弃其一。
5.6 超标量与动态调度(概念题)
超标量(superscalar):CPU 内置多条并行流水线/多套功能部件,每个时钟周期发射多条指令(发射度 2、4……)。静态超标量靠编译器排序,动态超标量靠硬件(指令窗口)乱序取多条。CPI < 1,但不改变串行语义——数据冒险仍需转发/暂停,只是并行摊薄。与超流水对比:超标量是空间并行(资源重复),超流水是时间并行(段更细分、主频更高)。
动态调度:硬件在运行时重排指令执行顺序以消除停顿(乱序执行、按序完成)。经典方案:记分牌(Scoreboard)算法、Tomasulo 算法(保留站 + 寄存器换名,缓解 WAR/WAW)。相关硬件还包括重排序缓冲 ROB 支持精确异常。本考点只考概念,不考算法细节。
六、高级技术简要(大纲:了解)
辨析一句话:超标量/VLIW 提高单线程指令级并行;多线程挖掘线程级并行,用无关线程的指令填充流水线气泡(掩盖 Cache 缺失等长停顿)。
例题
例题 4(模拟题) 单总线 CPU(含 Y、Z 暂存器),写出指令 SUB R2, R3()取指与执行阶段的完整微操作及控制信号序列。
解:取指 4 步同 2.2 节表(PCout/MARin → Read/MDRin → MDRout/IRin → PC+1);执行 3 步:T4:R2out、Yin();T5:R3out、Sub、Zin();T6:Zout、R2in()。共 7 拍。错因提醒:把两个源操作数同拍送总线(R2out、R3out 同时有效)违反单总线约束。
例题 5(模拟题) 某机共 20 个微命令,分为 4 个互斥组(各组 4、5、7、4 个),采用字段直接编码;判别测试字段 2 位;控存容量 512 条微指令。求微指令字长。
解:操作控制字段 = 位;下址字段 = 位;总字长 位。错因提醒:字段 7 个微命令只写 取 3 位是碰巧对,规范算法必须"+1 留空状态";若不留(每字段都必发一个微命令)才能用 ——题目没说明时按留全 0 处理。
例题 6(模拟题) 五段流水线执行下列 6 条指令:I1 为 lw,I2 为 add 且与 I1 构成 load-use 冒险(有转发),I3、I4、I5 与前无关,I6 为无条件转移 jmp(目标在 ID 段末确定并冲刷后续预取)。画出时空图并求总时间与实际加速比。
解:load-use 有转发停 1 拍——I2 的 ID 重复一拍,其后指令逐级顺延一拍。时空图(行 = 指令,列 = 时钟,停顿逐拍推演可单步观察,见交互演示页"指令流水线时空图";"IF×"表示该拍指令滞留在 IF 等待):
I6 的 ID 在第 8 拍末确定转移目标。大题务必先声明口径再计算(评卷按声明的口径给步骤分):
- 口径 A(I6 在 ID 段末即完成转移动作、其后无操作):6 条指令总时间 拍,;
- 口径 B(把目标指令也算入并算到其 WB 完成):共 7 条、总时间 拍,。
错因提醒:① 画时空图时停顿会向后传染——I2 停一拍,I3~I6 全部顺延一拍(不是只有 I2 受影响);② 转移指令的目标要重新从 IF 开始走完整流水线,不能"接在 I6 后面继续排"。
例题 7(模拟题) 微程序控制器中,机器指令的操作码如何变成微程序入口地址?
解:取指微程序取出指令后,IR 中的操作码经微地址形成部件(映射机构)做"操作码 → 控存地址"的变换(如操作码左移/拼接常数前缀),得到该指令微程序在控存中的入口地址送 μAR;随后按增量或断定方式执行后续微指令,执行完回到取指微程序入口(固定地址,硬件产生)。错因提醒:"操作码本身就是控存地址"通常不成立,除非设计成一一映射——考试说"经微地址形成部件(映射)产生"最稳。
常见坑
- PC 自增发生在取指周期内,不在执行周期;取指结束 PC 已指向下一条指令。
- 间址周期不是每条指令都有;一次间址一个间址周期,N 重间址 N 个。执行周期才是每条指令必有。
- 中断周期只做硬件动作(存断点、关中断、送向量地址),执行服务程序不属于中断周期。
- 单总线同一时刻只能一个部件发送(一个 out),但可以多个接收(多个 in 同拍有效)。
- ALU 是组合逻辑、不能保持数据:两个寄存器相加必须借 Y、Z,单总线结构至少 3 拍;"R1out、R2out 同拍"是错误序列。
- 微命令是"控制信号"(因),微操作是"执行的动作"(果);相容微命令可同拍并行,互斥微命令不能放同一字段(字段直接编码按互斥性分组)。
- 字段直接编码每字段留一个全 0 状态: 位字段最多 个微命令;直接编码才是"位数 = 微命令数"。
- 水平型微指令:字长长、并行强、微程序短、速度快;垂直型相反——"水平型字长短"是高频错误选项。
- 断定方式靠下址字段直接给后继微地址(微指令字长变长);增量方式靠 (字短,转移要专门微指令)。
- 加速比公式分母含停顿 :;时钟周期由最长段决定,不是平均值。
- 转发不能消除 load-use:至少停 1 拍;无转发 load-use(同拍先写后读假设下)停 2 拍。数值取决于假设,做题先声明"寄存器堆同拍前半写后半读"是否成立。
- 三类冒险对策不要张冠李戴:结构冒险→资源重复/暂停;数据冒险→转发/暂停/调度;控制冒险→预测/延迟槽/提前判定。
- 超标量与超流水的方向:超标量空间并行(每拍多发射)、超流水时间并行(更细分段提主频);VLIW 的调度者是编译器不是硬件。
- WAR/WAW 在按序五段流水线中不会发生,动态调度(乱序)才引入;说"五段流水线可能发生 WAW"是错的。
- 每条机器指令对应一段微程序,但取指微程序是公用的,不重复存放——算控存容量别重复计。
自测
- 单总线结构(含 Y、Z)中,完成
AND R1, R2()执行阶段需要几拍?写出每拍微操作与控制信号。 - 某机 25 个微命令分 5 个互斥组(5、6、7、3、4 个),字段直接编码;判别字段 1 位,控存 1024 条微指令。微指令字长多少位?
- 列出中断周期必须完成的 3 件硬件任务。
- 六段流水线执行 20 条指令,时钟周期 2 ns,其中 3 次冒险各停 1 拍。求总时间、加速比与实际吞吐率。
- 判断并改错:a) 垂直型微指令并行能力比水平型强;b) 字段间接编码中某字段的含义需另一字段参与解释;c) 分支预测属于数据冒险对策。
自测答案与简析
- 3 拍:T0:(R1)→Y,R1out、Yin;T1:(Y)∧(R2)→Z,R2out、And、Zin;T2:(Z)→R1,Zout、R1in。与加法结构完全一致,只换 And 微命令。
- 位操作控制字段(5→3、6→3、7→3、3→2、4→3,均"+1 留空"),下址 位,判别 1 位,共 位。
- 保存断点(PC 压栈或存指定单元)、关中断(EINT)、向量地址送 PC(转向服务程序入口)。
- ns;; 条/ns。
- a) 错,水平型并行能力强(垂直型一条微指令只做一个基本操作);b) 对;c) 错,分支预测是控制冒险对策(数据冒险是转发/暂停/调度)。