5.2.1 指令执行的一般流程
计算机执行程序的本质,是控制器依据指令序列协调各功能部件协同工作的过程。CPU启动后,将持续循环执行“取指令”与“执行指令”两个基本操作。每条指令执行完毕后,还要进行中断与异常检测,以确保系统能够及时响应外部事件或内部异常。指令执行的一般流程如图5.2所示。
指令执行的基本流程如下:
首先,CPU以程序计数器(PC)的当前值为地址,从主存中取出下一条指令;与此同时,PC通常被自动更新为下一条顺序指令的地址(增量等于当前指令的长度),为后续取指做准备。
随后,进入译码与执行阶段:CPU对指令进行译码,识别其类型,并据此确定执行路径。为简化分析,可将指令分为分支指令与非分支指令两类:
- 为
分支指令时,在执行阶段判断分支条件;条件满足时,PC将被更新为分支目标地址。 - 为
非分支指令时,依次完成取操作数、执行运算、写回结果等基本操作。
无论执行哪类指令,执行完成后,CPU均需要进行中断与异常检测:
- 检测到中断或异常时,进入中断响应阶段:屏蔽可屏蔽中断,保存返回地址(通常为下一条指令地址或当前指令地址,具体取决于中断/异常的类型),并将PC设置为对应中断服务程序的入口地址,随后转移执行该服务程序。关于中断机制的介绍,见5.5节。
- 未检测到中断或异常时,继续以更新后的PC地址取指,进入下一条指令的执行阶段。
5.2.2 CPU的时序控制
计算机的时序控制用于协调指令执行过程中各操作的先后顺序。CPU必须按照精确的时序产生控制信号,以适应不同指令在操作步骤和执行时间上的差异。
时钟信号是时序控制的基础,通常由机器内部的脉冲源(如晶振)产生,经整形和分频后形成供全机同步使用的节拍信号。时钟周期的长度由数据通路中相邻状态单元之间组合逻辑的最大传播延迟决定,以确保信号在下一个时钟边沿到来前稳定。关于数据通路的介绍,见5.3节。
早期计算机采用“机器周期—节拍—脉冲”三级时序系统:一个指令周期被划分为若干机器周期(如取指、取操作数、执行、中断响应等),每个机器周期又细分为多个节拍,必要时在节拍内插入工作脉冲,以实现更精细的时序控制。由于不同指令的功能复杂度各异,其所需的机器周期数及各周期内的节拍数均可不同,从而支持多样化的需求。
随着高速缓存的广泛应用和芯片集成度的显著提升,现代处理器已大幅简化时序结构,“机器周期”这一概念逐渐淡化。CPU内部由统一的系统时钟直接驱动,一个时钟周期即对应一个节拍,绝大多数指令可在若干时钟周期内高效完成。
5.2.3 指令周期的基本概念
指令周期是指一条指令从主存读出到执行完成所经历的全部时间。为便于分析,可将其划分为若干阶段。最简单的划分方法是将指令周期分为取指和执行两个阶段;更细致的划分则可将其细分为取指、译码/读寄存器、执行/计算地址、访存和写回五个阶段。
1. 取指(IF)
CPU根据PC的值,从主存(或指令Cache)中读取下一条指令,并将其送入IR。同时,PC被更新为下一条指令的地址:顺序执行时,PC增加当前指令的长度;若为变长指令,则需要在取指阶段初步解析其格式,以确定长度;若发生分支,则其目标地址将在后续阶段计算,并据此更新PC。
2. 译码/读寄存器(ID)
对IR中的指令进行译码,识别操作码和寻址方式,并从寄存器堆中读取所需的操作数。此阶段还可能组合基址寄存器与偏移量,为后续地址计算做准备。立即数也在本阶段提取。
3. 执行/计算地址(EX)
根据指令类型执行相应的操作:算术或逻辑指令,由ALU完成运算;访存类指令(如LOAD/STORE),计算操作数在主存中的有效地址;分支指令,计算目标地址并判断是否转移。此外,运算结果的状态(如零标志、进位等)通常在此阶段生成并暂存。
4. 访存(MEM)
若指令需要访问主存储器(如加载数据或存储结果),则在此阶段通过数据Cache或主存完成读/写操作。寄存器-寄存器类指令不涉及此阶段。
5. 写回(WB)
将最终结果写回寄存器堆。结果可能来自ALU的运算输出(执行阶段)或从存储器读取的数据(访存阶段)。写回完成后,该指令的执行即告结束。
需要注意的是,指令周期的具体划分因处理器架构而异,上述划分仅为一种典型示例。实际系统还可能包含中断响应等阶段,此时CPU会保存断点并转移至服务程序。
由于指令功能和寻址方式的不同,不同指令的指令周期长度并不固定。根据实现方式,可分为定长指令周期(所有指令的周期长度相同)和变长指令周期(不同指令包含的时钟周期数可变)。现代计算机普遍采用基于时钟信号定时的变长指令周期,以提高执行效率。
5.2.4 处理器指令执行模型
一个指令周期通常由若干依次执行的步骤组成,各步骤协同完成指令的全部功能。不同处理器对这些步骤的组织方式存在显著差异,主要可分为以下三类模型。
1. 单周期处理器
单周期处理器为所有指令分配相同的执行时间,每条指令在一个时钟周期内完成(CPI=1)。指令之间严格串行执行,即下一条指令必须等待前一条指令完全结束后才能启动。因此,时钟周期的长度由执行时间最长的指令决定。对于原本可在更短时间内完成的指令,也要占用整个周期,导致硬件资源在部分时间内空闲,限制了系统的整体性能。
2. 多周期处理器
多周期处理器根据指令类型动态分配执行周期数,不同指令可占用不同数量的时钟周期(各指令的CPI不同,平均CPI通常大于1)。该方案不再要求所有指令具有相同的执行时间,从而提高了时钟频率和资源利用效率。但是,指令之间仍是串行执行的,无法实现重叠处理。
3. 流水线处理器
流水线处理器采用指令级并行策略,目标是在每个时钟周期完成一条指令的吞吐(理想情况下CPI=1)。其实现机制是:每个时钟周期启动一条新指令,使多条指令在流水线中重叠执行,各自处于不同的执行阶段(如取指、译码、执行、写回等)。尽管单条指令从开始到完成仍需要多个周期(执行延迟未减少),但整体吞吐率显著提高,大幅提升了处理器效率。
