中央处理器:指令执行、数据通路、控制器、流水线与多处理器架构。

5.1 指令的执行过程

5.1.1 指令周期

  1. 指令周期:CPU每取出并执行一条指令所需的全部时间。不同指令的指令周期可能不同。
  2. 一个指令周期由一个或多个机器周期组成,一个机器周期由多个时钟周期组成。
  3. 一个完整的指令周期包含取指、间址、执行和中断四个周期(间址周期并非每条指令都需要)。

指令执行过程

  • 取指令:从PC指向的内存单元取出指令送到指令寄存器(IR),同时计算下一条指令地址并送到PC。
    • 顺序执行时,PC加上当前指令长度。
    • 转移指令时,根据操作码和寻址方式决定下一条指令地址。
  • 判断是否需要间址:如果需要,根据寻址方式计算操作数的有效地址。
  • 取操作数、运算、存操作数:取出操作数,在ALU等部件中运算,并完成存操作数。
  • 中断处理:若CPU检测到中断请求,进入中断周期,关中断、保存断点、执行中断服务程序等。

5.1.2 指令的执行方案

类型 特点 CPI 指令间执行方式
单周期处理器 每条指令在一个时钟周期内完成,指令周期取决于最长指令的执行时间 CPI = 1 串行
多周期处理器 每条指令根据实际需要分配多个周期 CPI > 1 串行
流水线处理器 每个时钟周期启动一条指令,同时完成一条指令 CPI = 1 并行(重叠)

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

  • 数据通路:指令执行过程中数据经过的路径,包括路径上的部件(ALU、寄存器等)。
  • 数据通路由控制部件控制,控制部件根据指令操作码生成控制信号。
  • CPU = 数据通路 + 控制部件。

5.2.1 数据通路的基本组成

1. 组合逻辑元件(操作元件)

  • 输出仅取决于当前输入,无时钟控制。
  • 常见:多路选择器、加法器、ALU、译码器等。

2. 存储元件(状态元件)

  • 输出与当前输入及历史输入有关,有时钟控制。
  • 常见:通用寄存器组、暂存寄存器、程序计数器(PC)等。

5.2.2 数据通路的基本结构

1. CPU内部单总线方式

  • ALU及所有寄存器通过一条内部公共总线连接。
  • 结构简单,但数据传输冲突多,性能较低。
  • 图中:R0~R(n-1)为通用寄存器;Y、Z为临时寄存器(对程序员透明);IR、指令译码器属于控制单元;MAR、MDR连接存储器总线。
  • 控制信号:带“in”表示写入,带“out”表示输出;通过三态门控制部件与总线连接。

2. CPU内部多总线方式

  • 多条内部总线,可同时传送不同数据,效率更高。

3. 专用数据通路方式

  • 根据指令执行中数据流动方向安排直接连线,避免共享总线。
  • 性能高,但硬件量大。

5.2.3 数据通路的操作

总线是共享传输线,任一时刻只能有一个部件将信息送到总线。

  1. 通用寄存器之间传送数据

    • 例:将PC的内容送到MAR
      (PC) → MAR 控制信号:PCout, MARin
  2. 从主存读取数据(以取指令为例)

    1
    2
    3
    (PC) → MAR            PCout, MARin
    M(MAR) → MDR, (PC)+1→PC MDRin, 1→R
    (MDR) → IR MDRout, IRin

    需要1个时钟周期(取PC送MAR)+1个主存周期(读+PC更新)+1个时钟周期(MDR送IR)。

  3. 将数据写入主存(以R1内容写入R2所指主存单元为例)

    1
    2
    3
    (R1) → MDR            R1out, MDRin
    (R2) → MAR R2out, MARin
    (MDR) → M(MAR) MDRout, 1→W
  4. 执行算术或逻辑运算(单总线数据通路)

    • 需先将一个操作数暂存到Y,ALU输出暂存到Z,避免总线冲突。
    • 例:Add ACC, R1
      1
      2
      3
      (R1) → Y              R1out, Yin
      (ACC)+(Y) → Z ACCout, ALUin
      (Z) → ACC Zout, ACCin
      共需3个时钟周期。

考试要求:给出数据通路结构图及某条指令,写出每时刻数据流动方向及有效控制信号。

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

5.3.1 控制器的结构和功能

  • 控制器通过数据总线接收指令,从运算器接收指令转移地址,送出指令地址到地址总线,通过控制总线向系统提供控制信号。
  • 主要功能
    1. 从主存取指令,指出下一条指令地址。
    2. 指令译码,产生操作控制信号。
    3. 指挥并控制CPU、主存、I/O设备之间的数据流动。
  • 分为硬布线控制器微程序控制器

5.3.2 微程序控制器

将每条机器指令转化为一段微程序,存入控制存储器(CM),微操作控制信号由微指令产生。

5.3.2.1 基本概念

  • 微命令:控制部件向执行部件发出的控制命令,是构成控制序列的最小单位。
  • 微操作:执行部件收到微命令后进行的操作,与微命令一一对应。
    • 相容性微命令:可以同时出现的微命令。
    • 互斥性微命令:不允许同时出现的微命令。
  • 微指令:若干微命令的集合,包含微操作码字段和微地址码字段。通常一个时钟周期执行一条微指令。
  • 控制存储器(CM):存放微程序,用ROM实现,其单元地址称为微地址
  • 微程序:微指令的有序集合,用于描述机器指令。

5.3.2.2 微程序控制器的组成和工作过程

组成

  • 起始和转移地址发生器(微地址生成部件):产生初始和后续微指令的微地址。
  • **微指令地址寄存器(μPC)**:指出当前微指令在CM中的地址。
  • **控制存储器(CM)**:存放各指令对应的微程序。
  • **微指令寄存器(μIR)**:存放从CM取出的微指令。

工作过程

  1. 取指令公共操作:将取指微程序的入口地址(通常为0)送入μPC,从CM读出微指令到μIR,执行后机器指令装入IR。
  2. 根据IR的操作码,由地址发生器产生该机器指令对应的微程序入口地址,送入μPC。
  3. 每来一个时钟,μPC自动增值(或根据转移控制改变),从CM读出微指令到μIR,译码后产生微命令送入数据通路。
  4. 微指令中的“转移控制”字段送到转移地址发生器,根据条件码等产生新的微地址送入μPC。

微程序执行需解决的问题

  • 微指令的格式和微命令编码方式。
  • 下一条微指令地址的确定。

5.3.2.3 微指令的编码方式

方式 描述 特点
直接控制方式 控制字段的一位对应一个微命令 简单、执行快,但微指令字长过长,利用率低
字段直接编码 将微指令分为若干字段,互斥性微命令放在同一字段,相容性放在不同字段;每个字段独立编码 需译码,速度稍慢;每个字段留出全0表示无微命令
字段间接编码 某一字段的具体含义由另一字段决定 进一步压缩长度,但译码复杂,时间开销大

5.3.2.4 微指令地址形成方式

  1. 断定方式:微指令中直接给出下一条微指令的地址(后继地址字段)。
  2. 根据机器指令的操作码生成:IR中的操作码经地址发生器生成对应微程序的首地址。
  3. 增量计数器法:顺序执行时,(μPC)+1 → μPC。
  4. 根据各种标志:决定下一条微指令转移的地址。
  5. 硬件直接产生:如电源加电后,取指微程序入口地址由硬件产生。

5.3.2.5 微指令的格式

  • 水平型微指令:定义并执行多个并行操作的微命令。微程序短、并行能力强、执行快,但微指令较长。直接编码、字段直接编码、字段间接编码均属水平型。
  • 垂直型微指令:只能定义并执行一种微命令。微指令短、规整,但微程序长、执行慢。

5.3.3 硬布线控制器

  • 由组合逻辑门电路和触发器构成,根据指令、时序及状态按时间顺序发送微操作控制信号。
  • 控制信号产生依据:当前指令操作码、当前节拍、执行单元反馈标志。
  • 特点:速度快,但电路复杂,不易修改。
  • 只需掌握基本特点及运行原理,重点学习微程序控制器。

5.3.4 微程序控制器与硬布线控制器对比

对比项 微程序控制器 硬布线控制器
工作原理 微操作以微程序形式存放在CM中,执行时读出 微操作由组合逻辑电路根据指令、状态和时序即时产生
执行速度
应用场合 CISC CPU RISC CPU
易扩充性 易扩充 难扩充

5.4 异常和中断

5.4.1 基本概念

  • 异常:CPU内部产生的意外事件,与当前执行的指令有关。
  • 中断:CPU外部设备发出的中断请求,与当前执行的指令无关。

处理过程:CPU在执行第k条指令时检测到异常或执行完第k条指令后检测到中断请求 → 打断当前程序 → 转异常/中断处理程序 → 处理完毕返回第k条或第k+1条指令继续执行(若致命错误则终止)。

5.4.2 分类

1. 异常

  • 故障:在指令启动后、执行结束前检测到的异常(如非法操作码、缺页、除数为0)。断点为当前指令地址。
  • 自陷(陷阱):程序预先安排的异常事件(如系统调用)。执行完自陷指令后处理,返回下一条指令(转移指令除外)。
  • 终止:硬件故障导致程序无法继续执行(如电源掉电)。

2. 中断

  • 可屏蔽中断:通过INTR线发出,可通过中断控制器屏蔽。
  • 不可屏蔽中断:通过NMI线发出,优先级最高,不可屏蔽。
  • 每条指令执行完后,CPU查询中断请求,有则保存断点,转中断服务程序。

5.4.3 异常和中断响应过程

响应过程(中断隐指令,硬件实现):

  1. 关中断:设置中断允许标志IF=0,防止嵌套。
  2. 保存断点和程序状态:将PC和PSW保存到栈或寄存器中(支持嵌套则保存到栈)。
  3. 识别异常/中断并转处理程序
    • 软件识别:CPU设置异常状态寄存器,操作系统查询寄存器按优先级处理。
    • 硬件识别(向量中断):每个异常/中断有类型号,中断向量表存储处理程序首地址,根据类型号直接定位。

整个响应过程不可打断。响应结束后,CPU执行中断服务程序,直至中断返回。

5.5 指令流水线

5.5.1 基本概念

将一条指令的执行过程分成若干阶段,各阶段由不同功能部件完成,多条指令重叠执行。

典型五段流水线(408常考):取指(IF)、译码(ID)、执行(EX)、访存(MEM)、写回(WB)。

适合流水线的指令集特征

  • 指令长度尽量一致。
  • 指令格式规整(源寄存器位置相同)。
  • LOAD/STORE型指令(只有访存指令访问存储器)。
  • 数据和指令按边界对齐存放。

5.5.2 流水线的基本实现

1. 设计原则

  • 流水段个数以最复杂指令所用功能段个数为准。
  • 流水段长度以单段所花时间最长的操作为准(决定时钟周期)。

2. 逻辑结构

  • 每个流水段后增加流水段寄存器,锁存本段处理完的数据,供下一段使用。
  • 统一时钟CLK同步,每来一个时钟,各段处理完的数据锁存到段尾寄存器。

3. 时空图

横坐标时间,纵坐标功能段,直观描述指令在流水线中的执行情况。

5.5.3 流水线的冒险与处理

1. 结构冒险

  • 原因:硬件资源冲突(如指令和数据共用存储器、寄存器读写冲突)。
  • 解决
    • 暂停一个时钟周期(插入气泡)。
    • 设置独立部件(如指令Cache和数据Cache分离;寄存器读口和写口独立)。

2. 数据冒险

  • 原因:后续指令需要前面指令的结果,但结果尚未产生(写后读RAW)。
  • 解决
    • 延迟执行:插入空操作(nop)或硬件阻塞(stall)。
    • 转发技术(旁路):将中间结果直接转发到ALU输入端。
    • load-use数据冒险:紧邻的运算类指令依赖load结果,无法转发,需插入一条nop。

3. 控制冒险

  • 原因:转移指令改变PC值,造成断流。
  • 解决
    • 插入nop或硬件阻塞。
    • 分支预测:静态预测(总是预测条件不满足)或动态预测(根据历史)。

5.5.4 流水线的性能指标

  • **吞吐率(TP)**:单位时间内完成的任务数。
    $TP = \frac{n}{T_k}$,其中n为任务数,$T_k$为总时间。
  • **加速比(S)**:不使用流水线与使用流水线所用时间之比。
    $S = \frac{T_0}{T_k}$

5.5.5 高级流水线技术

技术 描述 CPI
超标量 动态多发射,每个时钟周期并发多条指令,需多个功能部件,可乱序执行 <1
超长指令字 静态多发射,编译器将多条并行操作组合成一条超长指令字 <1
超流水线 提高主频,将流水段进一步细分 =1

5.6 多处理器的基本概念

5.6.1 SISD、SIMD、MISD、MIMD

类型 指令流 数据流 说明
SISD 传统串行计算机(单处理器,可流水线)
SIMD 数据级并行,一个指令控制多个处理单元处理不同数据(如向量处理器)
MISD 不存在
MIMD 线程级并行。分为多计算机系统(消息传递)和多处理器系统(共享存储)

5.6.2 硬件多线程

  • 为每个线程提供独立的通用寄存器组、PC等,线程切换只需激活寄存器,开销小。
  • 细粒度多线程:每个时钟周期切换线程,指令乱序并行。
  • 粗粒度多线程:连续多个时钟周期执行同一线程,仅在阻塞时切换(如Cache缺失),切换开销大。
  • **同时多线程(SMT)**:同一时钟周期发射多个不同线程的多条指令(如Intel超线程)。

5.6.3 多核处理器的基本概念

  • 将多个处理单元(核)集成到单个CPU中,每个核可有自己的Cache或共享Cache。
  • 所有核对称,共享主存储器,属于共享存储的对称多处理器。
  • 多核上的多线程是物理并行,单核上的多线程是交错执行。

5.6.4 共享内存多处理器(SMP)

  • 具有共享单一物理地址空间的多处理器,处理器通过共享变量通信。
  • UMA(统一存储访问):所有处理器访问存储器的速度相同。
  • NUMA(非统一存储访问):本地内存访问快,远程内存访问慢(内存控制器集成在CPU内)。
  • 需解决Cache一致性问题。