CSAPP-Chapter 5: 程序的执行


CSAPP

Chapter 05 程序的执行

程序执行概述

主频与时钟周期: 主频是 CPU 的“心跳频率”,它与时钟周期互为倒数($ f = 1/T $),时钟周期是 CPU 完成一个最基本动作(节拍)所需的最小时间单位。

指令周期: 是 CPU 取出并执行一条完整指令所需的时间,由于包含取指、译码、执行等多个步骤,它通常包含多个时钟周期。

指令执行过程:

  1. 取指令:根据 EIP(PC) 中的地址,从内存中取出指令,放入指令寄存器(IR)
  2. 指令译码:对 IR 中的操作码进行分析,然后生成控制信号
  3. 计算操作数地址并取操作数:根据寻址方式计算源操作数的地址(访问寄存器或内存)。
  4. 执行数据操作:在 ALU(算术逻辑单元)或加法器中对取出的操作数进行运算(如算术运算、逻辑运算)
  5. 存结果:将运算结果写回到目的位置(寄存器或内存)
  6. 计算下条指令地址:顺序:PC = 当前 PC + 当前指令长度;跳转:根据条件标志或指令要求,将目标地址写入 PC。

所有指令动能概括为下面四种基本操作:

  1. 读内存: 将数据/指令从内存单元读入寄存器。
  2. 写内存: 将数据从寄存器存入内存单元。
  3. 内部传输: 数据在寄存器之间,或寄存器与 ALU 之间传输。
  4. 运算: 在 ALU 中进行算术或逻辑运算,并将结果送回寄存器。

CPU 内部的八大关键部件:

  1. 程序计数器 (PC):永远存放即将执行的下一条指令的地址。
  2. 指令寄存器 (IR):存放当前正在执行的指令。指令必须先从内存取出放入 IR,才能送往译码器。
  3. 指令译码器 (ID):对 IR 中的操作码进行分析,解释这条指令意图,并产生译码信号
  4. 操作控制信号形成部件:综合时序信号、译码结果以及状态标志,生成具体的控制电信号来驱动各部件工作。
  5. 启停控制逻辑: 控制时钟脉冲的发生与停止,负责机器的启动和停机,是时序的基准。
  6. 时序信号产生部件: 基于时钟脉冲,产生不同指令所需的周期、节拍和工作脉冲,确保所有动作按时间顺序精准发生。
  7. 总线控制逻辑: 负责 CPU 与外部(主要是内存)的信息交换,实现对数据和地址信息的缓冲与控制。
  8. 中断机构: 专门处理异常情况和外部设备的中断请求。

CPU 与外部连接的三组总线:

  • 地址线 (Address Bus): 单向传输,由 CPU 发出,指定要访问的内存单元地址。

  • 数据线 (Data Bus): 双向传输,用于传输指令或数据。对总线和存储器来说,指令和数据在形式上没有区别,都是二进制信息,仅仅是 CPU 在不同阶段(取指 vs 执行)对其处理方式不同。

  • 控制线 (Control Bus): 传输读/写命令等控制信息。

打断程序正常执行的事件:

数据通路的基本结构和工作原理

数据通路 (Datapath): 是指令执行过程中数据所经过的路径以及路径上的部件(如 ALU、寄存器)。数据通路中专门进行数据运算的部件称为执行部件

控制器 (Control): 负责对指令译码,生成控制信号来指挥数据通路的动作。它是指令的控制部件

数据通路的基本元件:

  1. 组合逻辑元件(操作元件): 是无记忆性的逻辑部件(如 ALU、加法器),其输出仅取决于当前的输入信号,不受时钟信号的直接定时控制。
  2. 时序逻辑元件(状态元件): 是有记忆性的存储部件(如寄存器、D 触发器),其状态的更新和改变必须在时钟信号(如上升沿或下降沿)的触发下才能进行。

数据通路的结构:

  1. 单周期数据通路: 所有指令必须在一个时钟周期内完成,导致系统速度不得不迁就执行最慢的那条指令,效率较低。
  2. 单总线数据通路: 所有部件“挤”在一条总线上通信,数据必须排队依次传输,容易造成瓶颈且难以实现流水线。
  3. 三总线数据通路: 通过增加总线数量实现了数据的并行传输(如同时读取两个操作数),效率虽优于单总线,但仍难以支持现代 CPU 的流水线执行方式。

流水线方式下指令的执行

五段流水线:

  1. 取指令(IF):根据 PC 的值从存储器取出指令
  2. 指令译码(ID):产生指令执行所需的控制信号
  3. 取操作数(OF):读取存储器操作数或寄存器操作数
  4. 执行(EX):对操作数完成指定操作
  5. 写回(WB):将操作结果写入存储器或寄存器

CPI(Cycle Per Instruction):表示执行某个程序的指令平均周期数,可以用来衡量计算机运行速度。1GIPS表示每秒执行1e9条指令。

CISC(复杂指令集计算机)设计风格:

  1. **指令系统复杂:** 具有指令数量多、寻址方式多、指令格式多等特点,且使用变长操作码和变长指令字。

  2. **指令周期长:** 绝大多数指令需要多个时钟周期才能完成。

  3. **访存自由:** 各种指令都能访问存储器,除了专门的 Load/Store 指令外,运算指令也能直接访问存储器。

  4. **微程序控制:** 控制单元主要采用微程序控制方式。

  5. **编译优化困难:** 由于指令集复杂,难以通过编译优化来生成高效的目标代码。

RISC(精简指令集计算机)设计风格:

  1. **简化的指令系统:** 指令数量少、寻址方式少、指令格式少,且指令长度保持一致。

  2. **Load/Store 架构 (RR方式):** 只有 Load/Store 指令可以访问存储器,其余指令都只在寄存器之间进行操作。

  3. **指令周期短:** 采用流水线工作方式,除 Load/Store 指令外,其他简单指令通常只需一个或不到一个时钟周期即可完成。

  4. **大量通用寄存器:** 配备大量通用寄存器,以减少对存储器的访问次数。

  5. **硬连线控制:** 采用硬连线逻辑控制器,不用或少用微程序控制,以提高速度。

  6. **支持高级语言:** 采用优化的编译系统,力求有效地支持高级语言程序的编译与执行。

流水线冒险:

  1. 结构冒险 (Structural Hazard): 因硬件资源(如存储器或功能部件)不足,导致无法同时支持流水线中多条指令重叠执行而产生的硬件冲突。
  2. 数据冒险 (Data Hazard): 因指令间存在数据依赖,导致后一条指令需要用到前一条尚未写入寄存器的计算结果而产生的冲突。
  3. 控制冒险 (Control Hazard): 因执行分支或跳转指令时无法立即确定下一条指令的地址,导致流水线可能取出错误指令而产生的执行流冲突。

声明:Blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - CSAPP-Chapter 5: 程序的执行