I/O 控制方式
四种 I/O 控制方式不是四个并列的选项,而是一条由同一个问题推着走的演进链:
CPU 太快、外设太慢,如何让 CPU 少为 I/O 浪费时间。
每一种方式都在回答”这次又把 CPU 从哪一段工作里解放出来了”,四种方式因此可以用两个维度贯穿始终:数据由谁搬,以及 CPU 每隔多久被打扰一次。抓住这两条,四种方式的全部优缺点都是推论。

机制
程序直接控制方式
CPU 向控制器发出 I/O 命令后,不断地循环读取状态寄存器,检查设备是否就绪;就绪后由 CPU 把一个字从控制器的数据寄存器搬到内存,然后重复这个过程,直到全部数据传送完毕。
它的问题不在于慢,而在于”轮询”这个动作本身:CPU 在等待期间什么都不能干,只能一遍遍地问”好了没”。这种等待称为忙等。
由此得到一个反直觉但高频的结论:程序直接控制方式下,请求 I/O 的进程不会进入阻塞态——它一直占着 CPU 在轮询,始终处于运行态。
中断驱动方式
CPU 发出 I/O 命令后就转去执行其他程序,不再轮询。设备准备好之后,由控制器向 CPU 发出中断请求,CPU 响应中断、转去执行中断服务程序,把数据从控制器搬到内存,然后返回原程序。
这一步解放的是”等待”:CPU 在设备工作期间可以做别的事,进程也主动放弃 CPU 进入阻塞态,等 I/O 完成后被唤醒。
但数据仍然是 CPU 一个字一个字搬的,而且每传送一个字就要中断一次。对磁盘这种一次要传几千字节的设备,中断次数高得无法接受。
DMA 方式
DMA(直接存储器存取)的核心是让数据不再经过 CPU:在 DMA 控制器的控制下,数据直接在设备与内存之间成块传送。
DMA 控制器中有四类寄存器:命令/状态寄存器 CR(接收命令、反映状态)、内存地址寄存器 MAR(存放数据在内存中的地址)、数据寄存器 DR(暂存数据)、数据计数器 DC(记录还剩多少字节要传)。
完整过程分三段:
① 预处理——CPU 执行驱动程序,把内存起始地址、传送字节数、传送方向写进 DMA 控制器的寄存器,然后启动 DMA。这一段是 CPU 干的活。
② 数据传送——DMA 控制器接管总线,成块地在设备与内存之间搬数据,全程不经过 CPU。CPU 在此期间执行别的程序,请求 I/O 的进程处于阻塞态。
③ 后处理——传送完毕后 DMA 向 CPU 发出中断,CPU 执行中断服务程序做善后(检查错误、唤醒进程等)。
这一步解放的是”搬运”:CPU 只在头尾各出现一次,中间几千字节的搬运完全不参与。中断频率从”每个字一次”降到”每个数据块一次”。
通道控制方式
通道是一个专门的处理机,有自己的指令系统。 CPU 只需向通道发出一条指令,指明通道程序在内存中的位置和要操作的设备,通道就会自主执行这段通道程序,完成一整批 I/O 操作(可能涉及多个数据块、甚至多台设备),全部完成后才向 CPU 发出一次中断。
这一步解放的是”组织”:连”这批数据分几次搬、每次搬到哪”都不用 CPU 操心了。中断频率进一步降到”每一组数据块一次”。
四种方式的演进因此有一条清晰的主线:
轮询解放不了任何东西 → 中断解放了”等待” → DMA 解放了”搬运” → 通道解放了”组织”。
CPU 干预频率随之从”每个字且全程忙等”降到”每个字”、“每个块”、“每组块”。
边界
程序直接控制方式不会使进程阻塞
疑问点:哪些 I/O 方式会导致用户进程进入阻塞态
- 下列几种 I/O 方式中,会导致用户进程进入阻塞态的是( )。 I. 程序直接控制 II. 中断方式 III. DMA 方式
答案 II、III。
判据是”进程有没有主动交出 CPU”:
程序直接控制方式下,进程一直在执行轮询循环——它没有交出 CPU,也没有等待任何事件被唤醒,始终处于运行态。它确实在”等”,但那是占着 CPU 在等。
中断方式和 DMA 方式下,进程发出 I/O 请求后就主动放弃了 CPU,进入阻塞队列等待 I/O 完成中断把它唤醒,这才是阻塞态的定义。
这条辨析容易错,是因为直觉上会觉得”轮询更像在等待”。 但阻塞态的定义是”因等待某事件而暂时无法运行”,轮询的进程随时都在运行,只是在做无用功。
DMA 三阶段中 CPU 与进程各处什么状态
疑问点:DMA 预处理与后处理阶段的执行主体与进程状态
- DMA 传输前需要进行预处理,传输后需要进行后处理,则下列说法中正确的是( )。 A. 预处理程序运行在用户态,后处理程序运行在内核态 B. 负责预处理和后处理程序的进程都是请求 I/O 的进程 C. 预处理阶段不需要 CPU 参与,后处理阶段需要 CPU 参与 D. 预处理阶段请求 I/O 的进程处于运行态,后处理阶段处于阻塞态
答案 D。 把三阶段和”谁在跑、跑在哪个态”一一对上,四个选项就都能判:
预处理阶段,CPU 正在执行设备驱动程序去设置 DMA 寄存器。这段代码是由请求 I/O 的那个进程通过系统调用陷入内核后执行的,所以该进程处于运行态,且运行在内核态。
传送阶段,进程已阻塞,DMA 控制器在搬数据。
后处理阶段,DMA 发出中断,CPU 转去执行中断处理程序。此时请求 I/O 的进程还没有被唤醒,仍处于阻塞态——正是这个中断处理程序之后才会把它唤醒。
逐项排除:A 错在”预处理运行在用户态”——设置 DMA 寄存器是特权操作,只能在内核态。B 错在”后处理也是请求 I/O 的进程”——后处理是中断处理程序,中断可能打断任何一个正在运行的进程,与请求 I/O 的那个进程无关。C 错在”预处理不需要 CPU”——预处理恰恰全靠 CPU。
中断处理过程中哪些由硬件完成
疑问点:中断处理过程中一定不由硬件完成的工作
- 在接收和处理一个输入设备的中断的过程中,一定不由硬件来完成的工作是( )。 A. 判断产生中断的类型 B. CPU 模式由用户态切换到内核态 C. 主机获取设备输入 D. 保存用户程序的断点
答案 C。
判据是:中断响应阶段的动作由硬件(中断隐指令)完成,中断处理阶段的动作由软件完成。
B 保存断点、切换到内核态、跳转到中断入口,这三件事都属于”中断响应”,由 CPU 硬件在响应中断的那一瞬间自动完成,没有任何一条指令对应它们(因此称为”隐指令”)。D 同理。
A 判断中断类型在向量中断中由硬件通过中断向量识别中断源,因此不是”一定不由硬件完成”——题干问的是”一定不”,只要存在由硬件完成的情形就排除。
C 主机获取设备输入指的是把数据从控制器的数据寄存器读进内存,这必须由中断处理程序(软件)执行读指令来完成,硬件不会自己搬。在中断驱动方式下这正是 CPU 要干的那件事。
DMA “不经过 CPU” 的准确含义
“不经过 CPU”说的是数据不流经 CPU 的寄存器,而不是”CPU 完全不受影响”。
DMA 控制器与 CPU 共享同一条总线。DMA 传送时要占用总线,CPU 在这段时间内无法访问内存——这称为周期窃取。因此 DMA 传输仍然会拖慢 CPU,只是拖慢的程度远小于让 CPU 自己搬。
准确表述是:DMA 使数据传送不再消耗 CPU 的指令周期,但仍然消耗总线带宽。
中断驱动方式与 DMA 方式的中断次数
这是最能体现两者差别的一条:
中断驱动方式每传送一个字就中断一次。 传 1000 个字就要中断 1000 次,每次中断都要保存现场、执行中断服务程序、恢复现场,开销巨大。
DMA 方式在整个数据块传送完毕后才中断一次。 传 1000 个字仍然只中断一次。
这就是为什么块设备(磁盘)用 DMA、字符设备(键盘)用中断:键盘本来就是一个字符一个字符地来,用 DMA 没有意义;磁盘一次几千字节,用中断会把 CPU 淹没。
对照速查
| 程序直接控制 | 中断驱动 | DMA | 通道控制 | |
|---|---|---|---|---|
| 数据由谁搬 | CPU | CPU | DMA 控制器 | 通道 |
| 传送单位 | 字 | 字 | 数据块 | 一组数据块 |
| 数据流向 | 设备→控制器→CPU→内存 | 设备→控制器→CPU→内存 | 设备→控制器→内存(不经 CPU) | 设备→控制器→内存 |
| CPU 干预频率 | 极高(全程忙等) | 高(每个字) | 中(每个块) | 低(每组块) |
| 进程是否阻塞 | 否,一直运行态 | 是 | 是 | 是 |
| 解放了什么 | — | 等待 | 搬运 | 组织 |
| DMA 三阶段 | 谁在干 | 请求 I/O 的进程 |
|---|---|---|
| 预处理 | CPU(内核态执行驱动程序) | 运行态 |
| 数据传送 | DMA 控制器 | 阻塞态 |
| 后处理 | 中断处理程序 | 仍是阻塞态 |
| DMA 控制器四类寄存器 | 作用 |
|---|---|
| CR 命令/状态 | 接收命令、反映状态 |
| MAR 内存地址 | 数据在内存中的地址 |
| DR 数据 | 暂存数据 |
| DC 数据计数 | 还剩多少字节 |
| 中断过程 | 谁完成 |
|---|---|
| 保存断点、切换到内核态、跳转入口 | 硬件(中断隐指令) |
| 判断中断类型 | 可由硬件(向量中断) |
| 把数据从控制器读进内存 | 软件(中断处理程序) |
考点
- 四种方式的演进主线:解放等待 → 解放搬运 → 解放组织
- 程序直接控制方式不会使进程阻塞(占着 CPU 忙等,仍是运行态)
- 中断驱动每个字中断一次,DMA 每个数据块中断一次
- DMA 三阶段中,预处理和后处理都要 CPU;后处理时进程仍处于阻塞态
- 后处理由中断处理程序完成,不一定是请求 I/O 的进程
- DMA 不经过 CPU 指的是不经过 CPU 寄存器,但仍占总线(周期窃取)
- 中断过程中保存断点与模式切换由硬件,获取设备输入由软件
- 块设备配 DMA,字符设备配中断
链接
- 🏠 返回总览:操作系统第 5 章:输入/输出管理总览
- ⬅️ 上一节:5.1.1 I/O 设备
- ➡️ 下一节:5.1.3 I/O 软件层次结构
- 🔗 通道在硬件路径中的位置,见 5.1.1 I/O 设备
- 📖 名词库:第 5 章名词库