目录
第五章(下)来啦!(上)可见博主上篇博客,觉得内容有帮助的朋友们可以点赞收藏一波~
5.5 异常和中断机制
5.5.1 异常和中断的基本概念
异常和中断是 CPU 处理异步事件的核心机制,其核心区别在于触发源和同步性:
- 异常:由 CPU 内部指令执行引发的同步事件,例如:
- 指令执行错误(如除以零、无效操作码)
- 访存越界或非法内存访问
- 系统调用(如 Linux 中的
int 0x80
)
- 中断:由外部设备或定时器触发的异步事件,例如:
- 键盘输入、鼠标点击
- 磁盘完成数据传输
- 时钟周期性中断
两者的处理流程均包括检测、响应、处理、恢复四个阶段,但异常通常与当前指令直接相关,而中断独立于当前指令。
5.5.2 异常和中断的分类
类型 | 细分类型 | 触发条件 | 典型场景 | 处理方式 |
---|---|---|---|---|
内中断(异常) | 故障(Fault) | 指令执行前检测到的错误 | 缺页错误、未对齐访存 | 修正后返回原指令 |
自陷(Trap) | 程序主动触发 | 系统调用(如 syscall )、断点调试 | 处理后继续执行下一条指令 | |
终止(Abort) | 不可恢复的严重错误 | 硬件故障、奇偶校验错误 | 强制终止程序 | |
外中断 | 可屏蔽中断 | 外部设备通过中断控制器发送信号 | 网卡接收数据、打印机完成任务 | 可通过中断掩码禁用 |
不可屏蔽中断 | 紧急事件(如电源故障) | 系统复位、硬件错误 | 必须立即响应 |
关键区别:
- 内中断的优先级通常高于外中断
- 自陷是唯一由程序主动触发的异常类型
- 终止类异常会导致程序崩溃
5.5.3 异常和中断响应过程
-
检测阶段:
- CPU 在每条指令执行结束后检查异常 / 中断标志位
- 外部中断需通过中断控制器(如 PIC/APIC)传递信号
-
保护现场:
- 保存通用寄存器、段寄存器、标志寄存器内容
- 压栈保存当前栈帧指针(SP)和程序计数器(PC)
-
跳转处理:
- 根据中断向量表(IVT)或异常类型获取处理程序入口地址
- 特权级切换(如从用户态到内核态)
-
恢复现场:
- 从中断处理程序返回时,执行
IRET
指令 - 恢复寄存器状态并跳回原程序继续执行
- 从中断处理程序返回时,执行
示例:当发生缺页异常时,CPU 会暂停当前进程,触发页错误处理程序,从磁盘加载缺失页后返回原指令重新执行。
5.6 指令流水线
5.6.1 指令流水线的基本概念
核心思想:将指令执行划分为多个独立阶段,每个阶段并行处理不同指令。
- 理想加速比:
k
阶段流水线的加速比为k
(实际因冒险降低) - 吞吐率:
1 / 时钟周期时间
(假设无阻塞)
示例:一条 5 阶段流水线(取指、译码、执行、访存、写回)可将指令执行时间从 5 个周期缩短至 1 个周期(理想情况)。
5.6.2 流水线的基本实现
典型阶段划分:
阶段 | 操作 | 所需资源 |
---|---|---|
取指(IF) | 从内存读取指令 | 指令缓存(I-Cache)、PC 寄存器 |
译码(ID) | 解析指令操作码和操作数 | 寄存器堆、指令译码器 |
执行(EX) | 算术逻辑运算或地址计算 | ALU、移位器 |
访存(MEM) | 读写数据内存 | 数据缓存(D-Cache) |
写回(WB) | 将结果写入寄存器 | 寄存器堆 |
流水线示意图:
plaintext
Cycle 1: IF1
Cycle 2: IF2, ID1
Cycle 3: IF3, ID2, EX1
Cycle 4: IF4, ID3, EX2, MEM1
Cycle 5: IF5, ID4, EX3, MEM2, WB1
...
5.6.3 流水线的冒险与处理
冒险类型 | 原因 | 典型场景 | 解决方法 |
---|---|---|---|
结构冒险 | 资源冲突(如同时访存) | 指令取指和数据访存同时发生 | 分离 I-Cache 和 D-Cache |
数据冒险 | 后续指令依赖前序指令结果 | ADD R1, R2, R3 followed by SUB R4, R1, R5 | 数据转发(Forwarding)、插入气泡(Stall) |
控制冒险 | 分支指令导致的执行路径不确定 | BEQ 指令需要判断条件 | 分支预测(静态 / 动态)、延迟槽技术 |
数据转发示例:
- 执行阶段的结果直接传递给后续指令的执行阶段
- 避免等待写回阶段完成
- 数据转发(旁路)技术:
- 转发路径:EX阶段结果直接传递给下一指令的EX阶段输入,避免等待WB阶段
- 局限性:无法解决LOAD-USE冒险,需插入气泡(暂停1周期)。
- 分支预测策略对比:
类型 准确率 硬件开销 适用场景 静态预测 低 低 简单循环(默认不跳转) 动态预测 高 高 复杂分支模式(如两位饱和计数器)
5.6.4 流水线的性能指标
指标 | 定义 | 公式 |
---|---|---|
吞吐率 | 单位时间完成的指令数 | 1 / 时钟周期时间 |
加速比 | 非流水线时间 / 流水线时间 | T_non-pipelined / T_pipelined |
效率 | 各阶段利用率的平均值 | (指令数 × 阶段数) / (阶段数 × 总周期数) |
示例:100 条指令通过 5 阶段流水线,总周期数为 104,则效率为 (100×5)/(5×104) ≈ 96.15%
。
5.6.5 高级流水线技术
-
超标量流水线:
- 每个周期发射多条指令(如 Intel Core i7 支持 4 发射)
- 需要动态调度和寄存器重命名技术
-
超流水线:
- 将阶段进一步细分(如将执行阶段拆分为 ALU1 和 ALU2)
- 主频提升但指令延迟增加
-
动态调度:
- 通过 Tomasulo 算法重排指令顺序以避免冒险
- 需保留站(Reservation Station)和重排序缓冲(ROB)
5.7 多处理器的基本概念
5.7.1 SISD、SIMD、MIMD 的基本概念
架构类型 | 指令流 | 数据流 | 并行性 | 典型应用 |
---|---|---|---|---|
SISD | 单 | 单 | 无并行 | 传统单核 CPU |
SIMD | 单 | 多 | 数据级并行(如向量运算) | GPU、数字信号处理器(DSP) |
MIMD | 多 | 多 | 任务级并行 | 多核 CPU、集群系统 |
对比示例:
- SIMD 适合矩阵乘法(同一指令作用于多个数据元素)
- MIMD 适合 Web 服务器处理多用户请求
5.7.2 硬件多线程的基本概念
技术类型 | 实现方式 | 特点 |
---|---|---|
细粒度多线程 | 交替执行多个线程的指令 | 提高资源利用率,但主频可能下降 |
粗粒度多线程 | 一个线程阻塞时切换到另一线程 | 适合长延迟操作(如访存) |
同时多线程(SMT) | 硬件支持多线程指令同时发射 | 如 Intel 超线程技术(HTT) |
5.7.3 多核处理器的基本概念
- 片上多核(CMP):多个独立核心集成在同一芯片
- 共享资源:L2/L3 缓存、内存控制器、总线
- 优势:
- 相比单核 CPU 提高并行处理能力
- 降低单核复杂度,提升能效比
- 挑战:
- 缓存一致性问题(如 MESI 协议)
- 核间通信延迟
5.7.4 共享内存多处理器的基本概念
类型 | 特点 | 典型代表 |
---|---|---|
SMP(对称多处理器) | 所有处理器共享内存和总线,地位平等 | Intel Xeon 服务器 |
NUMA(非统一内存访问) | 处理器访问本地内存更快 | AMD EPYC 服务器 |
SMP 工作原理:
- 所有处理器通过高速总线连接到共享内存
- 操作系统负责调度任务到任意处理器
- 缓存一致性协议(如 MESI)确保数据同步
缓存一致性协议MESI:
状态 | 含义 | 触发条件 |
---|---|---|
Modified | 缓存行独占且已修改 | 写入数据 |
Exclusive | 缓存行独占但未修改 | 读取未共享数据 |
Shared | 缓存行被多个核心共享 | 其他核心读取相同数据 |
Invalid | 缓存行无效 | 其他核心修改数据 |
考试重难点总结与建议
-
异常与中断对比(简答题高频考点):
- 同步性:异常与指令同步(如除零),中断异步(如外设请求);
- 响应时机:异常需立即处理,中断需等待当前指令执行完毕
- 建议:结合流程图对比两者处理流程(如保存现场步骤是否包含通用寄存器)。
-
流水线冒险解决方案(计算题重点):
- 数据冒险:掌握RAW(读后写)、WAW(写后写)、WAR(写后读)的识别与处理方法;
- 控制冒险:理解延迟槽技术(MIPS架构)与动态分支预测的硬件实现(分支目标缓冲器BTB)。
-
多核处理器设计(综合题方向):
- 缓存一致性:通过MESI协议解决多核间数据不一致问题;
- 性能优化:分析多级缓存(如L1私有、L2共享)对访存延迟的影响。
-
SIMD 与 MIMD 的并行粒度差
-
真题演练建议:
- 流水线效率计算:注意公式
效率 = (指令数×流水段数) / (总周期数×流水段数)
; - 中断嵌套过程:结合中断屏蔽字分析多重中断响应顺序(参考王道习题)。
- 流水线效率计算:注意公式