I/O 控制方式
这一节在目录里带 *,但它是全章的主干:7.3 的三个三级节就是这一节前三种方式的展开。这里先把四种方式放在同一条演化线上看清楚,7.3 再逐个拆开。
演化的动力只有一句话:把「等待」和「搬运」这两件苦差事,一步步从 CPU 身上剥离。
flowchart TD Q["程序查询<br/>CPU 既等又搬"] -->|"把「等」拿走"| I["程序中断<br/>CPU 不等了,仍要搬"] I -->|"把「搬」也拿走"| D["DMA<br/>CPU 只做首尾"] D -->|"把「组织一串操作」也拿走"| C["通道 / 外围处理机<br/>CPU 只下达一次任务"] classDef s1 fill:#ffcdd2,stroke:#b71c1c classDef s2 fill:#ffe0b2,stroke:#e65100 classDef s3 fill:#c8e6c9,stroke:#1b5e20 classDef s4 fill:#bbdefb,stroke:#0d47a1 class Q s1 class I s2 class D s3 class C s4
每一步的代价都是硬件变复杂。 这与全书反复出现的取舍一致:功能往硬件里搬,速度上去了,成本和复杂度也上去了——5.4.2 硬布线与5.4.3 微程序之争、CISC 与 RISC之争,都是同一个取舍的不同外衣。
机制
四种方式的完整对照
这张表是本章的骨架,每一列都是一个独立的考点。
| 程序查询 | 程序中断 | DMA | 通道 | |
|---|---|---|---|---|
| CPU 是否忙等 | 是 | 否 | 否 | 否 |
| 数据由谁搬 | CPU 指令 | CPU 指令(在中断服务程序里) | DMA 控制器 | 通道 |
| 数据流路径 | 设备→CPU 寄存器→主存 | 设备→CPU 寄存器→主存 | 设备→主存(不经 CPU 寄存器) | 设备→主存 |
| CPU 干预频率 | 全程 | 每传一个字(或一小批)一次 | 每传一个数据块一次 | 每传一组数据块一次 |
| 传送单位 | 字 / 字节 | 字 / 字节 | 数据块 | 一组数据块 |
| 响应时机 | —— | 一条指令结束后 | 一个总线周期(存取周期)结束后 | —— |
| 并行性 | 无 | CPU 与设备部分并行 | CPU 与设备并行 | 并行度最高 |
| 硬件成本 | 最低 | 低 | 中 | 高 |
表里有三行是失分重灾区,逐条说明。
第一,“数据流路径”这一行。 程序中断方式的数据仍然经过 CPU 寄存器——这是它与 DMA 的根本区别,而不是”中断比查询快”。中断解决的是”不用干等”,没有解决”CPU 要亲自搬”。只有 DMA 才在设备与主存之间开了一条不经过 CPU 的通路。
第二,“CPU 干预频率”这一行。 这一列从”全程”到”每字”到”每块”到”每组块”,是一条严格递减的链,也正是上面那张演化图的量化版本。题目问”哪种方式 CPU 干预最少”,答案按这条链走。
第三,“响应时机”这一行。 程序中断必须等一条指令执行完(5.5.1 讲过原因:指令中途的机器状态不完整);而 DMA 请求只需等一个总线周期结束,因为 DMA 不改变 CPU 的执行状态,它只是借走总线。“DMA 的响应比中断更及时”这句话是对的,理由就在这里。
立一条贯穿 7.3 的主线:谁负责「同步」
把上面的表再压缩一层,三种方式其实是在回答同一个问题的三种答案:
CPU 怎么知道设备已经准备好了?
| 方式 | 谁去发现”好了” | 类比 |
|---|---|---|
| 程序查询 | CPU 自己反复去问 | 站在门口每秒敲一次门 |
| 程序中断 | 设备主动来通知 | 装个门铃,等它响 |
| DMA | 设备自己把事办完,最后通知一次 | 让快递员自己进门放好,走时留张条 |
这个”主动问”与”被动等通知”的二分,在第 6 章刚刚出现过。
关联对照:查询 / 中断 ↔ 同步 / 异步
6.2.2 的判据是「有没有公共时钟」,本节的判据是「谁去发现设备就绪」。两者不是同一件事,但结构完全同形:
硬件层(总线定时) 软件层(I/O 控制方式) 发起方按固定节奏主动推进 同步定时(按时钟拍数) 程序查询(按循环轮询) 等待对方发信号才推进 异步定时(等 ACK) 程序中断(等中断请求) 共同的代价 同步按最慢的从设备定拍数 查询按最慢的设备定轮询间隔 共同的收益 异步各按各的速度 中断各设备按各自的时机来打断 注意不要把两者当成一件事。 一条同步总线上照样可以跑中断方式的 I/O——总线定时管的是一次传送内部的节拍,I/O 控制方式管的是两次传送之间怎么等。层次不同,可以自由组合。
但”要整齐就得按最慢的来”这条代价是共享的——定时查询的周期同样必须按最慢的设备定,否则快设备的数据会被覆盖。这是它在本书里的第七次、也是最后一次出现(5.6.1 流水段按最慢段定、6.2.2 同步总线按最慢从设备定拍数……完整七次见 第 1 章总览)。
通道与外围处理机:只需知道边界
这两种在 408 里是”知道有这么回事”的层次,但有三个点可能出判断题:
- 通道是专用的 I/O 处理器,有自己的指令系统(通道指令),CPU 用一条 I/O 指令启动它。
- 通道与 DMA 的区别在”能不能组织一串操作”——DMA 一次只管一个数据块的搬运,通道能执行一段通道程序,控制一组设备完成多次传送。
- 外围处理机(PPU)更接近一台独立的计算机,通用性比通道更强。
层级关系:DMA < 通道 < 外围处理机,独立性递增。
边界
| 说法 | 判断 | 理由 |
|---|---|---|
| ”中断方式下数据不经过 CPU” | ❌ | 仍由 CPU 在服务程序里搬,只有 DMA 不经过 |
| ”DMA 方式完全不需要 CPU” | ❌ | 预处理和后处理都是 CPU 做 |
| ”DMA 传送时不产生中断” | ❌ | 块传完后要中断 CPU做后处理 |
| ”中断响应比 DMA 响应更及时” | ❌ | 反了:中断等指令结束,DMA 等总线周期结束 |
| ”查询方式下进程处于阻塞态” | ❌ | 忙等循环里 CPU 在执行该程序,是运行态 |
| ”通道指令由 CPU 执行” | ❌ | 由通道执行 |
| ”程序中断方式提高了数据传输率” | ⚠️ | 提高的是 CPU 利用率;单次传送的速率没变 |
对照速查
三个关键词,问一遍就能定位任何一道题:
| 问 | 查询 | 中断 | DMA |
|---|---|---|---|
| 谁在等 | CPU | 设备(CPU 去干别的) | 设备 |
| 谁在搬 | CPU | CPU | DMA 控制器 |
| 谁是总线主设备 | CPU | CPU | DMA 控制器(传送期间) |
考点
- 四种方式的对照表,尤其是”数据流是否经过 CPU 寄存器”和”CPU 干预频率”两行。
- 中断与 DMA 的响应时机差异:指令结束 vs 总线周期结束。
- “忙等 ≠ 阻塞”:这是计组与 OS 的口径衔接点,见 OS 5.1.2。
- 通道与 DMA 的分界:能否组织一串操作。
链接
- 🏠 返回总览:计算机组成原理第 7 章:输入/输出系统总览
- ⬅️ 上一节:7.1.2 外部设备
- ➡️ 展开三节:7.3.1 程序查询 7.3.2 程序中断 7.3.3 DMA
- 🔗 同步/异步判据:6.2.2 总线定时
- 🔗 中断为什么等指令结束:5.5.1 异常和中断的基本概念
- 💻 OS 对应:OS 5.1.2 I/O 控制方式
- 📖 名词库:第 7 章名词库