计算机组成原理
!!! info "考试重点" 本文档整理了计算机组成原理课程的核心知识点与重点,涵盖8个章节。
**最后更新:2026-06-24** | **整理人:小弟二号**
目录
一、计算机系统概述
1.1 计算机发展历史
| 时代 | 时间 | 核心技术 | 代表 |
|---|---|---|---|
| 第一代 | 1946-1958 | 电子管 | ENIAC |
| 第二代 | 1958-1964 | 晶体管 | - |
| 第三代 | 1964-1971 | 集成电路 | IBM 360 |
| 第四代 | 1971-至今 | 大规模集成电路 | 现代计算机 |
1.2 冯·诺依曼思想(核心!)
存储程序:将程序存放在计算机的存储器中
程序控制:按指令地址访问存储器并取出指令,经译码依次产生指令执行所需的控制信号
五大功能部件:
- 运算器:完成算术运算、逻辑运算
- 控制器:控制指令的执行
- 主存储器:存放程序及数据
- 输入设备
- 输出设备
💡 记忆要点:冯·诺依曼 = 存储程序 + 程序控制 + 五大部件
1.3 计算机层次结构
高级语言 (C) ← 用户层
↓ Compiler
汇编语言 (MIPS) ← 汇编层
↓ Assembler
指令集架构层 ← ISA层
↓
微代码层 ← 微程序层
↓
硬件逻辑层 ← 硬件层1.4 性能评价指标
非时间指标
- 机器字长:CPU一次能处理的二进制位数
- 总线宽度:数据总线一次能传输的位数
- 主存容量:主存能存储的二进制位数
- CPU内核数
时钟频率与时钟周期
- 核心公式:时钟周期 = 1 / 时钟频率
- 1 GHz = 1 ns(纳秒);1 MHz = 1 μs(微秒);1 kHz = 1 ms(毫秒)
- ⚠️ G→ns,M→μs,k→ms,对应关系要记住
- CPU占用率计算:CPU占用率 = 每秒花在I/O上的时间 ÷ 1秒 × 100%
- 三步走:①每秒次数 = 速率÷每次数据量 ②每秒I/O时间 = 每次时间×次数 ③占用率 = 时间÷1秒×100%
时间指标
CPI(Clock cycles Per Instruction):
CPI = \frac{\text{程序中所有指令的时钟周期数之和}}{\text{指令条数}}CPU执行时间:
CPU时间 = CPI \times IC \times T = \frac{CPI \times IC}{f}MIPS(Million Instructions Per Second):
MFLOPS(Million Floating-Point Operations Per Second):
MFLOPS = \frac{\text{浮点运算次数}}{T_{cpu} \times 10^6}💡 关键公式:CPU性能 = IPC × f(频率)
💡 MIPS单位:Mega = 10⁶, Giga = 10⁹, Tera = 10¹², Peta = 10¹⁵, Exa = 10¹⁸
二、数据信息的表示
2.0 位、字节、字的关系
三个概念
- 位(bit):最小单位,只能是 0 或 1
- 字节(Byte):8 位 = 1 字节,存储基本单位
- 字(Word):CPU 一次能处理的数据长度,取决于架构
换算关系
- 1 字节 = 8 位
- 1 字 = ? 位(架构决定):
- 16 位 CPU → 1 字 = 16 位 = 2 字节
- 32 位 CPU → 1 字 = 32 位 = 4 字节
- 64 位 CPU → 1 字 = 64 位 = 8 字节
常见误区
- ❌ 位 ≠ 字(位是最小单位,字是 CPU 处理单位)
- ✅ 1 位 = 1/8 字节
💡 速记:位是砖,字节是砖块,字是一次搬多少砖
数据单位
- SI国际单位制(10的幂次):1k=10³=1千,1M=10⁶=1百万,1G=10⁹=10亿
- 计算机二进制单位(2的幂次):1KiB=2¹⁰=1024,1MiB=2²⁰≈1048576,1GiB=2³⁰≈1073741824
- 硬盘厂商标SI,操作系统显示二进制 → 买500GB显示约465GiB
2.1 进制转换
二进制 → 八进制:从小数点向左右三位一分组
二进制 → 十六进制:从小数点向左右四位一分组
2.2 机器码表示(重点!)
原码(Signed Magnitude)
- 最高位为符号位,0正1负
- 数值位不变
- 两个机器零:+0 和 -0
反码(One's Complement)
- 符号位与原码相同
- 正数不变,负数各位取反
- 两个机器零
补码(Two's Complement)⭐
公式:
[X]_补 = \begin{cases} X & 0 \leq X < 2^n \\ 2^{n+1} + X & -2^n \leq X < 0 \end{cases}简便方法:
- 正数:直接取原码,符号位为0
- 负数:逐位取反,末位加1,符号位为1
特性:
- 只有一个零(+0 = -0)
- 加减运算统一
- 符号位参与运算
32位补码整数范围
- 范围:-2³¹ ~ 2³¹-1,即 -2,147,483,648 ~ 2,147,483,647
- 原因:补码最高位为符号位,0正1负;正数 0~2³¹-1,负数 -2³¹~-1
- 关键点:比原码多表示一个负数(-2³¹),因为补码合并了 +0 和 -0
- 实例:Java 的 int 类型就是 32 位补码
移码(Biased Notation / 变形补码)⭐
概念:变形补码 = 移码(Excess-K / Offset Binary)
公式:
- 变形补码 = 原值 + 偏移量,偏移量 = 2^(n-1)(n 为位数)
- 转换回原值:原值 = 变形补码 - 偏移量
举例(8 位,偏移量=128):
| 原值 | 移码 |
|---|---|
| -128 | 0 |
| -1 | 127 |
| 0 | 128 |
| +127 | 255 |
特点:
- 符号位反转(0=负,1=正),可直接当无符号数比较
- 用于浮点数的阶码,方便指数大小比较
用途:IEEE 754 浮点数的指数部分用移码表示
和补码区别:
| 特性 | 补码 | 移码 |
|---|---|---|
| 符号位 | 1=负 | 0=负 |
| 适合场景 | 运算 | 比较 |
💡 记忆口诀:正数三码相同,负数原码符号不变、反码各位取反、补码取反加1
2.3 定点数表示
定点整数:小数点固定在最低位之后
定点小数:小数点固定在符号位之后
表示范围(n位):
- 原码:
- 补码:
2.4 浮点数表示
IEEE 754 标准(重点!)
| 格式 | 符号位 | 阶码 | 尾数 | 总位数 |
|---|---|---|---|---|
| 单精度 | 1位 | 8位 | 23位 | 32位 |
| 双精度 | 1位 | 11位 | 52位 | 64位 |
表示公式:
- S:符号位
- M:尾数(隐含前导1)
- E:阶码(移码表示)
- Bias:偏移量(单精度127,双精度1023)
特殊值:
- 零:S=0, E=0, M=0
- 无穷大:S=0, E=255, M=0
- NaN:E=255, M≠0
IEEE 754 单精度浮点数尾数详解
- 尾数 M = 隐含的1 + 小数位f,即 M = 1.f
- 隐藏位:整数部分的1不存储,但实际运算时要加上,节省1bit存储
- 例题:43940000H → 0 10000111 00101000... → E=135-127=8, f=00101 → M=1.00101
- 计算:1.00101×2⁸ = 100101000₂ = 256+32+8 = 296
2.5 数据校验
奇偶校验
- 奇校验:数据位中1的个数 + 校验位 = 奇数
- 偶校验:数据位中1的个数 + 校验位 = 偶数
- 只能检测奇数个错误,不能纠错
海明码(Hamming Code)⭐
核心概念:
- 纠错码,能自动纠正单比特错误
- 最小码距 = 3,能纠 1 错 / 检 2 错
- 校验位位置:必须在 2 的幂次位(1, 2, 4, 8, 16...)
- 信息位位置:其他位置(3, 5, 6, 7, 9, 10...)
校验位数量:(m为数据位数,r为校验位数)
校验位负责的位(偶校验): 每个校验位 Pi 负责位置编号二进制第 i 位为 1 的位置:
- P1(第1位):负责位置二进制末位=1 的位:1, 3, 5, 7, 9, 11...
- P2(第2位):负责位置二进制倒数第2位=1 的位:2, 3, 6, 7, 10, 11...
- P4(第4位):负责位置二进制倒数第3位=1 的位:4, 5, 6, 7, 12, 13...
- P8(第8位):负责位置二进制倒数第4位=1 的位:8, 9, 10, 11, 12...
💡 速记:位置编号写成二进制,哪些位有1就归谁管
解题步骤(已知码字求正确信息位):
- 给每个位置编号,区分校验位和信息位
- 计算每个校验组的异或值(偶校验:异或=0正确,=1有错)
- 把结果按 P4 P2 P1 拼成二进制 → 即为出错位置
- 翻转该位纠错
- 去掉校验位(2的幂次位置),提取信息位
错误位置检测:
- P4 P2 P1 = 000 → 无错
- P4 P2 P1 = 011 = 3 → 第3位出错
- 翻转出错位即可纠正
例题:收到 0 1 1 0 1 0 1:
- P1组(1,3,5,7): 0⊕1⊕1⊕1=1 ← 有错
- P2组(2,3,6,7): 1⊕1⊕0⊕1=1 ← 有错
- P4组(4,5,6,7): 0⊕1⊕0⊕1=0 ← 无错
- 错误位置: P4P2P1=011=3, 第3位出错
- 纠正后信息位(3,5,6,7): 0 1 0 1
📝 解题口诀: 2的幂次放校验,其余位置放信息 每个校验管一组,异或为0就没事 P4P2P1拼一起,哪位出错就翻转它
CRC校验(循环冗余校验)
生成多项式:G(x)
编码方法:
- 数据位后补r个0(r为G(x)的最高次幂)
- 用模2除法除以G(x)
- 余数即为校验码
💡 校验能力:CRC > 海明码 > 奇偶校验
三、运算方法与运算器
3.1 补码加减法
补码加法:[X+Y]_补 = [X]_补 + [Y]_补
补码减法:[X-Y]_补 = [X]_补 + [-Y]_补
💡 关键:补码加减法符号位参与运算,结果自动为补码
3.2 溢出检测
溢出条件:两个正数相加结果为负,或两个负数相加结果为正
检测方法:
- 单符号位法:(符号位进位与最高数据位进位异或)
- 双符号位法:(两个符号位异或)
- 变形补码法:两个符号位不同即溢出
3.3 定点乘法
原码一位乘法:
- 符号位单独处理(异或)
- 数值部分用移位加法实现
补码一位乘法(Booth算法):
- 符号位参与运算
- 根据相邻两位判断操作
3.4 定点除法
原码除法:
- 符号位单独处理
- 数值部分用恢复余数法或不恢复余数法
补码除法:
- 符号位参与运算
- 加减交替法
3.5 浮点运算
浮点加减法步骤:
- 对阶:小阶向大阶看齐
- 尾数运算:加减法
- 规格化:结果规格化
- 舍入:处理精度
- 溢出判断:检查阶码
浮点运算后为什么需要规格化
目的:让结果精度最大化,保持表示唯一性
根因:尾数求和后结果可能不是规格化形式(前面有无效的 0 或 1,或者溢出)
左规:尾数为 00.0xxxx 或 11.1xxxx → 尾数左移,阶码减 1,消除多余位提高精度
右规:尾数为 01.xxxxx 或 10.xxxxx(溢出)→ 尾数右移,阶码加 1,恢复合法范围
规格化后尾数形式:正数 00.1xxxx,负数 11.0xxxx(补码表示)
本质:不规格化 = 浪费有效位 = 精度降低,规格化是必经步骤
规格化是否必须?
- IEEE 754 规定:正规数尾数必须
1.xxxxx形式(隐含前导 1),这是格式定义 - 但标准专门设计了非规格化数(subnormal):尾数
0.xxxxx,阶码全 0,用于表示接近 0 的极小数,防止下溢归零 - 考试/教材:必须规格化,考完整流程
- 硬件实现:正规数必须规格化,但标准允许非规格化数存在
- 高效计算场景:DSP、ML 加速器等可跳过规格化,用非规格化数直接算,牺牲精度换速度
- 结论:规格化是精度最优解,但不是绝对强制的,标准自己都留了"不规格化"的口子
3.6 运算器组成
ALU(算术逻辑单元):
- 完成算术运算和逻辑运算
- 核心部件:加法器
加法器类型:
- 串行进位加法器:简单但慢
- 并行进位加法器:快但复杂
- 分组并行进位加法器:折中方案
四、存储系统
4.1 存储器分类
| 分类方式 | 类型 | 特点 |
|---|---|---|
| 存储介质 | 半导体/磁/光 | 速度/容量/成本 |
| 存取方式 | 随机/顺序/直接 | 访问特性 |
| 读写功能 | ROM/RAM | 可写性 |
| 易失性 | 易失/非易失 | 断电保持 |
4.2 SRAM vs DRAM
| 特性 | SRAM | DRAM |
|---|---|---|
| 存储元件 | 触发器 | 电容 |
| 速度 | 快(<1ns) | 慢(10ns) |
| 集成度 | 低 | 高 |
| 功耗 | 高 | 低 |
| 刷新 | 不需要 | 需要 |
| 用途 | Cache | 主存 |
4.2.1 存储器访问时间量级
| 单位 | 换算 | 说明 |
|---|---|---|
| 1ms | 10⁻³ s | 毫秒,磁盘级别 |
| 1μs | 10⁻⁶ s | 微秒 |
| 1ns | 10⁻⁹ s | 纳秒,SRAM/DRAM 级别 |
| 1ps | 10⁻¹² s | 皮秒 |
典型访问时间:
- SRAM 访问时间:几ns~几十ns
- DRAM 访问时间:几十ns
- 主存(磁盘):ms 级别
💡 关键对比:SRAM 比 DRAM 快约一个数量级,磁盘比 DRAM 慢约六个数量级(百万倍),这就是 Cache 存在的意义。
4.3 存储系统层次结构
寄存器 ←→ Cache ←→ 主存 ←→ 磁盘 ←→ 光盘/磁带
KB KB~MB GB TB TB~PB
<1ns 1-2ns 10ns 10ms 10s4.4 主存组织
存储扩展:
- 位扩展:增加字长(数据位数)
- 字扩展:增加字数(地址空间)
- 字位同时扩展:两者都增加
地址计算: 芯片数 = 总容量 / 单片容量
- 地址线数 = log₂(字数)
- 数据线数 = 字长
4.4.1 存储器结构与CPU连接 — 译码器划分ROM/RAM区域
核心概念
- CPU 地址线分两路:高位(A₁₆₋₁₄)接 3:8 译码器选片选信号,低位(A₁₃₋₀)直接接芯片地址引脚选具体单元
- 3:8 译码器:3位输入 → 8个输出中的1个,每个输出覆盖 8KB 地址空间
- 片选信号 CS = 译码器输出,OE 接 MREQ#(存储器请求信号),WE 接 R/RW#(读写控制)
题目分析(18000H~1FFFFH 为 ROM)
- 总地址空间:A₁₆₋₀ = 17位 = 128KB
- ROM 区:18000H~1FFFFH = 32KB = 2 个译码器输出(Y₃ + Y₄)
- RAM 区:00000H~17FFFH = 96KB = 6 个译码器输出(Y₀~Y₂ 实际够用,图上可能示意更多组)
关键设计
- ROM 32KB 需要 15 根地址线(A₁₄₋₀),用与门合并 Y₃ 和 Y₄ 作为 CS
- RAM 16K×8 两片并联 = 16K×16(32KB/组),数据总线 D₀₋₁₅
- ROM 只读不写,没有 WE 信号;RAM 有 WE 接 R/W#
考点
- 译码器输出与地址范围的对应关系
- 与门合并多个译码器输出实现更大连续地址块
- RAM 的字扩展(两片8位并联成16位)与字节数计算
4.4.2 RAM/ROM 与 Cache 的区别(易混淆点)
- RAM 和 ROM 都是主存的一部分,不是 cache vs 主存的关系
- RAM:可读可写,断电丢失,程序运行时的工作内存
- ROM:只读,断电不丢失,存放固化程序(如 BIOS)
- Cache:CPU 和主存之间的高速缓存,对程序员透明,不在地址空间中占位置
- 图中考的是主存的地址映射和芯片选择,Cache 根本没出现
4.4.3 Cache 与 SRAM/DRAM 的关系
核心结论
- Cache = SRAM(静态随机存储器)
- 主存(内存条)= DRAM(动态随机存储器)
为什么 Cache 用 SRAM
| 特性 | SRAM | DRAM |
|---|---|---|
| 速度 | 极快(1~10ns) | 较慢(50~70ns) |
| 成本 | 贵 | 便宜 |
| 集成度 | 低(6个晶体管/位) | 高(1个晶体管+1个电容/位) |
| 需要刷新 | 不需要 | 需要(电容会漏电) |
| 用途 | Cache | 主存(内存条) |
存储体系层次(速度从快到慢)
- 寄存器 — CPU 内部,最快
- Cache — SRAM,几十 ns,容量小(L1: 32~64KB,L2: 几百KB~几MB)
- 主存 — DRAM(内存条),几百 ns,容量大
- 硬盘 — 机械/SSD,最慢但容量最大
关键点
- SRAM 不需要刷新电路(叫"静态"),DRAM 需要定期刷新(叫"动态")
- SRAM 每个位要 6 个晶体管,DRAM 只要 1 个晶体管+1 个电容,集成度差很多
- 所以 Cache 做不大但极快,主存容量大但相对慢
4.5 Cache(重点!)
程序局部性原理
- 时间局部性:刚访问的数据很快会被再次访问
- 空间局部性:刚访问的数据附近很快会被访问
Cache地址映射
直接映射:
- 主存块只能映射到Cache的固定位置
- 映射关系:Cache行号 = 主存块号 \mod Cache行数
- 优点:简单快速
- 缺点:冲突率高
全相联映射:
- 主存块可以映射到Cache的任意位置
- 优点:冲突率低
- 缺点:硬件复杂,查找慢
组相联映射:
- Cache分组,组间直接映射,组内全相联
- 折中方案
Cache替换算法
| 算法 | 策略 | 特点 |
|---|---|---|
| FIFO | 先进先出 | 简单,不反映局部性 |
| LRU | 最近最少使用 | 反映局部性,常用 |
| LFU | 最不经常使用 | 统计频率 |
| Random | 随机替换 | 最简单 |
Cache写策略
写命中:
- 写直达(Write Through):同时写Cache和主存
- 写回(Write Back):只写Cache,替换时写回主存
写不命中:
- 写分配(Write Allocate):先调入Cache再写
- 非写分配(No Write Allocate):直接写主存
Cache性能计算
命中率:H = \frac{命中次数}{总访问次数}
平均访问时间:
带多级Cache:
4.6 虚拟存储器
概念:将主存和辅存统一管理,提供比实际主存更大的地址空间
页式虚拟存储:
- 虚拟地址 → 页号 + 页内偏移
- 页表:记录虚拟页到物理页的映射
- TLB(快表):加速地址转换
五、指令系统
5.1 指令格式
指令基本格式:
| 操作码 | 地址码 |
操作码:指定操作类型
地址码:
- 三地址指令:OP A1, A2, A3
- 二地址指令:OP A1, A2
- 一地址指令:OP A1
- 零地址指令:OP
5.2 寻址方式
| 寻址方式 | 有效地址 | 特点 |
|---|---|---|
| 立即寻址 | 操作数在指令中 | 速度快,不访存 |
| 直接寻址 | EA = A | 简单,范围有限 |
| 间接寻址 | EA = (A) | 灵活,多次访存 |
| 寄存器寻址 | EA = R | 速度快 |
| 寄存器间接 | EA = (R) | 灵活 |
| 基址寻址 | EA = (B) + A | 程序重定位 |
| 变址寻址 | EA = (I) + A | 数组访问 |
| 相对寻址 | EA = (PC) + A | 程序转移 |
5.3 CISC vs RISC
| 特性 | CISC | RISC |
|---|---|---|
| 指令数量 | 多 | 少 |
| 指令长度 | 可变 | 固定 |
| 寻址方式 | 复杂 | 简单 |
| 访存次数 | 多 | 少(Load/Store) |
| 流水线 | 难优化 | 易优化 |
| 代表 | x86 | MIPS, ARM, RISC-V |
💡 RISC特点:指令少、长度固定、寻址简单、Load/Store结构
六、中央处理器
6.1 CPU组成
运算器:ALU、寄存器组、状态寄存器
控制器:PC、IR、时序发生器、操作控制器
主要寄存器:
- PC(程序计数器):存放下一条指令地址
- IR(指令寄存器):存放当前指令
- MAR(地址寄存器):存放访存地址
- MDR(数据寄存器):存放访存数据
- PSW(程序状态字):存放程序状态
6.2 指令周期
指令周期组成:
取指周期 → 执行周期 → [间址周期] → [中断周期]时序层次:
- 时钟周期(节拍):最小时间单位
- 机器周期(CPU周期):完成一次访存操作
- 指令周期:取指+执行
6.3 控制器类型
硬布线控制器
- 用组合逻辑电路产生控制信号
- 速度快,但设计复杂,不灵活
微程序控制器
- 用微指令产生控制信号
- 灵活,易于修改,但速度较慢
微指令格式:
- 水平型微指令:并行操作,效率高
- 垂直型微指令:串行操作,类似机器指令
6.3.1 CPU数据通路分析(题6.4)
题意:分析四寄存器数据通路(a=DR, b=IR, c=AR, d=PC)
关键连线:
- PC→AR 送地址;DR↔主存M 双向传数据;IR→操作控制器译码
- PC 有 +1 特征(取指后自动递增)
取指阶段:PC→AR→主存M→DR→IR;PC→PC+1
执行阶段(LDA):IR(地址)→AR→主存M→DR→AC
数据通路分析要点:
- DR有两条输出路径:回主存(写)、直送AC(加载)
- LDA不需要ALU运算,DR→AC是直送,一个时钟周期完成
💡 解题思路:先找有+1特征的寄存器确定PC,再根据连线关系推断数据流向,最后按取指/执行分别列出微操作序列。
6.3.2 ADD (R1), R0 指令执行分析(题6.23)
指令含义:(R0) + ((R1)) → (R1),R1是寄存器间接寻址
执行阶段微操作:
| 时钟周期 | 微操作 | 说明 |
|---|---|---|
| C5 | R1(地址)→MAR | 准备访问主存 |
| C6 | 读主存→MDR 且 R0→A | 并行操作,走不同数据通路 |
| C7 | MDR+A→AC | ALU做加法,结果存AC |
| C8 | AC→MDR | 准备写回 |
| C9 | MDR→主存 | 写回R1指向的地址 |
关键点:
- 读主存和 R0→A 可以并行(不同数据通路)
- 写回必须经过 MDR
- 结果存回 (R1) 指向的内存地址
💡 解题思路:寄存器间接寻址 = 先从寄存器取地址,再按地址访问内存。分析时注意哪些操作可以并行(走不同通路),哪些必须串行(走同一通路)。
6.4 流水线(重点!)
流水线原理:将指令执行过程分成多个阶段,各阶段并行执行
流水线阶段:
- IF(取指)
- ID(译码)
- EX(执行)
- MEM(访存)
- WB(写回)
流水线性能:
理想情况:
其中:n为指令数,k为流水线级数,Δt为时钟周期
加速比:
吞吐率:
流水线冲突:
- 结构冲突:硬件资源冲突
- 数据冲突:数据依赖
- 控制冲突:分支指令
数据冲突解决:
- 数据旁路(Forwarding):直接传递结果
- 插入气泡(Stall):等待数据就绪
- 编译器调度:重排指令顺序
七、系统总线
7.1 总线分类
| 分类方式 | 类型 |
|---|---|
| 传输方式 | 并行/串行 |
| 传输方向 | 单向/双向 |
| 时序控制 | 同步/异步 |
| 连接部件 | 片内/系统/外部/I/O |
片内总线与系统总线
- 片内总线 = CPU芯片内部的总线,连接寄存器↔ALU↔控制器,速度快
- 系统总线(片间总线) = CPU↔内存↔I/O设备之间的总线
- 总线 = 数据传输的公共通道,类似公路,多个部件共用这条路来通信
7.2 总线组成
数据总线:传输数据,双向
地址总线:传输地址,单向
控制总线:传输控制信号,混合
7.3 总线仲裁
集中式仲裁:
- 链式查询:简单,但对故障敏感
- 计数器定时查询:灵活,但速度慢
- 独立请求:速度快,但硬件复杂
分布式仲裁:
- 各设备自行仲裁
7.4 总线定时
同步定时:
- 统一时钟信号
- 简单快速
- 适合短距离、高速
异步定时:
- 握手协议
- 灵活可靠
- 适合不同速度设备
半同步定时:
- 结合同步和异步
八、输入输出系统
8.1 I/O方式比较(重点!)
| 方式 | CPU介入 | 数据传输 | 适用场景 |
|---|---|---|---|
| 程序查询 | 全程 | CPU | 低速设备 |
| 程序中断 | 每次传输 | CPU | 随机事件 |
| DMA | 开始和结束 | DMAC | 成组数据 |
| 通道 | 开始和结束 | 通道处理器 | 复杂I/O |
8.2 程序中断方式
中断处理过程:
- 中断请求
- 中断判优
- 中断响应
- 保存现场
- 执行中断服务程序
- 恢复现场
- 中断返回
中断分类:
- 外部中断:I/O设备、定时器
- 内部中断(异常):溢出、除零、缺页
中断隐指令
- 不是真正的指令,是硬件自动完成的操作,程序员看不到
- 包括:①关中断 ②保护断点(PC和PSW)→ 保存到堆栈或特定寄存器
- ⚠️ 保存通用寄存器 → 不是中断隐指令做的,是中断服务程序做的
中断屏蔽字
- 每个中断处理程序运行时设置自己的屏蔽字
- 1 = 屏蔽(禁止该中断打断自己);0 = 不屏蔽
- 原则:正在处理某个中断时,只能被优先级更高的中断打断
- 硬件响应优先级是固定的(如L0>L1>L2>L3),但可以通过屏蔽字改变处理优先级
8.3 DMA方式
DMA(Direct Memory Access,直接内存访问):让外设绕过CPU,直接和内存交换数据
没有DMA时:外设→中断→CPU处理→CPU逐字节搬运,全程占用CPU,效率极低
有DMA时:外设→DMA控制器→直接读写内存,搬完通知CPU。核心:绕过CPU,直接搬数据,搬完通知CPU
DMA工作过程:
- CPU初始化DMA控制器
- DMAC接管总线
- DMAC直接在内存和外设之间传输数据
- 传输完成后DMAC向CPU发中断
DMA传送方式:
- 停止CPU访问:CPU停止工作
- 周期挪用:CPU让出一个总线周期
- 交替访问:DMA和CPU交替访问
DMA总线:DMA控制器专用的传输通道,与系统总线共享物理线路
8.4 通道方式
通道类型:
- 选择通道:连接高速设备
- 数组多路通道:连接多台高速设备
- 字节多路通道:连接多台低速设备
通道与DMA区别:
- DMA需要CPU初始化,通道有自己的通道程序
- 通道可以处理更多I/O细节,进一步减轻CPU负担
8.5 经典例题:I/O 方式性能计算(题9.8)
已知条件
| 参数 | 值 |
|---|---|
| 主频 | 500MHz → 时钟周期 = 1/500M = 2ns |
| CPI | 4 |
| 设备 A 传输速率 | 2MB/s |
| 设备 B 传输速率 | 40MB/s |
| 数据缓冲寄存器 | 32 位(4 字节) |
核心公式
CPU占用率 = 每秒花在 I/O 上的时间 ÷ 1 秒 × 100%
三步走:①每秒次数 = 速率÷每次数据量 ②每秒I/O时间 = 每次时间×次数 ③占用率 = 时间÷1秒×100%
第(1)题:定时查询 I/O 方式(设备 A)
① 最多间隔多长查询一次?
设备 A 速率 2MB/s,缓冲寄存器 4 字节:
缓冲区存满时间 = 4B ÷ 2MB/s = 2μs
必须在 2μs 内查询一次,否则数据溢出丢失。
② CPU 用于设备 A 的时间占比?
每次查询至少执行 10 条指令:
10 条 × 4 周期/条 = 40 个时钟周期
每次查询耗时 = 40 × 2ns = 80ns
每秒查询次数 = 2MB ÷ 4B = 50 万次
CPU 占用时间 = 50 万 × 80ns = 40ms/s
占比 = 40ms / 1s = 4%
第(2)题:中断 I/O 方式(设备 B)
① 每秒中断次数
40MB/s ÷ 4B/次 = 1000 万次/秒
② 每次中断的 CPU 开销
400 周期 × 2ns = 800ns/次
③ CPU 占用
1000 万 × 800ns = 8s/s = 800%
800% >> 100%,CPU 根本扛不住! 所以设备 B 不能用中断 I/O 方式。
核心原因:B 速率太快(40MB/s),但每次只传 4 字节,导致中断太频繁。1 秒里 CPU 要花 8 秒干这事 → 不可能。
第(3)题:DMA 方式(设备 B)
① 每秒 DMA 次数
每次传送 1000B,速率 40MB/s:
40MB/s ÷ 1000B = 40000 次/秒
② 每次 DMA 的 CPU 开销
预处理 + 后处理共 500 周期:
500 × 2ns = 1000ns/次
③ CPU 占用
40000 × 1000ns = 40ms/s
占比 = 40ms / 1s = 4% ✅
三种方式对比(设备 B)
| 方式 | CPU 占用 | 能否使用? |
|---|---|---|
| 定时查询 | 更高 | ❌ |
| 中断 I/O | 800% | ❌ 不可能 |
| DMA | 4% | ✅ 完全可以 |
💡 核心结论:高速设备必须用 DMA,中断方式只适合低速设备。DMA 一次传 1000 字节,中断次数直接降了 250 倍(1000万→4万),CPU 就轻松了。
公式速查表
性能指标
| 公式 | 说明 |
|---|---|
| 平均CPI | |
| CPU时间 = \frac{CPI \times IC}{f} | CPU执行时间 |
| 每秒百万指令 | |
| CPU性能 = IPC \times f | 性能决定因素 |
| CPU占用率 = \frac{每秒I/O时间}{1秒} \times 100\% | I/O设备CPU占用率 |
Cache
| 公式 | 说明 |
|---|---|
| 平均访问时间 | |
| H = \frac{命中次数}{总次数} | 命中率 |
流水线
| 公式 | 说明 |
|---|---|
| 流水线时间 | |
| 加速比 | |
| 吞吐率 |
浮点数
| 公式 | 说明 |
|---|---|
| IEEE 754 | |
| Bias(单精度) = 127 | 偏移量 |
| Bias(双精度) = 1023 | 偏移量 |
记忆口诀汇总
核心口诀
- 冯·诺依曼:存储程序、程序控制、五大部件
- 补码:正数不变,负数取反加1
- 溢出检测:双符号位异或
- Cache:时间局部性、空间局部性
- RISC:指令少、长度固定、Load/Store结构
- 流水线:IF → ID → EX → MEM → WB
- I/O方式:查询→中断→DMA→通道(CPU介入越来越少)
范式判断
- 直接映射:固定位置,简单快速
- 全相联映射:任意位置,灵活复杂
- 组相联映射:折中方案
中断处理
- 中断请求
- 中断判优
- 中断响应
- 保存现场
- 执行服务程序
- 恢复现场
- 中断返回
最后更新:2026-06-24 | 整理人:小弟二号