适用范围:计算机组成原理 · 第七章 · I/O 系统
考点覆盖:程序查询 / 中断 / DMA · 异步串行通信 · 磁盘存取 · Cache 缺失 · 多体交叉存储
核心思想:先认题型 → 找对公式 → 统一单位 → 按链条推导
快速导航(先看这里!)
| 题型 | 关键词 | 跳转 |
|---|---|---|
| 程序查询/中断/DMA CPU 占比 | ”占 CPU 时间”、“百分比”、“传输速率 MB/s” | 第一类 |
| 异步串行通信帧 + 中断耗时 | ”异步串行”、“ASCII”、“停止位”、“多少个时钟周期” | 第二类 |
| 磁盘存取时间 + 地址编码 | ”磁道”、“扇区”、“rpm”、“平均存取时间” | 第三类 |
| Cache 缺失 + 缺页 + 带宽 | ”命中率”、“缺失次数”、“主存带宽”、“缺页率” | 第四类 |
| 多体交叉存储最大带宽 | ”低位交叉”、“体数”、“存取周期”、“最大带宽” | 第五类 |
万能基础公式(所有题型共用)
MIPS 与时钟周期换算
| 符号 | 含义 | 常见单位 |
|---|---|---|
| CPU 主频 | Hz / MHz | |
| CPI | 每条指令平均消耗的时钟周期数 | 无 |
| MIPS | 每秒执行百万条指令 | 无 |
| 单个时钟周期的时长 | s / ns |
记忆口诀:主频除以 CPI 就是 MIPS,主频倒数就是一个周期。
第一类题型:I/O 方式与 CPU 时间占用率
如何识别这类题?
- 题目给出:CPU 主频、CPI、外设数据传输速率、I/O 缓冲区大小、中断/查询处理指令数
- 问:CPU 用于该 I/O 的时间占百分之几?
解题路线图(万能四步法)
第一步:确定单次传输数据量(读清题目,是字节/字/块?)
↓
第二步:计算 1 秒内发生的次数 N
N = 外设传输速率(B/s)÷ 单次传输数据量(B)
↓
第三步:计算单次 CPU 开销周期数 C_单次
程序查询:C = 查询指令数 × CPI
中断方式:C = 硬件响应周期 + 服务程序指令数 × CPI
DMA 方式:C = 预处理周期 + 后处理周期(数据搬运不算CPU!)
↓
第四步:代入公式求占比
CPU 占比 = (N × C_单次) / f
核心公式
| 符号 | 含义 |
|---|---|
| 1 秒内发生 I/O 请求(中断/查询/DMA)的总次数 | |
| 单次 I/O 事件中 CPU 消耗的时钟周期数 | |
| CPU 主频(= 1 秒内 CPU 总时钟周期数) |
三种方式对比表
| I/O 方式 | 传输单位 | 单次 CPU 开销 | N 的计算分母 |
|---|---|---|---|
| 程序定时查询 | 字/字节(缓冲区大小 ) | 查询指令数 × CPI | |
| 中断方式 | 字/字节(缓冲区大小 ) | + 服务程序指令数 × CPI | |
| DMA 方式 | 数据块(块大小 ) | 预处理周期 + 后处理周期 |
特殊考点:中断方式能否使用?
判断步骤:
- 算出
- 若 (即占比 > 100%)→ 不能使用中断,会发生”中断风暴”导致数据丢失
答题模板:“设备 X 不能采用中断方式。原因:每秒中断次数 次,处理每次中断需 个时钟周期,共需 个时钟周期,超过 CPU 1 秒总周期数 (负荷达 %),CPU 无法及时响应,必然丢失数据。“
易错点
- 速率单位按十进制:(不是 !)
- 存储容量按二进制:(不是 !)
- DMA 的数据传输时间不算 CPU 开销:数据在硬件总线上跑,CPU 仅计预处理+后处理
经典例题(2009、2018 统考真题)
例1(中断 vs DMA):CPU 主频 ,CPI = 5。外设速率 ,中断方式,传输单位 32 位,中断服务程序 18 条指令,其他开销 2 条指令。
解题过程:
- 传输单位:
- 次/秒
- 周期
- CPU 占比
例2(定时查询):主频 ,CPI = 4,设备 A 速率 ,32 位缓冲区,每次查询 10 条指令。
- 最长查询间隔:
- 次
- 周期
- CPU 占比
第二类题型:异步串行通信帧结构与中断耗时
如何识别这类题?
- 题目给出:“异步串行通信”、“ASCII 码”、“n 位数据位”、“校验位”、“停止位”
- 问:一共传输几位?每秒传几个字符?完成任务共用多少时钟周期?
解题路线图
第一步:算帧总位数
1(起始位,必须加!)+ 数据位 + 校验位(0 或 1)+ 停止位
↓
第二步:算外设每秒最多送字符数(最大字符率)
= 1 / 外设单次准备时间 t_外设
↓
第三步(时钟周期换算):
外设准备周期数 C_外设 = t_外设 × f
↓
第四步:分别算"完成任务总周期"和"CPU 占用周期"
总周期 ≈ N × C_外设 (外设慢,它决定总时间)
CPU 周期 = N × C_单次中断
核心公式
帧结构:
时钟换算:
| 符号 | 含义 |
|---|---|
| 外设从启动到数据准备好的物理时间(s 或 ms) | |
| CPU 主频 | |
| 外设准备一个字符期间,CPU 走过的时钟周期数 |
并行重叠模型(中断方式的精髓):
| 符号 | 含义 |
|---|---|
| 需要传输的字符总个数 | |
| 每次中断 CPU 花费的总周期(硬件响应 + 软件执行) | |
| 中断响应(隐指令)消耗的周期 |
关键理解:外设独立准备数据期间,CPU 早已执行完中断服务程序并回去跑主程序了(因为 CPU 重启外设只需极少周期,远小于外设准备时间)。所以”完成任务总时间”由外设决定,“CPU 占用时间”只算中断处理的时间。
中断响应阶段(隐指令)三步骤
遇到”中断响应阶段 CPU 做了什么”的问答题,背这三步:
- 关中断:将中断允许触发器置 0,屏蔽后续中断
- 保护断点:将 PC(程序计数器)和 PSW(程序状态字)压栈或存入专用寄存器
- 引出中断服务程序:根据中断向量找到服务程序入口地址,送入 PC
易混淆:
- “保护断点”(PC、PSW)→ 硬件自动完成,发生在中断响应阶段
- “保护现场”(通用寄存器)→ 软件(服务程序开头)完成,发生在中断服务程序执行阶段
易错点
- 起始位必须有:异步通信帧哪怕题干不提,也必须加 1 位起始位!漏算则全部位数计算出错
- 区分”总时间”和”CPU 时间”:总时间 = 外设决定(大);CPU 时间 = N × 单次中断周期(小得多)
- 保护现场 ≠ 保护断点:回答”中断响应阶段”只写”保护断点”,不要写”保存通用寄存器”
经典例题(2016 统考真题)
CPU 主频 ,CPI = 4。设备采用异步串行通信传送 7 位 ASCII 码,有 1 位奇校验和 1 位停止位,外设每准备一个字符需 。中断方式:中断响应 10 个周期,服务程序 20 条指令(第 15 条启动外设),需传 1000 个字符。
第一问:帧位数与最大字符率
第二问:完成任务总周期
第三问:CPU 占用周期
第三类题型:磁盘物理寻址与平均存取时间
如何识别这类题?
- 题目给出:盘片数、磁道数、扇区数、扇区大小、转速 rpm、平均寻道时间
- 问:地址字段各几位?平均存取时间?DMA 请求几次?
解题路线图
第一步(地址编码):
盘面号位数 = ⌈log₂(盘片数 × 记录面数)⌉ ← 注意双面=×2
磁道号位数 = ⌈log₂(每个盘面的磁道数)⌉
扇区号位数 = ⌈log₂(每个磁道的扇区数)⌉
↓
第二步(存取时间三段式):
T_周 = 60 / r(秒/转)
Ts = 题目给出的平均寻道时间
Tr = T_周 / 2(平均旋转延迟 = 半转时间)
Tt = T_周 / 每磁道扇区数(单扇区传输时间)
T_存取 = Ts + Tr + Tt
↓
第三步(DMA 请求次数):
N_DMA = 扇区大小(B)/ 缓冲区大小(B)
核心公式
CHS 地址字段位数:
技巧:位数 = ,意思是找最小的 使得 。
例:20000 条磁道,,所以需要 15 位。
平均存取时间三段式:
| 符号 | 含义 |
|---|---|
| 寻道时间:磁头臂移动到目标磁道的时间(题目直接给) | |
| 平均旋转延迟:磁头等待目标扇区转到正下方的时间(按半周计算) | |
| 传输时间:目标扇区完整划过磁头所需时间 | |
| 磁盘转速(rpm:转/分钟) | |
| 每条磁道包含的扇区总数 |
DMA 请求次数:
| 符号 | 含义 |
|---|---|
| 单个扇区的数据容量(Byte) | |
| DMA 接口数据缓冲寄存器大小(Byte) |
DMA 总线优先级问答
问:DMA 控制器和 CPU 同时需要访问总线,谁优先?
答:DMA 控制器优先级高于 CPU。
原因:磁盘是高速旋转的物理设备,若 DMA 请求得不到及时响应,缓冲区数据会被后续到达的数据覆盖,造成不可挽回的数据丢失;而 CPU 延迟访问总线只会暂停流水线几个周期,不会导致数据错误。
易错点
- 双面盘片要乘 2:“4 个双面盘片”= 8 个盘面, 位(不是 2 位!)
- 不要漏加:很多人只写"",忘了加单扇区传输时间 (虽然小但必须写)
- 位数用 ,不是直接除以 10:20000 不等于 15,要找 的最小
经典例题(2022 统考真题)
4 个双面盘片,每盘面 20000 磁道,每磁道 500 扇区,每扇区 512 B,转速 7200 rpm,平均寻道时间 5 ms。
地址字段:
- 盘面号: 面,
- 磁道号:()
- 扇区号:()
平均存取时间:
DMA 请求次数(64 位缓冲区 = 8 B):
第四类题型:Cache 缺失、主存带宽与缺页/DMA 综合
如何识别这类题?
- 题目给出:MIPS 或主频+CPI、每条指令平均访存次数、Cache 命中率、块大小
- 追加:缺页率、页面大小、磁盘缓冲寄存器大小
- 问:缺失次数?主存带宽?缺页次数?DMA 请求次数?
解题路线图(分层推导链条)
主频 f + CPI
→ MIPS = f / (CPI × 10⁶)
→ 每秒执行指令数 I = MIPS × 10⁶
→ 每秒访存次数 = I × n_访存
→ 每秒 Cache 缺失次数 N_miss = 每秒访存次数 × (1 - H)
→ 主存最小带宽 B_主存 = N_miss × S_block(Byte/s)
→ 每秒缺页次数 N_缺页 = N_miss × P_缺页
→ 每秒 DMA 请求次数 N_DMA = N_缺页 × (S_page / W_buf)
核心公式(链式推导,每步都要写)
MIPS:
每秒 Cache 缺失次数:
| 符号 | 含义 |
|---|---|
| 平均每条指令访问存储器的次数 | |
| Cache 命中率(如 99% = 0.99) | |
| Cache 缺失率 |
主存最小带宽(满足 Cache 缺失时的数据调入需求):
| 符号 | 含义 |
|---|---|
| Cache 与主存之间交换的块大小(Byte) |
每秒缺页次数:
关键:缺页率的基数是”Cache 缺失次数”(即访问主存的次数),不是总访存次数!
每秒 DMA 请求次数(缺页导致的磁盘读入):
| 符号 | 含义 |
|---|---|
| 缺页率(访问主存时缺页的概率) | |
| 虚存页面大小(Byte,按二进制:) | |
| 磁盘 I/O 接口数据缓冲寄存器大小(Byte) |
易错点
- 缺页率计算基数错误(高频错误!):缺页发生在”访问主存”时,即 Cache Miss 之后,所以 ,而不是乘以总访存次数
- 块大小和页面大小单位:均为存储容量,用二进制()
- 带宽和速率:MB/s 等速率单位用十进制()
经典例题(2012 统考真题)
CPU 主频 ,CPI = 4,平均每条指令访存 1.5 次,Cache 块大小 16 B,Cache 命中率 99%,总线宽度 32 位。缺页率 ,页面 4 KB,磁盘缓冲区 32 位。
推导链:
第五类题型:多体低位交叉存储最大带宽
如何识别这类题?
- 题目给出:体数 、总线宽度 、存储体存取周期
- 问:主存最大带宽?
解题思路
多体低位交叉存储器采用流水线方式: 个存储体依次错开 时间启动,每隔 就能输出一个字,效果等同于存取周期缩短到 。
体0:[---T---]
体1: [---T---]
体2: [---T---]
体3: [---T---]
↑↑↑↑
每隔 τ = T/m 就有一个字输出
核心公式
| 符号 | 含义 |
|---|---|
| 存储体数(模块数) | |
| 总线宽度 / 单模块每次输出字长(Byte) | |
| 单个存储体的存取周期(ns) | |
| 各模块顺序启动的时间间隔() | |
| 主存流水线最大带宽(Byte/s) |
记忆口诀:带宽 = 总线宽度 ÷ 模块启动间隔 = m 个模块宽度 ÷ 一个完整存取周期
经典例题(2012 统考真题)
4 体低位交叉存储,每 周期启动一体,存取周期 ,总线宽度 32 位。
全局总结:看到题目这样想
看到 "传输速率" + "CPU 占比"
→ 第一类:1秒基准法,N × C_单次 / f
看到 "异步串行" + "ASCII" + "停止位"
→ 第二类:先数帧位数(别忘起始位!),再分别算总时间和CPU时间
看到 "磁道" + "扇区" + "rpm" + "存取时间"
→ 第三类:三段式 Ts + Tr + Tt,地址位数用 log₂ 向上取整
看到 "命中率" + "缺失次数" + "主存带宽"
→ 第四类:链式推导,缺页基数是 Cache 缺失次数
看到 "低位交叉" + "体数" + "最大带宽"
→ 第五类:B_max = m×W / T
关键公式速查表
| 题型 | 核心公式 | 注意事项 |
|---|---|---|
| MIPS | f 单位为 Hz | |
| I/O CPU 占比 | 速率用十进制 M | |
| 最长查询间隔 | — | |
| 串行帧位数 | 起始位必加 | |
| 任务总周期 | 外设决定 | |
| CPU 占用周期 | 仅中断处理 | |
| 磁道/扇区位数 | 二进制向上取整 | |
| 旋转延迟 | 半周 | |
| 传输时间 | — | |
| Cache 缺失次数 | — | |
| 主存带宽 | — | |
| 缺页次数 | 基数是缺失次数! | |
| DMA 请求次数 | — | |
| 交叉存储带宽 | W 单位统一为 Byte |
高频易错点汇总
| 错误类型 | 错误做法 | 正确做法 |
|---|---|---|
| 速率单位 | ||
| 容量单位 | ||
| 帧位数漏起始位 | 7+1+1=9 位 | 1+7+1+1=10 位 |
| 双面盘片 | 4 片=4 盘面 | 4 片=8 盘面 |
| 缺页率基数 | 用总访存次数算 | 用 Cache 缺失次数算 |
| 磁盘地址位数 | 直接用 log 10 | 用 |
| DMA CPU 开销 | 包含数据传输时间 | 仅预处理+后处理 |
| 存取时间漏 Tt | Ts + Tr | Ts + Tr + Tt |
| 中断能否使用 | 定性说”太快了” | 算出占比>100% 再下结论 |
| 保护断点vs保护现场 | 混淆两个阶段 | 断点=硬件=响应阶段;现场=软件=服务程序 |