CPU 的功能和基本结构

CPU 分为两部分 (两种分法)

  • 运算器
  • 控制器
    或者
  • 数据通路
  • 控制部件

Q: 条件转移指令执行时所依据的条件来自? (某个寄存器)
A: 标志寄存器 (也可能被称为程序状态字 (Program Status Word, PSW) 或条件码寄存器 (Condition Code Register, CCR).

Q: n 位 CPU 中, n 是指?
A: CPU 中的通用寄存器位数为 n 位

为了得到下一条指令, CPU 始终要访问{程序计数器}

Q: 执行无条件, 有条件或其他各种转移指令后, CPU 为了得到下一条指令, 还要去访问程序计数器吗?
A: 必须访问, 所有跳转指令, 确保了, 下一个指令的地址还是在 PC 中
以条件转移指令为例子
执行成功: 修改 PC 的值
执行不成功: 不修改 PC 的值
但不论成功与否, 下一个指令的地址仍然是在 PC 中

指令地址有两种表达方式 (默认按照字节编址)
字节地址: {}
指令字地址: {}

CPU 中通用寄存器的位数取决于{机器字长}

Q: 为什么 CPU 中通用寄存器的位数取决于机器字长?
A: CPU 存取寄存器的数据时, 如果寄存器的长度超过了机器字长
就可能需要多个存取周期
十分不方便
当寄存器的最大位数等于机器字长的时候, 一次存取只需要一个存取周期
更加方便

Q: PSW 对所有人可见, 能够直接修改 PSW 的值吗?
A: 不可以
PSW 的值不能由普通程序直接修改, 因为它涉及处理器的状态和安全控制, 操作系统和硬件保护机制确保只有在特定条件下 (例如内核模式下) 才能进行修改, 从而维护系统的稳定性和安全性.

指令执行过程

一个完整的指令周期可包括{取指, 间址, 执行, 中断}4 个周期

中断周期中的进栈操作是将 SP {减”1”}

Q: 为什么中断周期中的进栈操作是将 SP 减”1”, 而不是传统意义上的进栈操作加”1”?
A: 原因是计算机中的堆栈都是向低地址方向增长, 所以进栈操作是减”1”而不是加”1”

Q: 不同处理器安排指令的执行 (三种处理器)
A: - 单周期
每条指令都在一个时钟周期内完成

  • 多周期
    指令需要几个周期就为其分配几个周期, 且周期可变
  • 流水线
    指令之间并行执行, 尽量让多条指令同时运行, 力争在每个时钟周期完成一条指令的执行过程

Q: 在取指周期中, 控制器需要得到相应的指令吗?
A: 不需要
控制器能够自动取指令, 不需要任何外界指令

数据通路

组成数据通路的元件主要分为{组合逻辑元件}和{时序逻辑元件}两类

Q: 组合逻辑元件与时序逻辑元件的主要区别
A: 组合逻辑元件不具有”记忆”功能
时序逻辑元件具有”记忆”功能

组合逻辑元件与时序逻辑元件的四大大区别
输入输出, 记忆单元, 时钟信号, 传输方向
组合逻辑元件:
输出仅取决于输入
不含记忆单元
不受时钟信号控制
输出与输入之间无反筑通路, 信号是单向传输的
时序逻辑元件:
输出不仅与该时刻的输入有关, 还与该时刻以前的输入有关
必然包含记忆单元
必须在时钟节拍下工作
信号可以是单向传输, 也可以是双向

CPU 内部总线

Q: CPU 内部数据通路三种总线结构
A: - 单总线
只有一条总线, 一个机器周期只能有一个部件的数据通过总线传输

  • 多总线
    多条单总线的叠加, 每条总线上, 一个机器周期只能有一个部件的数据通过该条总线传输
  • 专用数据通路方式
    用硬件电路实现

Q: 单周期 CPU 内部可以使用单总线吗?
A: 不可以
单周期要求一个时钟周期内完成一个指令的操作
而单总线一个周期内只能传输一次数据
显然是不够的

Q: 在单总线的 CPU 中, ALU 可以有几个输入端直接与总线相连?
A: 只能有一个输入端可以与总线相连, 另一输入端需通过暂存器与总线相连

Q: 为什么在单总线的 CPU 中, ALU 只能有一个输入端可以与总线相连, 另一输入端需通过暂存器与总线相连?
A: 一个时钟周期内只能传送一次数据
而 ALU 是数据通路中的组合逻辑元件, 根据组合逻辑元件的特性可知
ALU 中不存在记忆元件
所以只能一边用暂存器存下第一次总线传输来的数据, 另一边直接用 ALU 接受第二次总线传输来的数据

CPU 内部总线上信号流动的原则
每个时刻有
{一}个器件发出
{多}个器件接受

控制器

控制器的作用

  1. 取指令
  2. 找到下一条指令的地址
  3. 指令译码
  4. 产生控制信号
  5. 控制硬件与数据的流动

Q: 控制器分类
什么是硬布线控制器, 什么是微程序控制器?
A: 硬布线: 根据指令的要求, 当前的时序及内外部的状态, 按时间的顺序发送一系列微操作控制信号
微程序: 每条机器指令对应一段微程序, 微程序由一条或者多条微操作组成

Q: 机器指令, 微程序, 微指令, 微命令, 微操作之间的关系
画图
A:

Q: 存放微程序的控制存储器 (CM) 用 ROM 还是 RAM 实现? 为什么?
A: ROM
CM 中的内容显然是很少会发生变化, 要求非易失性

Q: 微程序的入口地址如何生成?
A: 机器指令的操作码, 送入到微地址形成器, 生成该机器指令对应微程序的入口地址

微指令的编码对象为微指令的{c1: 操作控制}字段

微指令的编码, 三大编码的定义

  • 直接编码: {c1: 用 0,1 表示微命令是否执行}
  • 字段直接编码: {c1: 把互斥性微命令放在同一字段中, 把相容性微命令放在不同字段中, 每个字段独立编码}
  • 字段间接编码: {c1: 一个字段的某些微命令需由另一个字段中的某些微命令来解释, 由于不是靠字段直接译码发出的微命令}

Q: 水平型微指令与垂直微指令的主要区别, 微命令的角度
A: - 水平型微指令
一条微指令定义并执行多条微命令

  • 垂直型微指令
    一条微指令定义并执行一种微命令

微指令存放在 CM 中, 那么微命令存放在那?
微命令并没有独立的存储位置
微指令从控制存储器读取出来后, 根据微命令, 直接控制硬件执行具体操作

Q: 硬布线控制器与微程序控制器相比, 谁的时序系统更加复杂?
A: 硬布线
硬布线使用了大量硬件之间的配合, 时序系统必定更复杂, 才能够保证硬件运行的时候不出错

异常与中断

根据发生的位置不同区分异常与中断
{c1: 异常}发生在 CPU 内部
{c1: 中断}发生在 CPU 外部

异常的分类

  • 软件中断:{c1: 故障},{c1: 自陷}
  • 硬件中断:{c1: 终止}

Q: 异常的定义故障, 自陷, 终止
A: - 故障 fault: 缺段, 缺页, 除数为 0 等

  • 自陷 trap: 它是预先安排的一种”异常”事件
  • 终止 abort: 发生了使计算机无法继续执行的硬件故障

Q: CPU 是如何获取异常与中断的?
A: 异常: CPU 自身完成, 不必通过外部的某个信号通知
中断: CPU 必须通过中断请求线获取中断源的信息, 才能知道哪个设备发生了何种中断

Q: 异常检测与中断检测分别在指令执行哪个阶段进行?
A: 异常: 指令执行的过程中
中断: 指令执行结束, 下一条指令执行之前

Q: Cache 缺失是一种异常吗?
A: 不是
异常发生于 CPU 内部并且由操作系统软件执行
Cache 缺失确实发生在 CPU 内部
但是, Cache 缺失硬件自动会处理, 不用操作系统软件处理

中断的断点总是下一条指令的地址
“终止”类异常的断点可以是当前指令或下一条指令的地址

异常 (三种) 与中断的断点位置总结

  • 异常:
    故障: {当前指令 (访存缺页) 或下一条指令的地址 () 或直接终止运行 (除 0)}
    自陷: {一定是下一条指令地址}
    终止: {可以是当前指令或下一条指令的地址}
  • 中断: {一定是下一条指令地址}

Q: 访存缺页是异常还是中断?
A: 异常
访存缺页异常信号由 CPU 发出, 并且由操作系统处理

Q: 存储器段错误 (读取不存在的存储地址) 是异常还是中断?
A: 异常
访存的操作是由 CPU 执行, 由 CPU 硬件检测到这个异常, 操作系统能发现是一个非法的内存访问, 并且是无法恢复的错误.

流水线

Q: 指令执行过程的 5 个流水段
A: 1. 取指 IF InstructionFetch
2. 译码 ID InstructionDecoding
3. 执行 EX Execute
4. 访存 MEM Memory
5. 写回 WB WriteBack

单周期流水线 CPU 的时钟周期设计以{执行速度最慢的指令}依据

Q: 普通流水线, 流水段寄存器中存放的是什么?
A: 在稳定流水的情况下, 各流水段寄存器都包含一条不同的指令

Q: 流水线三大冒险 (冲突) 为
A: 结构冒险 (资源冲突)
数据冒险 (数据相关)
控制冒险 (控制冲突)

流水线冲突的原因:

  • 结构冒险 (资源冲突):
    {不同指令在同一时刻争用同一功能部件}
  • 数据冒险 (数据相关):
    {前面指令写结果之前, 后面指令就需要读取}
  • 控制冒险 (控制冲突):
    {转移指令引起}

Q: 处理数据冒险的转发 (旁路) 技术
A: 设置相关转发通路, 不等前一条指令把计算结果写回寄存器, 下一条指令也不再从寄存器读,
而将数据通路中生成的中间数据直接转发到. ALU 的输入端.

Q: 什么是 load-use 数据冒险?
A: 数据冒险的一种
Load 命令, 从外存读取数据
Use 命令紧跟在 load 命令后面, 就要使用还在读取中的数据

Q: 如何避免 load-use 数据冒险?
A: 编译阶段进行优化, 调整指令顺序以避免出现 load-use 数据冒险

Q: 处理控制冒险分支预测技术
A: 编译阶段进行优化, 对转移指令进行分支预测, 尽早生成转移目标地址

流水线的性能指标
吞吐率 TP={}
加速比 S={使线使线}

流水线时间计算公式
一条 k 段流水线完成 n 个任务需要{k+n-1}个时钟周期

Q: 取指阶段和指令译码阶段需要控制信号的控制吗?
A: 都不需要
控制信号是在取指令, 指令译码之后产生的
这两个阶段没有控制信号参与

多处理器的基本概念

摆了