指令周期
5.1 摆出了参与执行的所有部件。这一节回答:这些部件按什么节奏动起来。
“周期”这个词在本节出现三次,指三个不同量级的时间。它们之间的关系不是固定倍数——这是本节第一个也是最容易踩的坑。第二个坑是四个阶段的必选性:只有两个阶段是每条指令都有的,另外两个是条件触发的。
机制
三个时间层次
| 层次 | 定义 | 由什么决定 |
|---|---|---|
| 时钟周期(节拍、T 周期) | 最小时间单位,一个时钟脉冲的间隔 | 主频的倒数: |
| 机器周期(CPU 周期) | 完成一个基本操作所需的时间 | 通常以访问一次主存的时间为基准 |
| 指令周期 | 取出并执行一条完整指令的全部时间 | 该指令要经历几个机器周期 |
三层的包含关系是确定的,但倍数不是。
- 一个机器周期含几个时钟周期? 不固定。取决于这个基本操作要几拍才能做完。
- 一个指令周期含几个机器周期? 更不固定。空操作指令可能只要一个取指周期,带间接寻址的乘法指令可能要四五个。
“不定长”是这一节的核心事实,而不是例外。 不同指令的指令周期不等长,同一条指令在不同寻址方式下也不等长——这正是 5.2.3 里”单周期方案为什么浪费”的全部原因。
四个阶段与四个触发器
一条指令的执行最多经过四个阶段。CPU 用四个标志触发器记住自己当前在哪个阶段——这四个触发器就是控制器状态机的状态变量,5.4 讲硬布线控制器时会直接用到。
| 阶段 | 触发器 | 干什么 | 什么时候有 |
|---|---|---|---|
| 取指周期 | FE | 按 PC 取出指令送 IR,PC 自增 | 每条指令必有 |
| 间址周期 | IND | 按形式地址再访存一次,取出操作数的地址 | 仅当寻址方式是间接寻址 |
| 执行周期 | EX | 取操作数、运算、送结果 | 每条指令必有 |
| 中断周期 | INT | 保存断点、关中断、转中断服务程序入口 | 仅当有中断请求且允许响应 |
流程图:
flowchart LR FE["取指周期 FE<br/>PC → MAR → 主存<br/>指令 → MDR → IR<br/>PC 自增"] Q1{"寻址方式<br/>是间接?"} IND["间址周期 IND<br/>形式地址 → MAR<br/>有效地址 → MDR"] EX["执行周期 EX<br/>取操作数 → 运算 → 送结果"] Q2{"有中断请求<br/>且允许响应?"} INT["中断周期 INT<br/>保存断点、关中断<br/>入口地址 → PC"] FE --> Q1 Q1 -->|是| IND Q1 -->|否| EX IND --> EX EX --> Q2 Q2 -->|是| INT Q2 -->|否| FE INT --> FE classDef must fill:#dbeafe,stroke:#2563eb,stroke-width:2px classDef cond fill:#fef3c7,stroke:#d97706,stroke-width:2px classDef judge fill:#f3f4f6,stroke:#6b7280 class FE,EX must class IND,INT cond class Q1,Q2 judge
三处必须看清楚的细节:
- 中断的检测点在执行周期结束之后,不在指令中间。这就是 5.1.3 说的”切换只发生在指令边界”的硬件来源,也是操作系统上下文切换只需保存 ISA 状态的原因。
- 中断周期是本条指令周期的一部分,不属于下一条。教材把它画在这条指令的尾巴上,所以”一个指令周期可能包含中断周期”这句话是对的。
- 间址周期只有一次。 多重间接寻址(间接的间接)在 408 范围内不考,题目若出现”两次间址”必然会明说。
取指周期是唯一”内容确定”的阶段
四个阶段里,取指周期的动作与具体是哪条指令无关——机器还不知道这是什么指令,它只能按 PC 取回来看看。所以取指周期的微操作序列是固定的:
(1) PC → MAR 把地址送出去
(2) M(MAR) → MDR 读主存
(3) MDR → IR 指令进 IR
(4) PC + "1" → PC PC 自增
(5) OP(IR) → ID 操作码送译码器
第 (4) 步和第 (2) 步可以并行——PC 自增走的是专门的加法通路(或 ALU 的 inc 功能),不占用 MDR 那条访存通路。这类”哪些微操作能塞进同一拍”的判断是 5.3.4 排拍题的核心。
其余三个阶段的动作都依赖操作码:执行周期做什么完全看指令类型(4.1.5 那张表),间址周期有没有看寻址方式(4.2.2)。
这就是取指与执行的不对称,它是 5.6 流水线能成立的原因之一:取指段的工作永远一样,所以可以做成固定的一段。
机器周期的长度怎么定
教材说”通常以访问一次主存的时间为基准”。这句话的分量在于:它把机器周期的长度锚定在最慢的那个操作上。
访存是 CPU 内部一切操作里最慢的(3.1.2 的速度差距)。若把机器周期定成访存时间,那些不访存的操作(寄存器间传送、ALU 运算)在这一拍里就有大量空闲——这是浪费,但换来了控制的简单:所有机器周期一样长,时序系统只要一个固定的节拍发生器。
“用统一的慢节拍换控制简单”这个取舍会在 5.2.3 再出现一次(单周期方案),在 5.6.2 第三次出现(流水线的段时间取最长段)。三处是同一个道理:只要要求整齐,就得按最慢的那个来。
边界
层次辨析:时钟周期 / 机器周期 / 指令周期
包含关系确定,倍数不确定:
- 一个机器周期含若干个时钟周期(可以是 1 个)
- 一个指令周期含若干个机器周期(至少 1 个)
常见错误说法:「一个指令周期等于四个机器周期」——错,取决于指令;「机器周期就是时钟周期」——只在特定设计下成立,不能当通则。
边界辨析:必有阶段 / 条件阶段
- 必有:取指周期、执行周期
- 条件:间址周期(看寻址方式)、中断周期(看有无请求)
题目问”任何指令的指令周期都包含”,答取指周期和执行周期。“中断周期”是最常见的误选项。
边界辨析:中断的"检测" / "响应"
- 检测:每条指令执行周期结束时查一次中断请求线——这是硬件自动做的,不占独立周期
- 响应:确认要响应后,进入中断周期执行中断隐指令
检测每条指令都做,响应只在有请求时才做。详见 5.5.3。
对照速查
| 说法 | 判断 | 理由 |
|---|---|---|
| 指令周期是取指令和执行指令的全部时间 | ✅ | 定义 |
| 所有指令的指令周期都相同 | ❌ | 指令类型、寻址方式都会改变周期数 |
| 一个指令周期一定包含中断周期 | ❌ | 只有响应中断时才有 |
| 间址周期在取指周期之后、执行周期之前 | ✅ | 它算的是操作数地址,必须先于取操作数 |
| CPU 周期就是机器周期 | ✅ | 同一概念的两个名字 |
| 机器周期通常以访存时间为基准 | ✅ | 访存是最慢的基本操作 |
空操作指令 NOP 也有指令周期 | ✅ | 至少有取指周期 |
考点
- 判断某时刻处于哪个周期:给出寄存器内容(尤其 MDR),反推阶段。这是 5.2.2 的主战场。
- 周期数计算:给”每个机器周期含 4 个时钟周期,某指令需 3 个机器周期,主频 1 GHz”,求该指令执行时间
。 - 必有 / 条件阶段的辨析:高频选择题。
- 取指周期微操作序列默写:五步,注意 PC 自增可与访存并行。
- CPI 的来源:一条指令的机器周期数就是它对 CPI 的贡献,接 1.3.1 计算机的主要性能指标的
。
链接
- 🏠 返回总览:计算机组成原理第 5 章:中央处理器总览
- ⬅️ 上一节:5.1.3 CPU 的寄存器
- ➡️ 下一节:5.2.2 指令周期的数据流
- 🔗 阶段与指令类型的对应:4.1.5 指令的操作类型
- 🔗 间址周期的来源:4.2.2 常见的数据寻址方式
- 📐 性能公式:1.3.1 计算机的主要性能指标
- 📖 名词库:第 5 章名词库