指令周期

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

三处必须看清楚的细节:

  1. 中断的检测点在执行周期结束之后,不在指令中间。这就是 5.1.3 说的”切换只发生在指令边界”的硬件来源,也是操作系统上下文切换只需保存 ISA 状态的原因。
  2. 中断周期是本条指令周期的一部分,不属于下一条。教材把它画在这条指令的尾巴上,所以”一个指令周期可能包含中断周期”这句话是对的。
  3. 间址周期只有一次。 多重间接寻址(间接的间接)在 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 计算机的主要性能指标的 。

链接