Skip to main content

第5章 中央处理器

5.1 CPU的功能和基本结构

5.1.1 CPU的功能

中央处理器(CPU)是整个计算机系统的核心,它的功能可以概括为以下几个方面:

  • 指令控制:控制指令的取出和执行顺序。CPU必须知道下一条要执行的指令在哪里,这由程序计数器(PC)来记录。程序执行时,CPU根据PC的内容从主存中取出指令,然后PC自动指向下一条指令的地址。对于转移指令,CPU需要修改PC的值,使程序跳转到指定的目标地址。

  • 操作控制:一条指令通常由多个微操作组成,CPU需要产生相应的控制信号,指挥各个部件协调工作。例如,执行加法指令时,CPU需要控制ALU进行加法运算,同时控制寄存器将操作数送到ALU的输入端,最后将结果写回目标寄存器。

  • 时间控制:CPU必须为每条指令的执行提供精确的时序控制。计算机的所有操作都是在统一的时钟信号驱动下进行的,CPU需要按时序发出控制信号,保证各个微操作按照正确的顺序执行。

  • 数据加工:这是运算器的核心功能,包括算术运算(加、减、乘、除)和逻辑运算(与、或、非、异或等),以及移位操作等。数据加工的结果会影响程序状态字(PSW)中的标志位,如进位标志CF、零标志ZF、符号标志SF、溢出标志OF等。

  • 中断处理:CPU需要能够响应外部设备和内部异常产生的中断请求。当发生中断时,CPU要暂停当前正在执行的程序,保存断点(返回地址)和现场,然后转去执行中断服务程序,中断处理完毕后再恢复现场,返回到原程序继续执行。

5.1.2 CPU的基本结构

CPU内部由运算器控制器寄存器组三大部分构成。这三部分通过内部数据通路连接在一起,共同完成指令的执行。

1. 运算器

运算器是数据加工的核心部件,主要包括:

  • 算术逻辑单元(ALU):这是运算器的核心,负责执行算术运算和逻辑运算。ALU的输入端通常有两个,分别接收两个操作数;输出端给出运算结果,同时产生一些标志信息(如进位、溢出等)。ALU的宽度通常等于机器字长。

  • 通用寄存器组(GPRs):这是一组供程序员使用的寄存器,用于存放操作数和中间结果。通用寄存器的个数和位数由指令集体系结构(ISA)决定。在程序执行过程中,操作数可以从主存读到通用寄存器中,然后进行运算,运算结果再存回通用寄存器,这样可以减少对主存的访问次数,提高执行速度。

  • 暂存器:这些寄存器不提供给程序员使用,而是由CPU内部在指令执行过程中临时存放数据。例如,在单总线结构的CPU中,需要暂存器来保存ALU的一个输入,因为总线上同时只能传输一个数据。

  • 程序状态字寄存器(PSW):也称为标志寄存器,用于存放程序执行过程中的状态信息。主要包括:

    • 条件码:如进位标志CF、零标志ZF、符号标志SF、溢出标志OF等,这些标志由ALU运算结果设置,用于条件转移指令的判断。
    • 中断允许位:控制CPU是否响应可屏蔽中断。
    • 特权级:指示CPU当前运行在用户态还是内核态,用于保护操作系统。

2. 控制器

控制器是CPU的指挥中心,负责产生控制信号,协调整个计算机的工作。主要包括:

  • 程序计数器(PC):存放下一条要执行的指令在主存中的地址。取指令时,CPU将PC的内容送到MAR,然后访问主存读取指令;同时,PC自动加上指令字长(按字节编址时,32位指令加4),指向下一条指令的地址。对于转移指令,PC的内容会被修改为转移目标地址。

  • 指令寄存器(IR):存放当前正在执行的指令。从主存中取出的指令先放入MDR,然后传送到IR。指令中的操作码部分被送到指令译码器进行译码,地址码部分被送到地址形成部件计算操作数的有效地址。

  • 指令译码器(ID):对IR中的操作码进行译码,识别出这是一条什么指令,然后产生相应的控制信号。对于复杂的指令,译码器可能产生多个控制信号序列。

  • 时序部件:产生各种时序信号,包括时钟周期、机器周期、指令周期等。时序部件确保各个微操作按照正确的时间顺序执行。

  • 微操作信号发生器:根据指令译码结果和时序信号,生成各部件所需的控制信号,如ALU的控制信号、寄存器的读写信号、主存的读写信号等。微操作信号发生器的实现方式有两种:硬布线逻辑和微程序控制。

3. 寄存器组(程序员可见/不可见)

寄存器可以从程序员的角度分为两类:

  • 程序员可见的寄存器:包括通用寄存器、PC、PSW等。汇编语言程序员可以直接访问这些寄存器,编写程序时可以显式地使用它们。

  • 程序员不可见的寄存器:包括IR、MAR、MDR、暂存器等。这些寄存器由CPU内部硬件控制,程序员在编写程序时无法直接访问它们,对用户是完全透明的。

5.1.3 CPU的寄存器(细节注意)

理解CPU中各个寄存器的位数和作用,对于理解指令执行过程非常重要:

  • 程序计数器(PC):PC的位数等于地址总线的宽度。例如,32位地址总线的计算机,PC就是32位。取指令后PC自动修改,修改的数值等于指令字长除以编址单位。按字节编址时,若指令字长为32位(4字节),则PC+4;若指令字长为16位,则PC+2。

  • 指令寄存器(IR):IR的位数等于指令字长。无论CPU内部数据通路是多少位,IR必须能够完整地存放一条指令。

  • 存储器地址寄存器(MAR):MAR的位数等于地址总线的宽度,决定了CPU能够访问的主存空间大小。例如,32位MAR可以访问2^32字节(4GB)的地址空间。

  • 存储器数据寄存器(MDR):MDR的位数等于数据总线的宽度,通常等于存储字长。一次访存操作可以读出或写入MDR宽度的数据。

  • 通用寄存器:通用寄存器的位数通常等于机器字长。32位CPU的通用寄存器就是32位,64位CPU的通用寄存器就是64位。

特别注意:虽然MAR和MDR从逻辑上属于主存的一部分,但在现代计算机中,它们通常被集成在CPU内部,因为CPU与主存的数据交换必须通过这些寄存器进行。

5.2 指令执行过程

5.2.1 指令周期

指令周期是CPU执行一条指令所需的时间。从宏观上看,指令周期由若干个机器周期组成,而每个机器周期又由若干个时钟周期组成。

  • 时钟周期:CPU最小的时间单位,由计算机的主频决定。主频为1GHz的CPU,时钟周期为1ns。时钟周期是CPU内部所有操作的基准,每个微操作都在时钟边沿触发。

  • 机器周期(CPU周期):通常定义为从主存读取一个指令字的最短时间。由于主存速度相对较慢,CPU访问主存的时间往往成为瓶颈,因此机器周期通常等于主存的存取周期。

  • 指令周期:取指令、分析指令、执行指令所需的总时间。不同的指令具有不同的指令周期,例如,加法指令可能只需要一个机器周期,而乘法指令可能需要多个机器周期。

一个典型的指令周期包含以下阶段:

  1. 取指周期:CPU根据PC的内容从主存中读取指令,并将指令放入IR。
  2. 间址周期(可选):如果指令采用间接寻址,则需要根据地址码再次访问主存,获取操作数的有效地址。
  3. 执行周期:执行指令规定的操作,如加法、减法、数据传送等。
  4. 中断周期(可选):如果CPU响应中断,则需要保存断点、现场,并转向中断服务程序。

5.2.2 指令周期的数据流

理解每个周期中数据的流动过程,是掌握CPU工作原理的关键。以下以单总线结构为例,说明各周期的数据流。

1. 取指周期

取指周期的任务是将指令从主存中读出并送入IR。数据流如下:

  • (PC) → MAR:将PC的内容通过内部总线送到MAR。MAR中的地址被送到地址总线上。
  • CPU发出读命令(MemRead):控制总线上的读信号有效,通知主存进行读操作。
  • 主存根据地址线上的地址,将对应的存储单元的内容读出,送到数据总线上。
  • MDR从数据总线上接收数据,然后通过内部总线将数据传送到IR。至此,指令被成功取入IR。
  • (PC) + 指令长度 → PC:PC自动增加,指向下一条指令的地址。增加的量取决于指令字长和编址方式。
info

在取指周期中,PC的自动增量操作通常由ALU完成,需要占用一个时钟周期。

2. 间址周期

如果指令采用间接寻址,指令中的地址码并不是操作数的有效地址,而是存放有效地址的地址。间址周期的任务就是根据地址码读取有效地址。数据流如下:

  • 将IR中的地址码(或根据寻址方式计算出的地址)送到MAR。
  • CPU发出读命令,从主存中读取数据。
  • 读出的数据(即有效地址)被送入MDR,然后通过内部总线送到ALU或暂存器,等待执行周期使用。

注意:间接寻址需要额外的一次访存操作,因此会延长指令的执行时间。

3. 执行周期

执行周期的数据流因指令而异。以加法指令"ADD R0, R1"(将R0和R1的内容相加,结果存回R0)为例,在单总线结构下的数据流如下:

  • (R1) → 内部总线 → Y(暂存器):将R1的内容送到暂存器Y,准备作为ALU的一个输入。
  • (R0) → 内部总线 → ALU:将R0的内容送到ALU的另一个输入端。
  • ALU执行加法运算,结果 → Z(另一个暂存器)。
  • Z → 内部总线 → R0:将加法结果写回R0。

注意:在单总线结构中,每条指令的执行需要多个时钟周期,因为总线一次只能传输一个数据。

4. 中断周期

当CPU响应中断时,需要执行中断周期。数据流如下:

  • 将PC的内容(即返回地址)压入堆栈。通常,SP先减1,然后(PC) → M[SP]。
  • 将PSW的内容压入堆栈(如果需要保存现场)。
  • 将中断服务程序的入口地址送入PC。
  • CPU关中断(某些情况下),以防止中断嵌套。

5.2.3 指令执行方案

CPU执行指令的方式主要有三种:

  • 单指令周期:所有指令都用相同的机器周期数完成(通常为一个机器周期)。这种方案的优点是控制简单,但缺点是周期长度必须由最慢的指令决定,导致大多数指令执行效率低下。CPI(平均每条指令的时钟周期数)等于1,但实际时钟周期较长。

  • 多指令周期:不同指令使用不同数量的机器周期。这种方案可以根据指令的复杂度分配不同的执行时间,硬件利用率较高,但控制逻辑比较复杂。

  • 流水线方案:将指令执行过程分解为多个阶段,每个阶段由专用的硬件完成,多条指令可以重叠执行。这种方案可以显著提高CPU的吞吐率,是现代CPU普遍采用的方式。

5.3 数据通路的功能和基本结构

5.3.1 数据通路的功能

数据通路是指CPU内部数据流动的路径,包括ALU、寄存器、总线以及它们之间的连接关系。数据通路的功能是实现数据在各部件之间的传送与处理。每条指令的执行,本质上就是数据在数据通路中按照一定顺序流动的过程。

5.3.2 数据通路的组成

数据通路由两类元件组成:

  • 组合逻辑元件:这些元件的输出只取决于当前的输入,没有存储功能。主要包括:

    • 算术逻辑单元(ALU):执行运算,输出结果和标志。
    • 移位器:对数据进行左移或右移操作。
    • 多路选择器(MUX):从多个输入中选择一个输出,用于选择数据源。
    • 三态门:控制数据是否输出到总线上,用于实现总线的分时共享。
  • 时序逻辑元件:这些元件在时钟边沿将输入数据锁存到输出端,具有存储功能。主要包括:

    • 寄存器(通用寄存器、PC、IR等)
    • 程序状态字寄存器(PSW)
    • 暂存器

5.3.3 数据通路的基本结构

根据内部总线的数量,数据通路可以分为以下几种结构:

  • 单总线结构:所有部件都连接在同一条内部总线上。这种结构的优点是简单、成本低,缺点是任何时刻只能有两个部件进行数据传送(一个发送,一个接收),因此每条指令需要多个时钟周期才能完成。例如,执行加法指令时,需要先取出一个操作数到暂存器,再取出另一个操作数,然后执行加法,最后写回结果,共需4个时钟周期(取数、取数、运算、写回)。

  • 双总线结构:设置两条内部总线(如A总线、B总线),ALU的两个输入端分别连接到不同的总线。这样,ALU可以同时从两条总线获取两个操作数,减少了数据传送的时钟周期数。双总线结构提高了执行速度,但增加了硬件复杂度。

  • 多总线结构:设置更多的内部总线,可以实现更复杂的并行数据传送。高性能CPU通常采用多总线结构,以支持超标量、乱序执行等高级技术。

5.3.4 数据通路的操作举例

以下以单总线结构为例,说明典型操作的数据流:

取指令操作

  • 时钟周期1:(PC) → MAR(PC内容通过内部总线送到MAR)
  • 时钟周期2:主存读,MDR接收数据(CPU发出读信号,等待主存响应)
  • 时钟周期3:(MDR) → IR(数据从MDR通过内部总线送到IR)
  • 时钟周期4:(PC) + 1 → PC(通过ALU计算,结果写回PC)

加法指令 ADD R1, R2(R1 ← R1 + R2):

  • 时钟周期1:(R1) → 内部总线 → Y(将R1送到暂存器Y)
  • 时钟周期2:(R2) → 内部总线 → ALU(将R2送到ALU输入端)
  • 时钟周期3:ALU执行加法,结果 → Z(运算结果存到暂存器Z)
  • 时钟周期4:(Z) → 内部总线 → R1(将结果写回R1)

注意:在单总线结构中,每个数据传送步骤都需要占用一个时钟周期,且不同操作不能并行。因此,指令执行速度受到总线带宽的限制。

5.4 控制器的功能和工作原理

控制器是CPU的指挥中心,负责产生微操作命令序列。根据实现方式的不同,控制器分为硬布线控制器和微程序控制器两大类。

5.4.1 控制器的结构和功能

控制器的基本功能包括:

  • 从主存中取出指令,并存入指令寄存器IR。
  • 对IR中的指令进行译码,识别出指令的操作类型。
  • 根据指令译码结果和当前的时序状态,产生相应的控制信号,控制各部件协同工作。
  • 处理中断和异常,保证系统的正常运行。

控制器的输入包括:

  • 指令寄存器IR(提供操作码和地址码)
  • 时钟信号(提供时序基准)
  • 标志位(来自PSW,用于条件判断)
  • 中断请求信号(来自外部设备或内部异常)

控制器的输出是各种控制信号,如:

  • ALU的控制信号(选择加法、减法等)
  • 寄存器的读写控制信号(RegWrite、RegRead)
  • 主存的读写控制信号(MemRead、MemWrite)
  • 多路选择器的选择信号

5.4.2 硬布线控制器

硬布线控制器采用组合逻辑电路实现,由指令译码器、时序产生器、节拍发生器和逻辑门阵列组成。它的工作原理是:将指令译码结果、时序状态和条件标志输入到组合逻辑电路中,通过逻辑门直接产生控制信号。

优点

  • 速度快:控制信号由组合逻辑直接产生,没有访存延迟,适合高速处理器。
  • 结构简单:RISC处理器指令集精简,硬布线控制器的规模较小。

缺点

  • 设计复杂:随着指令数量的增加,逻辑门数量呈指数增长,设计难度大。
  • 不易修改:一旦设计完成,修改指令集需要重新设计逻辑电路,灵活性差。

注意:硬布线控制器中,每个微操作都对应一组逻辑门,指令集规模增大时电路急剧膨胀,因此通常用于指令集精简的RISC处理器(如ARM、MIPS)。

5.4.3 微程序控制器

微程序控制器采用存储逻辑实现,将微操作命令序列编写成微指令,存放在控制存储器(CM)中。执行指令时,控制器从控制存储器中逐条读取微指令,每条微指令产生一组控制信号。

微程序控制器的组成

  • 控制存储器(CM):存放所有微程序,通常用ROM实现(固化的微程序),也可以用RAM实现(可重写的微程序)。
  • 微指令寄存器(μIR):存放当前正在执行的微指令。
  • 微地址寄存器(μPC):存放下一条微指令的地址。
  • 地址转移逻辑:根据条件决定微程序的分支,用于实现微程序的条件转移。

微指令格式

  • 水平型微指令:一次能定义多个并行操作的微命令,微指令字较长,但并行度高,执行效率高。例如,一条微指令可以同时控制ALU运算、寄存器写入、主存读取等多个操作。
  • 垂直型微指令:每条微指令只定义一个微操作,类似机器指令,微指令字较短,但并行度低,执行效率低。 微程序控制器的执行过程
  1. 取指:根据指令的操作码,通过微程序入口地址形成逻辑,将微程序首地址送入μPC。
  2. 从控制存储器读出微指令,存入μIR。
  3. μIR中的控制字段产生控制信号,驱动各部件执行相应的微操作。
  4. 根据μIR中的后继地址字段或地址转移逻辑,生成下一条微指令的地址,送入μPC。
  5. 重复步骤2-4,直到微程序结束。

微程序控制器的特点

  • 优点:设计规整,易于修改和扩展(只需修改控制存储器的内容),适合指令集复杂的CISC处理器。
  • 缺点:速度较慢,因为每条微指令都需要访问控制存储器,存在访存延迟。

硬布线控制器与微程序控制器的比较

对比项硬布线控制器微程序控制器
实现方式组合逻辑电路存储逻辑(控制存储器)
速度较慢(需访存)
灵活性差(不易修改)好(可修改微程序)
设计复杂度随指令集规模指数增长规整,便于设计
适用场景RISC处理器CISC处理器

5.5 异常和中断机制

5.5.1 异常和中断的基本概念

异常和中断都是对程序正常执行流程的打断,但它们的来源和处理方式有所不同:

  • 中断(Interrupt):由CPU外部的硬件事件引起,与当前执行的指令无关。例如,键盘输入、定时器溢出、I/O设备请求等。中断是异步的,可以在任何时刻发生。

  • 异常(Exception):由CPU内部的事件引起,与当前正在执行的指令有关。例如,除零错误、缺页、非法操作码、算术溢出等。异常是同步的,在指令执行过程中被检测到。

5.5.2 异常和中断的分类

类型来源举例处理特点
外部中断CPU外部(硬件)键盘中断、定时器中断、网络中断异步,可屏蔽(除NMI外)
内部异常CPU内部(指令执行)除零、缺页、非法操作码、溢出同步,不可屏蔽
软件中断程序主动触发系统调用(INT指令)、断点指令同步,由软件产生

异常的细分

  • 故障(Fault):指令执行过程中发生的异常,如缺页、除零。故障发生后,指令尚未执行完毕,处理完异常后返回原指令重新执行(缺页)或终止执行(除零)。
  • 陷阱(Trap):通常用于调试和系统调用。陷阱指令执行后,CPU主动产生异常,处理完成后返回下一条指令继续执行。
  • 终止(Abort):严重的硬件错误,导致程序无法继续执行,处理完成后不返回。

5.5.3 异常和中断响应过程

当发生中断或异常时,CPU会执行以下步骤:

  1. 关中断(某些情况):为了防止中断嵌套,在响应中断时硬件自动关中断(清除中断允许位)。但NMI(非屏蔽中断)不受影响。

  2. 保存断点:将当前PC的内容(或下一条指令的地址)压入堆栈或存入特定单元,以便中断返回时能够恢复执行。

  3. 保存现场:保存PSW的内容(条件码、控制状态等),有时还需要保存通用寄存器(由中断服务程序完成)。

  4. 识别中断源:通过中断向量表或软件查询确定中断源的优先级和中断服务程序的入口地址。

  5. 转向中断服务程序:将中断服务程序的入口地址送入PC,CPU开始执行中断服务程序。

  6. 恢复现场:中断服务程序执行完毕后,执行IRET指令,从堆栈中恢复PSW和PC的内容,返回到原程序继续执行。

注意:中断响应过程中,保存断点、关中断、获取中断向量等操作由硬件自动完成;而保存通用寄存器等现场信息由中断服务程序完成,因为这些操作不是所有中断都需要。

5.6 指令流水线

5.6.1 指令流水线的基本概念

指令流水线是指将指令执行过程分解为若干个独立的子过程(流水段),每个流水段由专用的硬件电路完成,多条指令可以重叠执行。这种技术可以显著提高CPU的吞吐率,是提高处理器性能的核心技术之一。

五段流水线的典型划分

  • IF(取指):从指令Cache中取出指令,PC自增。
  • ID(译码/读寄存器):对指令进行译码,同时从寄存器堆中读取操作数。
  • EX(执行):ALU执行算术或逻辑运算,计算有效地址。
  • MEM(访存):访问数据Cache(对于Load/Store指令)。
  • WB(写回):将结果写回寄存器堆。

在理想情况下,每个时钟周期都可以完成一条指令的执行(CPI=1),但实际上由于各种冒险,CPI会大于1。

5.6.2 流水线的基本实现

流水线的实现需要在每个流水段之间设置流水寄存器(锁存器),用于保存本段的结果并传递到下段。常见的流水寄存器有:

  • IF/ID:保存取指阶段取出的指令。
  • ID/EX:保存译码结果和操作数。
  • EX/MEM:保存ALU运算结果。
  • MEM/WB:保存访存结果。

流水线的时钟周期由最慢的流水段决定。如果五个阶段的延迟分别为T1、T2、T3、T4、T5,则时钟周期 = max(T1, T2, T3, T4, T5)。因此,为了平衡流水线,通常需要将各段的延迟尽量均匀化。

5.6.3 流水线的冒险与处理

冒险是指流水线中下一指令不能按预期时钟周期执行的情况。主要有三种类型:

1. 结构冒险(资源冲突)

当两条指令需要同时使用同一硬件资源时,就会发生结构冒险。例如,如果指令和数据共用同一存储器,那么IF段和MEM段可能同时访问存储器,造成冲突。

解决方法

  • 增加硬件资源:将指令Cache和数据Cache分离,避免取指和访存冲突。
  • 插入气泡(暂停):如果资源无法增加,则通过流水线停顿来解决,让冲突的指令等待一个时钟周期。

2. 数据冒险(数据相关)

数据冒险是指后续指令需要用到前面指令的计算结果,而该结果还没有写回寄存器。数据冒险分为三种类型:

  • 写后读(RAW,Read After Write):真正的数据依赖。指令j需要读取指令i写入的值,而i还没有完成写回。例如:
ADD R1, R2, R3 // R1 = R2 + R3
SUB R4, R1, R5 // R4 = R1 - R5 需要等待ADD的结果
  • 读后写(WAR,Write After Read):指令i读取寄存器后,指令j才写入该寄存器。在五段流水线中,由于指令顺序执行和顺序写回,WAR一般不会发生。但在乱序执行中可能出现。

  • 写后写(WAW,Write After Write):两条指令写入同一寄存器,后写入的指令覆盖先写入的结果。同样在顺序流水线中不会发生。

解决方法

  • 插入气泡(暂停):硬件检测到数据冒险,插入空操作(nop),等待前一条指令的结果写回。这种方法会导致流水线停顿,降低效率。
  • 数据旁路(转发,Forwarding):将前面指令的计算结果直接从EX/MEM或MEM/WB流水寄存器中取出来,通过旁路电路直接送到ALU的输入端,而不必等待写回寄存器堆。这是最常用的解决方法,可以消除大部分数据冒险。
  • 编译优化:编译器通过调整指令顺序,在相关指令之间插入无关指令,避免冒险。

3. 控制冒险(分支冒险)

当遇到分支指令(条件转移、无条件转移)时,下一条指令的地址要到分支指令的执行阶段才能确定,如果顺序取指,可能会取到错误的指令。

解决方法

  • 分支预测:预测分支是否发生,并提前取指。静态预测(总是预测不跳转或总是预测跳转)简单但准确率低;动态预测(根据历史记录)准确率高,但硬件复杂。
  • 延迟槽(Delay Slot):在分支指令之后插入一条总是执行的指令(即延迟槽中的指令无论分支是否发生都会执行),这样分支损失可以部分隐藏。MIPS处理器采用了这种方法。
  • 提前分支判断:将分支条件的计算提前到ID段,这样分支损失可以减小到1个时钟周期。

5.6.4 流水线的性能指标

  • 吞吐率:单位时间内完成的指令数。理想情况下,吞吐率 = 1 / 时钟周期。实际吞吐率受冒险和停顿的影响。
  • 加速比:流水线方式与串行方式执行时间的比值。流水线段数为k时,理想加速比为k。
  • 效率:流水线各段的利用率。由于流水线启动和清空的影响,效率低于1。

注意:实际流水线中由于冒险和流水线停顿,CPI会大于1。CPI = 1 + 停顿周期数 / 指令数。

5.6.5 高级流水线技术

  • 超标量(Superscalar):每个时钟周期发射多条指令,需要多个执行单元和复杂的调度逻辑。现代高性能CPU(如Intel Core系列)都是超标量处理器。

  • 超流水线(Superpipelined):将流水段进一步细分,提高时钟频率。例如,将五段流水线细分为十段,时钟周期可以减半,但流水线深度增加,分支损失更大。

  • 动态调度:硬件动态调整指令执行顺序,以减少数据冒险。例如,乱序执行(Out-of-Order Execution)可以让不相关的指令先执行,提高资源利用率。

  • 同时多线程(SMT,Simultaneous Multi-Threading):在一个时钟周期内,多个线程的指令同时发射。Intel的超线程技术(Hyper-Threading)就是SMT的实现。

5.7 多处理器的基本概念

5.7.1 SISD、SIMD、MIMD的基本概念

根据指令流和数据流的数量,计算机系统可以分为以下类型:

  • SISD(单指令流单数据流):传统的单处理器系统,一个CPU执行一条指令,处理一个数据。冯·诺依曼机属于SISD。

  • SIMD(单指令流多数据流):一条指令同时处理多个数据。例如,向量处理器(Cray系列)和GPU(图形处理器)都采用SIMD架构。一条加法指令可以对整个向量进行加法运算。

  • MIMD(多指令流多数据流):多个处理器同时执行不同的指令,处理不同的数据。多核处理器、多处理器系统都属于MIMD。

5.7.2 硬件多线程的基本概念

硬件多线程是指在一个CPU核心中同时维护多个线程的上下文,通过快速切换来隐藏长延迟操作(如Cache缺失、访存延迟)。硬件多线程主要有三种方式:

  • 细粒度多线程:每个时钟周期切换线程,可以隐藏各种延迟,但需要大量的硬件资源来保存多个线程的上下文。

  • 粗粒度多线程:仅在发生长延迟(如Cache缺失)时切换线程。实现简单,但切换开销较大。

  • 同时多线程(SMT):同一个时钟周期内,多个线程的指令同时发射到执行单元。这是目前主流CPU(如Intel的Hyper-Threading)采用的技术。SMT可以在一个核心内同时执行多个线程的指令,提高执行单元的利用率。

5.7.3 多核处理器的基本概念

多核处理器是指在单个芯片上集成多个独立的处理核心(Core)。每个核心有自己的L1 Cache(通常分为指令Cache和数据Cache),多个核心共享L2 Cache或L3 Cache。

多核处理器的优点

  • 提高并行处理能力,多个核心可以同时处理多个线程。
  • 功耗控制更好,相比提高频率,增加核心数量在功耗上更有效。
  • 适合现代多任务操作系统和并行应用。

多核处理器的挑战

  • Cache一致性:多个核心共享主存,各自的Cache中可能保存同一主存块的不同副本,需要协议保证一致性(如MESI协议)。
  • 内存带宽:多个核心共享内存总线,可能出现带宽瓶颈。
  • 编程模型:编写并行程序比串行程序复杂得多。

5.7.4 共享内存多处理器的基本概念

共享内存多处理器是指多个处理器通过共享的物理内存进行通信的系统。根据内存访问的均匀性,可以分为:

  • UMA(统一内存访问):所有处理器对内存的访问时间相同。通常多核处理器属于UMA,所有核心通过同一个内存控制器访问内存。

  • NUMA(非统一内存访问):处理器访问本地内存(与自己在同一节点)的速度快于访问远程内存(其他节点的内存)。大型多处理器系统通常采用NUMA架构,以解决内存带宽瓶颈。

5.8 常见问题和易混淆知识点

1. 程序计数器(PC)的自动增量

PC每次加1是指加一条指令的长度,具体数值取决于指令字长和编址单位。例如:

  • 按字节编址,指令字长为32位(4字节),则PC+4。
  • 按字节编址,指令字长为16位(2字节),则PC+2。
  • 按字编址(一字=4字节),指令字长=1字,则PC+1(即增加1个存储字)。

2. 指令周期、机器周期、时钟周期的关系

  • 时钟周期是基本时间单位,由主频决定。
  • 多个时钟周期组成一个机器周期(通常等于主存存取周期)。
  • 多个机器周期组成一个指令周期(不同指令的机器周期数不同)。

3. 硬布线控制器与微程序控制器的比较

对比项硬布线控制器微程序控制器
速度慢(需访存)
灵活性
设计复杂度高(随指令规模指数增长)低(规整)
适用场景RISCCISC

4. 数据冒险的三种类型

  • RAW(写后读):真正的数据依赖,必须解决。例如:
ADD R1, R2, R3 // 写入R1
SUB R4, R1, R5 // 读取R1 ← 数据冒险
  • WAR(读后写):在顺序流水线中不会发生,因为所有指令都顺序写回。乱序执行中可能出现。
  • WAW(写后写):在顺序流水线中不会发生,因为后写入的指令会覆盖前一条的结果,但顺序执行时前一条的结果已经用完了。

5. 流水线停顿与分支预测

分支指令引起的控制冒险可以通过分支预测来减小损失:

  • 如果预测正确,流水线继续执行,没有停顿。
  • 如果预测错误,需要清空流水线中已经取出的错误指令,损失几个时钟周期(等于流水线深度)。

6. 中断与异常的区别

对比项中断异常
来源外部设备CPU内部
时序异步同步
是否与指令相关
返回点下一条指令故障类返回原指令,陷阱类返回下一条指令

7. 中断响应时硬件自动完成的操作

  • 关中断(清除中断允许位)
  • 保存PC(断点)
  • 获取中断向量(通过中断向量表)
  • 将中断服务程序入口地址送入PC

保存通用寄存器等现场信息由中断服务程序完成。

8. CPI与流水线

理想流水线中CPI=1,但实际由于冒险和流水线停顿,CPI>1。平均CPI = 1 + 停顿周期数 / 指令数。

9. 多核与多线程

  • 多核是物理上多个独立的核心,每个核心有自己的执行单元。
  • 多线程是逻辑上的并发,一个核心可以同时维护多个线程的上下文。
  • 同时多线程(SMT)结合了二者,可以在一个核心内同时执行多个线程的指令。

10. 旁路(转发)的实现

旁路电路需要将EX/MEM或MEM/WB流水寄存器的结果直接通过多路选择器反馈到ALU的输入端。硬件需要检测当前指令的源寄存器是否等于前面指令的目的寄存器,如果相等,则旁路前面指令的结果,而不是从寄存器堆读取。

11. 流水线中的结构性冒险

结构冒险的典型例子是指令和数据共用同一存储器。现代CPU通过分离的指令Cache和数据Cache来解决这个问题。

12. 控制冒险的解决方案

  • 分支预测:动态预测(如2-bit饱和计数器)准确率可达90%以上。
  • 延迟槽:在分支指令后插入一条总是执行的指令,隐藏分支损失。
  • 提前分支判断:将分支条件计算前移到ID段,分支损失减小到1个时钟周期。

5.9 复习提示

  • 本章是计算机组成原理的核心章节,统考中常以综合题形式考查数据通路、控制信号、流水线等知识点。
  • 熟练掌握五段流水线的各段功能、冒险类型及解决方法。
  • 理解指令执行过程与数据通路的对应关系,能够分析给定指令所需的微操作序列。
  • 掌握微程序控制器的基本组成和微指令格式。
  • 关注中断与异常的处理流程,以及多核系统的基本概念。
  • 注意区分程序员可见寄存器和不可见寄存器,以及它们的作用。

本文字数:0

预计阅读时间:0 分钟


统计信息加载中...

有问题?请向我提出issue