第 7 章 输入输出系统
本章地位:I/O 方式是组成原理与操作系统的交汇处,也是组成原理主观题的最后一块高地——「主机太快、外设太慢」的矛盾催生了程序查询 → 程序中断 → DMA 三种方式的演进,408 真题沿着这条主线反复出题:屏蔽字设计与中断嵌套次序分析出过大题,DMA 与中断的对比、向量地址辨析、隐指令三件事是选择题常客,CPU 用于 I/O 的时间占比计算(2010 年真题)是必会送分计算。本章按「接口 → 三种方式 → 总对比」推进,所有计算均代入具体数值逐步核对。
| 考点 | 常考题型 | 热度 | 对应小节 |
|---|---|---|---|
| I/O 接口功能与端口编址 | 选择题 | ★★★★ | 7.1 |
| 程序查询 CPU 效率计算 | 选择 / 计算 | ★★★ | 7.2 |
| 中断判优、响应条件、隐指令、向量地址 | 选择题 | ★★★★ 高频 | 7.3 |
| 多重中断与屏蔽字矩阵 | 综合大题 / 选择 | ★★★★★ 必考 | 7.3 |
| DMA 三种传送方式、三阶段、与中断对比 | 选择 / 计算 | ★★★★★ 必考 | 7.4 |
| 三种方式总对比 | 选择题 | ★★★★ | 7.5 |
7.1 I/O 系统与 I/O 接口
7.1.1 I/O 系统的组成
- I/O 硬件:外部设备本身(机械 / 电气部分)、设备控制器 / I/O 接口(设备与主机间的「翻译官 + 中转站」)、I/O 总线及相关控制逻辑;
- I/O 软件:设备驱动程序、用户 I/O 程序以及操作系统中的 I/O 管理模块(操作系统科目详述)。
7.1.2 I/O 接口的功能与基本结构
- 地址译码与设备选择:对地址总线上的端口地址译码,选中本设备(及本端口);
- 数据缓冲:用数据缓冲寄存器 DBR 暂存数据,匹配 CPU 与设备之间的速度差;
- 信号格式转换:串—并转换、电平转换、模拟 / 数字转换等,适配设备侧的电气与数据格式;
- 传送状态与控制信息:反映设备「忙 / 就绪 / 错误」等状态,接收 CPU 的命令;
- 中断请求逻辑(具备中断能力的接口):设备就绪时向 CPU 发中断请求。
- 数据缓冲寄存器 DBR(数据口):暂存主机与设备交换的数据,实现速度匹配——主机与设备交换的数据必须经过它中转;
- 状态 / 控制寄存器(状态口 / 控制口,有些机器两者合一):状态寄存器记录设备情况,典型位有完成位 D(数据就绪)、忙位 B(设备正在工作)、屏蔽位 MASK;控制寄存器接收 CPU 写入的命令码(启动、读 / 写等);
- 地址译码与设备选择电路:决定「这次访问是不是我、是我的哪个端口」。
② DBR 的作用是数据缓冲 / 速度匹配,「串并转换」是部分接口(如串行口)的附加功能,不是所有 DBR 的本职;
③ 地址译码电路选中的是端口,不只是设备——同一设备的不同端口各有地址。
7.1.3 I/O 端口编址方式
- 统一编址(存储器映射 I/O,Memory-Mapped I/O):I/O 端口与主存单元共用同一个地址空间,从主存地址中划出一块给端口。访问端口用普通访存指令(LOAD / STORE)即可,不需要专门的 I/O 指令;靠地址范围区分访主存还是访端口。
- 独立编址(单独编址,I/O-Mapped I/O):端口地址空间与主存地址空间相互独立(两套地址可以重号)。必须设专用 I/O 指令(IN、OUT),并靠控制总线上的区分信号(如 IORQ / MREQ)说明本周期访问的是端口还是主存。
| 对比项 | 统一编址(存储器映射) | 独立编址 |
|---|---|---|
| 地址空间 | 与主存共用一个空间,占用主存编址空间 | 单独的端口空间,不占主存空间,两空间地址可重号 |
| 访问指令 | 用访存指令(LOAD / STORE)即可,指令系统中无需专设 I/O 指令 | 必须有专用 IN / OUT 指令 |
| 区分依据 | 靠地址译码(地址落在端口区即访问端口) | 靠控制线(IORQ / MREQ)区分访存还是访端口 |
| 优点 | 指令丰富、寻址方式多、端口操作灵活(可对端口数据直接运算) | 主存空间不受损失;端口地址位数少,译码电路简单、速度快 |
| 缺点 | 占用主存空间;地址译码变复杂,执行速度略慢 | 指令功能单一、编程不够灵活;控制信号与指令系统更复杂 |
下列关于 I/O 端口编址的叙述中,错误的是( )
A. 统一编址方式下,可用访存指令访问 I/O 端口 B. 独立编址方式下,I/O 端口地址与主存单元地址可以相同 C. 独立编址方式需要设置专用的 I/O 指令和控制信号 D. 统一编址方式下,I/O 端口不占用主存的编址空间
查看解答
D。逐项分析:
A 对:统一编址正是「端口当主存单元用」,LOAD / STORE 一律通吃;
B 对:独立编址是两个互不相干的空间,端口 100 号与主存 100 号完全可以并存,靠 IORQ / MREQ 控制线区分——这是独立编址最常考的隐含特征;
C 对:专用 IN / OUT 指令与 IORQ 控制线是独立编址的标配;
D 错:统一编址从主存地址空间里划出一块给端口,必然占用主存编址空间——这正是它的主要缺点。
② 判断题目用哪种编址,抓两个关键词:出现 IN / OUT 专用指令、IORQ 控制线 → 独立编址;出现「用访存指令 / LOAD / STORE 访问端口」「占用存储空间」→ 统一编址;
③ 两种编址下 CPU 访问的都是端口(接口中的寄存器),不是直接访问设备内部的机械部分。
判断下列说法的正误:(1) 接口中的端口本身也含有控制逻辑,端口与接口是同一个概念;(2) 数据缓冲寄存器 DBR 的主要作用是解决 CPU 与外设的速度匹配问题;(3) 某机器用指令 STORE R1, 2000 把 R1 内容写入端口地址 2000 的寄存器,该机最可能采用独立编址。
查看答案
(1) 错:端口是接口中可编址的寄存器,接口 = 端口 + 控制逻辑,范围更大。
(2) 对:DBR 在主机与设备之间起「蓄水池」作用,用缓冲吸收速度差;串并转换等只是部分接口的附加功能。
(3) 错:用访存指令 STORE 就能写端口,说明端口与主存单元在同一地址空间、同一套指令——这是统一编址的标志;独立编址必须用 IN / OUT 类专用指令。
7.2 程序查询方式
7.2.1 工作流程:查询状态位的循环
向控制口写入启动命令; ← 启动设备
主存指针 P ← 缓冲区首址;计数器 C ← 传送字数 n;
loop:
读状态口,取出完成位 D;
若 D = 0 则转 loop; ← 原地踏步:CPU 空等,直到设备就绪
从数据口读一个字 → 存入 (P); ← 就绪后经 DBR 传给 CPU,再存主存
P + 1;C − 1;
若 C ≠ 0 则转 loop;
继续执行后续程序
7.2.2 CPU 效率分析与计算
某机 CPU 主频 1 GHz(时钟周期 1 ns),采用程序查询方式从输入设备读数据。设备速度 100 字 / 秒(每 10 ms 就绪一个字),每轮查询(读状态口 + 判断转移)需 100 个时钟周期。为保证不丢失数据,求:(1) 相邻两个字的就绪间隔内,CPU 最多执行多少轮查询?(2) CPU 用于该设备输入的时间占 CPU 总时间的百分比;(3) 其中真正用于搬运数据的时间占比。
查看解答
① 相邻就绪间隔:
\[ \Delta t=\frac{1}{100}\ \text{s}=10\ \text{ms}=10^{7}\ \text{ns} \]② 每轮查询耗时 \(100\times1\ \text{ns}=100\ \text{ns}\),故最多查询轮数:
\[ \frac{10^{7}}{100}=10^{5}=100000\ \text{轮}\quad(\checkmark:\ 10\ \text{ms}/100\ \text{ns}=10^{5}) \]其中仅最后一轮发现 D = 1,其余 99999 轮全部空转。
③ 就绪时刻不可预知,CPU 必须自上一字取走后连续轮询到下一字就绪,10 ms 全部花在查询上:
\[ \eta=\frac{10\ \text{ms}}{10\ \text{ms}}=100\% \]真正搬运数据(读数据口、存主存等)约需 100 ns(按百条指令量级估计),占比仅:
\[ \frac{100\ \text{ns}}{10^{7}\ \text{ns}}=10^{-5}=0.001\%\quad(\checkmark) \]结论:查询方式下 CPU 与设备完全串行,CPU 利用率极低;设备速率越高(\(\Delta t\) 越短),这种浪费也不会缓解——占用比例始终是 100%。这正是催生中断方式的原因。
② 状态口与数据口是两个不同的端口,先查状态、后传数据,别混为一谈;
③ 程序查询方式不需要中断机构,「接口最简单」是它的唯一亮点;判断题说「查询方式需要 DMA 控制器 / 中断排队器」一律错。
判断下列说法的正误:(1) 程序查询方式下,设备准备数据期间 CPU 可以转去处理其他任务;(2) 程序查询方式的接口只需数据口和状态口,是三种方式中接口最简单的;(3) 程序查询方式下主机与设备串行工作,但若设备速度足够慢,CPU 的时间开销比例可以降得很低。
查看答案
(1) 错:就绪时刻不可预知,CPU 必须原地踏步连续查询,一旦离开就可能错过数据。
(2) 对:查询方式不需中断机构、不需 DMA 控制器,数据口 + 状态口即可工作。
(3) 错:恰恰相反——设备越慢,\(\Delta t\) 越长,CPU 踏步等待的绝对时间越长;由于必须全程轮询,时间占比始终约为 100%,与设备快慢无关(见例 2 第 ② 问)。
7.3 程序中断方式 本章最重
7.3.1 中断的基本概念
- 内中断(异常):与当前指令有关、来自 CPU 内部——除零、溢出、缺页、自陷(trap,如系统调用指令)、故障(fault)、终止(abort),一般不可被屏蔽;
- 外中断(硬件中断):与现行程序无关的外部事件——外设 I/O 请求、时钟、掉电;又分可屏蔽中断 INTR(受中断允许位和屏蔽字控制)与不可屏蔽中断 NMI(掉电等紧急事件,不受开关中断限制)。
7.3.2 中断请求与中断判优
- 硬件排队器(链式排队器 / 独立请求并行排队):接线固定,响应优先级不可改变;速度快,408 默认采用;
- 软件轮询:CPU 依次查询各源状态,查询次序即优先级,可由程序改变;无需排队硬件但响应慢。
② 处理优先级:服务程序执行中谁能打断谁,由屏蔽字决定,可以改变(见 7.3.6);
③ 排队器只管「同时到达先理谁」,不管嵌套打断——两件事用的机制不同,大题的坑全在这里。
7.3.3 中断响应:条件、时机与隐指令
- 有中断请求:至少一个源 INTR 有效且未被屏蔽,并经排队器胜出;
- CPU 开中断:中断允许触发器 EINT = 1(关中断期间请求被挂起、不丢失);
- 一条指令执行完毕:CPU 只在每条指令周期结束时采样中断请求线——指令执行中途不响应 I/O 中断。
- 关中断(EINT ← 0):保证接下来的保存断点等操作不被新中断打断;
- 保存断点:把 PC(和 PSW)压入堆栈或存入指定单元,以便处理完返回;
- 引出中断服务程序的入口地址:硬件向量法(向量地址 → 取中断向量 → 送 PC)或软件查询法。
注意与中断处理时间区分:后者是整个服务程序的执行时间。响应时间在「关中断」或执行长指令期间会被拉长。
② 隐指令三件事里没有「保护现场」——保护现场是服务程序开头用软件做的;
③ 关中断由硬件自动完成(隐指令),不是程序员关的;服务程序返回前的开中断才是软件行为;
④ 不可屏蔽中断 NMI 不受条件 ② 限制(无需开中断即可响应)。
判断下列说法的正误:(1) 保存断点和保护现场都由中断隐指令完成;(2) CPU 在任何时刻都可以响应可屏蔽中断;(3) 中断隐指令做的三件事是关中断、保存断点、引出服务程序入口。
查看答案
(1) 错:保存断点(PC、PSW)由隐指令硬件完成;保护现场(通用寄存器、屏蔽字等)由中断服务程序软件完成——「断点 vs 现场」一字之差,归属两分。
(2) 错:必须同时满足「有未屏蔽请求 + 开中断 + 一条指令执行完毕」三个条件,缺一不可。
(3) 对:这正是隐指令的标准三件事,全部由硬件自动完成。
7.3.4 向量中断与两组地址辨析
- 向量中断:一种找服务程序的方式——由硬件直接产生向量地址,再按向量地址取出服务程序入口,从而快速转入服务程序(与「软件查询法」相对);
- 中断向量:中断服务程序的入口地址(严格说还含程序状态字,常简称入口地址);
- 向量地址:存放中断向量的存储单元的地址(中断向量表中的表项地址),由排队器选中中断源后经编码器产生。
采用向量中断的计算机中,「向量地址」指的是( )
A. 中断服务程序的入口地址 B. 中断服务程序入口地址所在的存储单元的地址 C. 中断源设备的端口地址 D. 中断服务程序中断点的地址
查看解答
B。逐项分析:
A 是中断向量,不是向量地址——这是本题的题眼,两个名词一字之差;
B 对:向量地址指向中断向量表(跳转表)中的一个表项,该表项里存放着入口地址;
C 错:设备端口地址用于访问接口寄存器,与找服务程序入口无关;
D 错:断点地址是被打断程序的 PC,由隐指令保存,不由向量地址指示。
套路总结:中断向量 = 入口地址;向量地址 = 入口地址的地址;向量中断 = 用硬件产生向量地址找入口的这种方式。
7.3.5 单重与多重中断的服务流程
中断服务程序入口: ← 由隐指令按向量地址转入
关中断 ← 响应时硬件已关;软件再确认,保证下段安全
保护现场: 通用寄存器、PSW 压栈
设置本源屏蔽字 ← 屏蔽处理优先级不高于自己的中断源
开中断 ← 关键:保护现场之后才开,允许更高级打断
设备处理段:
与设备交换数据、发应答…… ← 本段可被更高处理优先级的中断嵌套
关中断 ← 保证恢复现场不被打断
恢复现场: 恢复屏蔽字,寄存器、PSW 出栈
开中断
中断返回(IRET) ← 弹出断点,回到原程序继续执行
② 设备处理段开中断(多重中断才开;单重中断全程关);
③ 恢复现场期间必须关中断,恢复完、返回前再开。判断题把「保护现场前开中断」「恢复现场时开中断」设为错误选项,是最常见的考法。
7.3.6 中断屏蔽技术 大题重点
- 对角线全 1(每行都屏蔽自己);
- 按处理优先级从高到低重排各行后,矩阵呈「上三角全 1」;
- 屏蔽字中 1 的个数随处理优先级降低而递增——优先级最高的源只有 1 个 1(仅自己),最低的源全是 1。
某机 4 个中断源 A、B、C、D,响应优先级 A > B > C > D(硬件排队器固定)。现要求通过屏蔽字把处理优先级改为 C > A > D > B。(1) 写出每个服务程序的屏蔽字(位序 A、B、C、D);(2) 用三条规律检验;(3) 若 A、C 同时发出请求且 CPU 处于开中断的主程序,谁先被响应?谁先执行完?
查看解答
(1) 按「屏蔽自己 + 屏蔽所有更低者,放开更高者」:
| 服务程序 | A 位 | B 位 | C 位 | D 位 | 依据 |
|---|---|---|---|---|---|
| C(处理级最高) | 1 | 1 | 1 | 1 | 无人可打断它,全屏蔽 |
| A | 1 | 1 | 0 | 1 | 只放开比它高的 C |
| D | 0 | 1 | 0 | 1 | 放开 C、A,屏蔽 B 与自己 |
| B(处理级最低) | 0 | 1 | 0 | 0 | 只屏蔽自己,其余都可打断它 |
(2) 检验:对角线(A 行 A 位、B 行 B 位、C 行 C 位、D 行 D 位)全为 1 ✓;1 的个数 C 有 4 个、A 有 3 个、D 有 2 个、B 有 1 个,随处理优先级降低而递减 ✓;按 C、A、D、B 重排后上三角全 1 ✓。
(3) 先响应的是 A——排队器仍按响应优先级 A > B > C > D 工作,屏蔽字管不了它。A 的服务程序开中断后,C 未被屏蔽(A 行 C 位 = 0),C 随即打断 A,于是 C 先执行完,返回 A 续做,A 完成后才轮到别人。
套路总结:「先响应」看响应优先级(排队器,不变),「先完成 / 谁打断谁」看处理优先级(屏蔽字,可变)——第 (3) 问正是大题最爱考的双优先级分离。
某机 4 个中断源 ①②③④,响应优先级 ① > ② > ③ > ④(硬件排队)。各服务程序设置的屏蔽字如下表(1 = 屏蔽):
| 服务程序 | ① 位 | ② 位 | ③ 位 | ④ 位 |
|---|---|---|---|---|
| ① | 1 | 0 | 1 | 1 |
| ② | 1 | 1 | 1 | 1 |
| ③ | 0 | 0 | 1 | 0 |
| ④ | 0 | 0 | 1 | 1 |
(1) 推出处理优先级;(2) 设主程序屏蔽字全 0(全开放)。主程序执行时 ③④ 同时发出请求,此后 ② 在 ④ 的服务程序执行期间到达,① 在 ② 的服务程序执行期间到达。写出实际执行次序。
查看解答
(1) 读表找「谁能打断谁」:② 行全 1 → 无人可打断 ②,处理级最高;① 行仅放开 ② → ② > ①;④ 行放开 ①②、屏蔽 ③ → ②① > ④;③ 行只屏蔽自己 → ③ 可被所有人打断,处理级最低。故 处理优先级 ② > ① > ④ > ③。(1 的个数:②4、①3、④2、③1,递减规律验证通过 ✓)
(2) 逐时刻推演(记住两条规则:主程序屏蔽字全 0;嵌套时生效的是「当前最内层服务程序」的屏蔽字,返回时恢复):
· ③④ 同时请求 → 排队器按响应优先级 ③ > ④ 选 ③,执行 ③ 服务程序(屏蔽字 0010);期间 ② 未到,③ 顺利执行完,返回主程序;
· 只剩 ④ 请求 → 响应 ④,设屏蔽字 0011(屏蔽 ③④);
· ② 到达:④ 行 ② 位 = 0 未被屏蔽 → 打断 ④,执行 ② 服务程序(1111,全屏蔽);
· ① 到达:② 行 ① 位 = 1,被屏蔽,挂起等待;② 执行完,返回 ④(恢复 ④ 的屏蔽字 0011);
· ④ 行 ① 位 = 0,① 未被屏蔽 → 打断 ④,执行 ① 服务程序(1011);无新请求,① 执行完返回 ④;
· ④ 执行完,返回主程序。
实际执行轨迹:③ → ④ → ②(嵌套于 ④)→ ①(嵌套于 ④)→ ④ 收尾。
验算三处关键打断:② 打断 ④(②>④ ✓)、① 打断 ④(①>④ ✓)、① 没能打断 ②(②>① ✓);③ 始终没能打断 ④(④ 行 ③ 位 = 1 ✓)。推演大题就按「时间线 + 每步看当前屏蔽字」机械推进,不要凭感觉。
接例 4:响应优先级 A > B > C > D,处理优先级 C > A > D > B。B 的服务程序已设置屏蔽字并开中断执行,此时 A、C、D 三个源同时发出请求。问:(1) 最先打断 B 的是谁?(2) 最先执行完毕的是谁?
查看解答
(1) B 的屏蔽字为 0100(仅屏蔽自己),A、C、D 都未被屏蔽,都有权打断 B;三个请求同时到达,由排队器按响应优先级裁决:A > C > D,故 A 最先打断 B。
(2) 进入 A 的服务程序(屏蔽字 1101)后,C 未被屏蔽 → C 打断 A;C 的屏蔽字 1111 全屏蔽 → 无人再打断 C,C 最先执行完;返回 A 续做,A 完成后返回 B,此时 D(处理优先级高于 B)再打断 B,最后 B 收尾。
完整次序:A → C → A → D → B。「先打断 B 的」由响应优先级定,「先做完的」由处理优先级定——两个小问分别考两条规则,务必分开作答。
判断下列说法的正误:(1) 修改屏蔽字可以改变 CPU 响应中断的次序;(2) 每个中断源的服务程序中都必须屏蔽它自己;(3) 屏蔽字中 1 的个数越多,该源的处理优先级越低;(4) 响应优先级由硬件排队器决定,机器运行中不可改变。
查看答案
(1) 错:屏蔽字改变的是处理优先级(谁能打断谁、先做完谁),响应次序仍由排队器决定——这是最典型的偷换概念。
(2) 对:不屏蔽自己,同一源的重复请求可能把自己的服务程序再嵌套进去,破坏断点管理。
(3) 对:1 越多,能打断它的源越多、它能屏蔽的越少——处理优先级越低(例 4、例 5 均可验证)。
(4) 对(408 默认硬件排队器):接线固定,不可运行中改变;若采用软件轮询判优,次序才可由程序改变。
7.4 DMA 方式
7.4.1 DMA 控制器的组成
- 主存地址计数器 AR:存放主存缓冲区地址,每传一个字自动 +1;
- 字计数器 WC:存放待传送字数,每传一个字自动 −1,计满溢出表示整块传送结束,触发中断机构;
- 数据缓冲寄存器 DBR:暂存设备与主存之间传送的数据(速度缓冲);
- DMA 请求触发器:设备准备好一个字(或一批数据到齐)时置位,向 CPU 发 DMA 请求申请总线控制权;
- 中断机构:字计数器溢出(块传送结束)时向 CPU 发中断请求,请 CPU 做后处理——DMA 离不开中断技术的配合;
- 控制 / 状态逻辑:命令译码、时序、读写控制,以及设备地址寄存器等。
7.4.2 DMA 的三种传送方式
- 停止 CPU 访存:DMA 请求一到,CPU 交出总线权,整块传完才归还。控制最简单、传送最快;缺点是 CPU 在整块传送期间不能访存(只能干等或做不访存的内部操作),且设备两批数据之间的空闲间隔主存也被白白占着,CPU 利用率低。适合传送速度接近主存、CPU 此刻恰好无访存任务的场景;
- 周期挪用(周期窃取,最常用):DMA 每传一个字挪用(窃取)一个存取周期,传完这个字立即把总线还给 CPU。CPU 与 DMA 分时使用主存;两者同时申请访存时 DMA 优先——设备缓冲小、数据不等人(晚一步就丢失),而 CPU 延迟一个周期访存并无大碍。兼顾了传送效率与 CPU 利用率;
- CPU 与 DMA 交替访问:把一个存储周期切成两个时间片,规定片 1 归 CPU、片 2 归 DMA,各用各的、无需申请归还总线。效率最高、无需总线权切换;但要求存储器速度加倍、控制逻辑复杂、硬件开销大,实际较少采用。
② 周期挪用挪走的是存储器存取周期,不是 CPU 的指令周期——CPU 只是在那个周期不能访存而已;
③ 三种方式中「最常用」的是周期挪用,「传送期间 CPU 完全不访存」的是停止 CPU 访存。
某机主存存取周期 100 ns,某高速设备经 DMA 以周期挪用方式输入数据,传输率 2 MB/s,每次挪用一个存取周期传送 4 B(本题按 1 MB = 10⁶ B 换算)。求 DMA 挪用主存周期的比例,并估计 CPU 访存速度最多受多大影响。
查看解答
① 每秒需传送 \(2\times10^{6}\) B,每次挪用传 4 B,故每秒挪用次数:
\[ \frac{2\times10^{6}}{4}=5\times10^{5}\ \text{次} \]② 每次挪用占用一个存取周期 100 ns,每秒共占用:
\[ 5\times10^{5}\times100\ \text{ns}=5\times10^{5}\times10^{-7}\ \text{s}=0.05\ \text{s} \]③ 占主存总时间的比例:
\[ \eta=\frac{0.05\ \text{s}}{1\ \text{s}}=5\%\quad(\checkmark:\ 5\times10^{5}\times10^{-7}=5\times10^{-2}) \]即 DMA 窃取了主存 5% 的访问机会。CPU 若满负荷访存,访存速度至多下降约 5%;若 CPU 本来就不必每个周期都访存,实际影响更小——这正是周期挪用「以极小代价换取设备与 CPU 高度并行」的含义。
7.4.3 DMA 传送的三阶段
- 预处理(初始化)——由 CPU 执行程序完成:向 DMA 控制器写入主存缓冲区首址(→AR)、传送字数(→WC)、传送方向与设备号,然后启动设备;CPU 随即转去执行其他程序;
- 数据传送——由 DMA 控制器硬件独立完成:设备就绪一个字 → DBR → DMA 请求 → 挪用一个存取周期写入主存 → AR + 1、WC − 1 …… 全程无 CPU 干预;
- 后处理——由 CPU 执行中断服务程序完成:WC 计满溢出,DMA 的中断机构发中断请求,CPU 在服务程序中校验数据、判断是否继续传送下一块、报告结束等。
判断下列说法的正误:(1) DMA 的预处理由中断服务程序完成;(2) 数据传送阶段由 DMA 控制器硬件完成,CPU 可并行执行原程序;(3) 后处理由 CPU 执行中断服务程序完成;(4) DMA 请求也必须在一条指令执行结束时才能被响应。
查看答案
(1) 错:预处理是 CPU 执行普通程序(启动程序)完成的初始化工作,发生在传送开始之前;中断服务程序负责的是传送结束后的后处理。
(2) 对:这正是 DMA 的核心价值——传送阶段 CPU 与设备高度并行。
(3) 对:字计数器溢出发中断,后处理在中断服务程序中完成。
(4) 错:DMA 请求的响应时机是一个存取周期(总线周期)结束即可,不必等一条指令执行完——这正是 DMA 响应比中断响应更快的原因。
7.4.4 DMA 与中断的对比及结合
| 对比项 | 程序中断方式 | DMA 方式 |
|---|---|---|
| 请求的来源 | 中断源(设备就绪、每字一次) | DMA 控制器(DBR 数据到齐,成块搬运) |
| 响应时机 | 一条指令执行结束才响应 | 一个存取周期结束即可响应,更快 |
| 数据通路 | 设备 → 接口 → 经 CPU 寄存器中转 → 主存 | 设备 → DBR → 与主存直接交换,不经过 CPU |
| 优先级 | 低 | 高(高速设备数据不等人,防丢失) |
| CPU 参与度与程序切换 | 每字一次:保护 / 恢复现场、执行服务程序,开销大 | 每块两次(预处理 + 后处理),传送期间无程序切换 |
某计算机 CPU 主频 500 MHz,CPI = 5。某外设数据传输率 0.5 MB/s,采用中断方式与主机传送,以 32 位为传输单位,对应的中断服务程序含 18 条指令,中断的其他开销相当于 2 条指令的执行时间。(1) 中断方式下 CPU 用于该外设 I/O 的时间占比是多少?(2) 若外设速率提高到 5 MB/s,改用 DMA 方式,每次 DMA 传送 4 KB 的块,预处理与后处理共需 500 个时钟周期,此时占比又是多少?(按 1 MB = 10⁶ B、1 KB = 10³ B 换算)
查看解答
(1) 每次中断传送 32 bit = 4 B,每秒中断次数:
\[ \frac{0.5\times10^{6}}{4}=1.25\times10^{5}\ \text{次} \]每次中断开销 \( (18+2)=20 \) 条指令,共 \( 20\times5=100 \) 个时钟周期;每秒用于 I/O 的周期数与占比:
\[ 1.25\times10^{5}\times100=1.25\times10^{7}\ \text{个周期},\qquad \eta=\frac{1.25\times10^{7}}{500\times10^{6}}=2.5\%\quad(\checkmark) \](2) 每秒传送块数:
\[ \frac{5\times10^{6}}{4\times10^{3}}=1250\ \text{块} \]每块 CPU 只花预处理 + 后处理 500 周期(传送本身不占 CPU):
\[ 1250\times500=6.25\times10^{5}\ \text{个周期},\qquad \eta=\frac{6.25\times10^{5}}{500\times10^{6}}=0.125\%\quad(\checkmark) \]结论:速率提高 10 倍,CPU 占用反而从 2.5% 降到 0.125%(降为 1/20)——DMA 把「每字一次开销」变成「每块一次开销」,这正是高速设备必须配 DMA 的原因。
7.5 三种 I/O 方式总对比
| 对比维度 | 程序查询 | 程序中断 | DMA |
|---|---|---|---|
| 数据流向 | 设备 → 接口 → CPU → 主存 | 设备 → 接口 → 经 CPU 寄存器 → 主存 | 设备 ↔ 主存直接交换,不经 CPU |
| CPU 干预粒度 | 全程每一刻(踏步等待) | 每传一个字介入一次 | 每传一个块介入两次(头、尾) |
| 传送单位 | 字 | 字 | 数据块 |
| CPU 与设备并行性 | 完全串行 | 部分并行(设备准备时 CPU 干别的) | 高度并行 |
| 介入(响应)时机 | CPU 主动反复查询 | 一条指令执行结束 | 一个存取周期结束(最快) |
| 接口 / 控制器复杂度 | 最简单(数据口 + 状态口) | 需中断机构(请求、排队、屏蔽、向量) | 需 DMA 控制器(最复杂) |
| 适用场景 | 慢速设备、CPU 不忙、简单系统 | 中低速设备、随机事件(键盘、打印机) | 高速批量传送(磁盘、网卡、显卡) |
| 速率升高对 CPU 开销 | 始终约 100% 占用 | 线性增长,高速时 CPU 不堪重负 | 按块摊薄,速率越高优势越大 |
7.6 章末自测 真题风格
限时 50 分钟,先做后看答案。难度:★★ 基础 / ★★★ 强化 / ★★★★ 冲刺。计算题要求代入具体数值逐步演算,并用第二种方式验算。
I/O 接口中,用于暂存主机与设备交换数据、实现速度匹配的部件是( )
A. 地址译码器 B. 数据缓冲寄存器 DBR C. 状态寄存器 D. 中断排队器
查看答案
B。A 负责选端口,C 记录设备忙 / 就绪等状态,D 负责多请求判优——只有 DBR 承担数据中转与缓冲、匹配 CPU 与设备的速度差。
下列关于独立编址方式的叙述中,正确的是( )
A. 端口地址与主存地址不能相同 B. 用访存指令即可访问端口 C. 需要专用 I/O 指令和区分访存 / 访端口的控制信号 D. 端口占用主存编址空间
查看答案
C。独立编址两空间相互独立、地址可重号(A 错),必须设 IN / OUT 专用指令(B 是统一编址的特征),靠 IORQ / MREQ 等控制线区分(C 对);不占主存空间(D 错,占主存空间是统一编址的缺点)。
下列操作中,不属于中断隐指令完成的是( )
A. 关中断 B. 保存断点 C. 引出中断服务程序入口地址 D. 保护现场
查看答案
D。隐指令三件事:关中断、保存断点(PC、PSW)、找服务程序入口,全部由硬件完成;保护现场(通用寄存器、屏蔽字等)由服务程序(软件)完成——「断点归硬件,现场归软件」。
采用向量中断的机器中,中断服务程序入口地址存放在( )
A. 中断向量(表项)中,由向量地址指示的存储单元取出 B. 程序计数器 PC 中 C. 中断排队器中 D. 设备的控制寄存器中
查看答案
A。链路:排队器选中源 → 硬件产生向量地址 → 按向量地址访存,从表项(中断向量)中取出入口地址 → 送 PC。排队器只产生优先级与向量地址,不存入口地址;控制寄存器存的是命令码。
多重中断方式下,中断服务程序中「开中断」应安排在( )
A. 保护现场之前 B. 保护现场(含设置屏蔽字)之后、设备处理之前 C. 恢复现场之后、中断返回之前才第一次开 D. 任意位置均可
查看答案
B。现场未保存完就被打断会导致恢复错乱,故先关中断保护现场;随后开中断进入设备处理段,允许更高处理优先级嵌套;恢复现场前再关中断,返回前最后开中断。C 是单重中断的做法(全程关中断,仅返回前开)。
CPU 对 DMA 请求的响应时机是( )
A. 一条指令执行结束 B. 一个存取周期(总线周期)结束 C. 一个时钟周期结束 D. 一个机器周期内任意时刻
查看答案
B。DMA 只借主存一个存取周期,不必等指令执行完;而中断必须等到一条指令执行结束——「DMA 响应快于中断响应」的根源就在于此。这也是 DMA 优先级高于中断的体现。
某机主存存取周期 50 ns,设备经 DMA 以周期挪用方式传送,速率 4 MB/s,每次挪用传一个 4 B 的字(按 1 MB = 10⁶ B 换算)。DMA 挪用主存周期的比例为 \(\underline{\hspace{1cm}}\)。
查看答案
每秒挪用次数:
\[ \frac{4\times10^{6}}{4}=10^{6}\ \text{次} \]每秒占用主存:
\[ 10^{6}\times50\ \text{ns}=10^{6}\times5\times10^{-8}\ \text{s}=5\times10^{-2}\ \text{s} \]\[ \eta=5\times10^{-2}=5\%\quad(\checkmark) \]
验算(另法):每秒主存共 \(1/50\,\text{ns}=2\times10^{7}\) 个周期,被挪用 \(10^{6}\) 个,\(10^{6}/2\times10^{7}=5\%\) ✓。
某机主频 1 GHz,CPI = 4。外设以 0.2 MB/s 与主机传送数据,采用中断方式,以 32 位为传送单位,每次中断的服务程序及开销折合 30 条指令(按 1 MB = 10⁶ B 换算)。CPU 用于该外设 I/O 的时间占比为 \(\underline{\hspace{1cm}}\)。
查看答案
每秒中断次数:
\[ \frac{0.2\times10^{6}}{4}=5\times10^{4}\ \text{次} \]每次中断 \(30\times4=120\) 个周期,每秒共:
\[ 5\times10^{4}\times120=6\times10^{6}\ \text{个周期} \]\[ \eta=\frac{6\times10^{6}}{1\times10^{9}}=0.6\%\quad(\checkmark) \]
验算:0.6% × 10⁹ = 6×10⁶ 周期 = 5×10⁴ 次中断 × 120 周期 ✓。
上题外设速率提高到 8 MB/s 改用 DMA,每次传 8 KB 的块,预处理加后处理共 400 个时钟周期(按 1 MB = 10⁶ B、1 KB = 10³ B 换算)。CPU 用于 I/O 的时间占比为 \(\underline{\hspace{1cm}}\),是中断方式(0.2 MB/s 时 0.6%)的 \(\underline{\hspace{1cm}}\) 倍速率下仍更低开销,说明 DMA 适合高速设备。
查看答案
每秒传送块数:
\[ \frac{8\times10^{6}}{8\times10^{3}}=1000\ \text{块} \]每秒 CPU 开销与占比:
\[ 1000\times400=4\times10^{5}\ \text{个周期},\qquad \eta=\frac{4\times10^{5}}{10^{9}}=0.04\%\quad(\checkmark) \]速率提高为原来的 40 倍(0.2 → 8 MB/s),CPU 占用反而从 0.6% 降到 0.04%——按字摊销变按块摊销,开销与速率基本解耦,故高速设备必配 DMA。
为下列设备选择最合适的 I/O 控制方式并说明理由:(1) 每 2 秒输出一次数据的工业温控仪;(2) 键盘;(3) 传输率 500 MB/s 的固态硬盘;(4) 若键盘误用 DMA 方式,会出什么问题?
查看解答
(1) 程序查询:数据频率极低(0.5 次 / 秒),查询开销可忽略,接口与程序最简、成本最低;也可用中断,但查询已够用。
(2) 程序中断:击键随机、速度慢(每秒至多几十次),中断方式让 CPU 平时完全不管键盘、有键按下才响应,开销小、实时性好。
(3) DMA:速率极高、成块传送,若用中断每 4 B 一次服务程序,每秒需上亿次中断(\(500\times10^{6}/4=1.25\times10^{8}\) 次),CPU 完全被淹没;DMA 按块介入,传送阶段零占用。
(4) 键盘数据是单字节、随机到达:DMA 为成块传送设计,每传 1 B 也要做一次预处理 / 后处理(设首址、字数、启动、结束中断),开销反而远超一次中断服务;且 DMA 控制器资源有限,被慢速随机设备占用毫无意义——方式选择的关键是「按开销与数据形态匹配」,并非越先进越好。
7.7 本章考点总结
| 考点 | 常考题型 | 热度 | 核心方法 |
|---|---|---|---|
| I/O 接口与端口 | 选择题 | ★★★★ | 端口 = 接口中可编址寄存器(数据 / 状态 / 控制口);DBR 管缓冲与速度匹配;接口 = 端口 + 控制逻辑 |
| 端口编址 | 选择题 | ★★★★ | 统一编址:访存指令、占主存空间、靠地址区分;独立编址:IN / OUT 专用指令 + IORQ 控制线、地址可重号、不占主存 |
| 程序查询 | 选择 / 计算 | ★★★ | 查忙 / 就绪位循环;CPU 与设备完全串行;占用 ≈ 100%(先算就绪间隔 \(\Delta t=1/v\),再算查询轮数) |
| 中断判优与响应 | 选择题 | ★★★★ 高频 | 响应三条件:有未屏蔽请求 + 开中断 + 指令执行完;隐指令三件事(关中断、保存断点、找入口)全由硬件做;保护现场归软件 |
| 向量中断辨析 | 选择题 | ★★★★ | 中断向量 = 入口地址;向量地址 = 存入口地址的单元地址;向量中断 = 硬件产生向量地址找入口的方式 |
| 多重中断与屏蔽字 | 大题 / 选择 | ★★★★★ 必考 | 保护现场后开中断、恢复现场前关中断;屏蔽字屏蔽自己 + 更低者,对角线全 1、1 的个数随处理优先级递减;响应优先级(排队器)不可变,处理优先级(屏蔽字)可变;推次序按「时间线 + 当前屏蔽字」机械推进 |
| DMA 组成与三方式 | 选择题 | ★★★★ | AR + 1、WC − 1、DBR、DMA 请求触发器、中断机构;停止 CPU 访存 / 周期挪用(最常用,DMA 优先) / 交替访问 |
| DMA 三阶段与 CPU 占用率 | 选择 / 计算 | ★★★★★ 必考 | 预处理(程序)→ 传送(纯硬件)→ 后处理(中断服务程序);DMA 响应在存取周期末(快于中断);占比 = 每秒介入次数 × 每次周期数 ÷ 主频 |
| DMA vs 中断五点对比 | 选择题 / 简答 | ★★★★ | 请求源(字 vs 块)、响应时机(指令末 vs 周期末)、数据通路(经 CPU vs 直接)、优先级(DMA 高)、CPU 参与度(每字 vs 每块两次) |
| 三方式选用 | 解答题 | ★★★ | 慢速随机 → 中断;低速且 CPU 闲 → 查询;高速成块 → DMA;开销与数据形态匹配,不是越新越好 |