Skip to content

I/O控制方式

2026 大纲 五(一)2 I/O 控制方式,补充说明点名三项:轮询方式、中断方式、DMA 方式。

CPU 该用什么姿势等一个慢设备

上一节把设备的差异挡在了控制器后面,CPU 现在面对的只是几个寄存器。 但还有一个差异挡不住:

CPU 一秒钟能执行几十亿条指令,磁盘转一圈要十毫秒。让 CPU 死盯着状态位等它, 等于把几千万条指令的时间白白扔掉。所以这一节要回答的是:CPU 该用什么姿势等。

四种方式是同一条主线上的四个台阶,每一步都在把 CPU 从 I/O 事务里再解脱一点:

设备慢 ⇒ CPU 干等(程序直接控制)⇒ 那就别等,等的时候去干别的, 好了叫我(中断驱动)⇒ 可中断按字来,读 1 KB 要中断一千多次 ⇒ 那就整块传完再叫我(DMA)⇒ 可 DMA 一次只能把一段连续块搬到一段连续内存 ⇒ 那就让搬运方自己执行一段程序(通道)。

每一步的代价都一样:硬件更复杂、启动准备更长。 所以对比表里 "CPU 利用率最高的响应最慢"不是笔误——用更长的启动准备,换 CPU 更少的介入次数

读这一节盯住两条分界:数据经不经过 CPU 的寄存器(这是四种方式最硬的分界), 以及中断的频率(中断驱动的病根不是"还在等",而是"中断得太勤")。

一、程序直接控制方式(轮询 / 查询)

特点说明
CPU 参与全程忙等,循环测试状态位
数据传输单位(一次一个字)
数据通路设备 → 控制器 → CPU 寄存器 → 内存
根因CPU 里没有中断机构,设备无法主动报告"我好了",只能靠 CPU 反复问

浪费的量级:从终端输入一个字符约需 100 ms,而把字符送入缓冲区不到 0.1 ms——这 99.9 ms 全花在测试状态位上。

二、中断驱动方式

CPU 发出命令后立即返回去执行别的任务;控制器把一个字读进数据寄存器后,通过控制线向 CPU 发中断信号;CPU 响应中断、检查有无出错、把数据搬进内存,然后回到被中断的程序。

中断的响应与处理机制(隐指令保存断点、中断向量、中断嵌套与屏蔽)见中断和异常的处理;在 I/O 链路里它承担的角色是设备向 CPU"报告完成"的唯一通道,没有中断机构就只能退回轮询。沿用上面的数据:CPU 只需约 0.1 ms 处理中断,其余 99.9 ms 可以做别的事。

代价在于传输单位仍是字:读 1 KB 的磁盘块要中断 1024 次,每次都要保存现场、进中断处理程序、恢复现场。

三、DMA 方式

DMA(Direct Memory Access,直接存储器存取):由 DMA 控制器直接控制数据在内存与设备之间传输,CPU 只在开始(下参数)和结束(收中断)时介入。

寄存器存什么对应 I/O 请求里的哪个参数
命令/状态寄存器 CRCPU 发来的 I/O 命令、控制信息、设备状态读还是写
内存地址寄存器 MAR输入时是内存目标起始地址,输出时是内存源地址数据放哪儿
数据寄存器 DR暂存正在传送的一个字(节)——
数据计数器 DC本次要读/写的字(节)数传多少

传送过程分三段:

① 预处理(CPU 做):把命令送入 CR、内存起始地址送入 MAR、传送字数送入 DC、设备上的源地址送到 I/O 控制逻辑,然后启动 DMA 控制器,随即转去处理其他任务。

② 数据传送(DMA 控制器循环执行):从设备读一个字(节)到 DR → 挪用一个存储器周期把 DR 写到 MAR 所指内存单元 → MAR 加 1、DC 减 1 → DC ≠ 0 继续,DC = 0 则整块传完、发中断请求。

③ 后处理(CPU 做):响应 DMA 结束中断,校验数据、决定是否继续传下一块、唤醒等待该 I/O 的进程。

DMA 与 CPU 争用主存的三种化解方式

方式做法适用条件代价
停止 CPU 访问主存DMA 请求时让 CPU 交出总线,整批数据传完再还回去传输率极高、要求成组连续传送的设备CPU 在整段时间里基本停摆;设备两个数据之间的准备间隔大于一个存取周期,主存实际上闲着
周期挪用(周期窃取)每次 DMA 请求只窃取一两个存取周期,不请求时 CPU 照常访存设备的读/写周期 > 主存存取周期(绝大多数情况)每挪用一次都要申请、建立、归还总线控制权,实际占用 2~5 个主存周期
DMA 与 CPU 交替访存把一个 CPU 周期分成 C1、C2 两个分周期,C1 专供 DMA、C2 专供 CPUCPU 工作周期 > 主存存取周期(如 CPU 1.2 μs、主存 0.6 μs)不需要总线申请与归还,速率最高,但硬件逻辑最复杂
一块 4 KB 数据的量化走查:挪用比例怎么算、为什么高速块设备只能用 DMA(想看清挪用是按什么粒度发生时展开)

某磁盘数据传输率 20 MB/s,DMA 控制器的数据寄存器宽 4 B(每挪用一次搬 4 B),主存存取周期 50 ns,采用周期挪用方式传送一个 4 KB 的数据块。

① 挪用次数:每次搬 4 B,一块 4096 B 要搬 n=4096/4=1024 次。

挪用是按 DR 位宽发生的,不是按块发生的——位宽这个参数只有在这里才用得上,漏掉它就会把答案算成"只占 1 个周期"。

② 挪用总时长1024×50 ns=51.2 μs

③ 这块数据从设备流过来本身要多久4096 B20×106 B/s=204.8 μs

④ 占比 =51.2/204.8=25%。占比的分母必须是数据到达所需的时间,不是"CPU 跑完一条指令的时间"——DMA 只在数据到达的节奏上挪周期,设备不送数据时它不占总线。

⑤ 换成中断方式(每 4 B 中断一次、每次中断处理 5 μs):中断次数同样 1024 次,CPU 需要 1024×5 μs=5120 μs,而数据 204.8 μs 就全到齐了——CPU 需要的时间是数据到达时间的 25 倍,根本来不及处理,数据会被后续数据覆盖丢失。

所以对这台设备,DMA 不是"更快一点"的优化,而是唯一可行的方案

四、四种方式的横向对比

比较程序直接控制中断驱动DMA通道
CPU 干预粒度全程干预每个中断一次每个中断一次组块中断一次
传输单位一组块
数据流向设备→CPU→内存设备→CPU→内存设备→内存设备→内存
判据:数据经过 CPU 吗
判据:CPU 在等吗是(忙等)
CPU 利用率最低较低较高最高
单次请求的响应延迟最短较短较长最长
内存是否必须连续————必须连续可不连续

五、通道控制方式

本条已不在现行大纲内

现行 408 大纲 五(一)2 I/O 控制方式只列了三条:轮询方式、中断方式、DMA 方式,没有通道方式。保留这一节是因为通道处在 DMA 之上的一层,把"DMA 只能搬一段参数固定的数据,通道能自己取指令执行一串 I/O 任务"这个层级关系搞清楚,反过来能把仍在纲内的 DMA 的能力边界看得更准。读一遍建立层级感即可,不必记忆细节。

通道是一个专用 I/O 处理器,能执行通道程序(由通道指令构成)。每条通道指令含操作码、内存地址、计数、通道程序结束位 P、记录结束标志 R 五项信息——正因为有"内存地址"这一项写在每条指令里,通道才能把一组数据分别送到不同的内存区域,这是 DMA 的单一 MAR 做不到的。CPU 只需发出一条 I/O 指令(给出通道程序首址与设备号),传输单位是一组块;缺点是通道硬件昂贵、启动准备最长。

六、中断这条路上,硬件与 OS 各干了什么

四种方式里有三种要用到中断,所以"一次中断到底是谁在做什么"必须钉死。 判据在中断和异常的处理里给过一句,这里再用一遍:

凡是要动 PC、PSW 这两个特殊寄存器或模式位的,都是硬件做的—— 这些动作发生时 CPU 还在用户态,权限根本不够,只能靠硬件的自动机制完成。 剩下那些"用普通指令就能做的事"才轮到 OS。

动作谁做
保存断点(PC、PSW)硬件(中断隐指令的一部分)
切换 CPU 模式为内核态硬件
取中断向量、跳到入口硬件
保存现场(通用寄存器)操作系统
保存中断屏蔽字操作系统
提供中断服务(执行中断服务程序)操作系统
初始化中断向量表操作系统(开机时做一次)

⚠️ 两处最容易答反:断点归硬件、现场归 OS(一字之差); 中断向量表由 OS 初始化,但取向量这个动作归硬件

还有一处对照值得记:中断处理与子程序调用都要压栈保护现场, 但中断一定会保存程序状态字寄存器(PSW),子程序调用不会。 理由很直接——子程序调用不改变 CPU 的运行模式和中断允许状态,PSW 根本没变; 中断要跨模式、要关中断,PSW 必然被改写,不存起来就回不去了。

中断处理程序把数据搬到哪

这是近年反复出现的一处分界。一条完整的输入数据流是四段:

设备 控制器 数据寄存器 中断处理程序 内核缓冲区 系统调用返回时 用户缓冲区

中断处理程序只负责中间那一段:把数据从控制器的数据寄存器搬到内核缓冲区

前一段(设备 → 数据寄存器)是控制器干的,不需要软件参与; 后一段(内核缓冲区 → 用户缓冲区)要等用户进程被唤醒、系统调用返回时才做, 中断处理程序那会儿早就结束了。

所以按下一个键之后:首先获得输入信息的程序是中断处理程序(不是命令解释程序、 不是系统调用服务程序——那两个都在更上层,得等数据先被搬进内核); 中断服务例程执行结束时,数据在内核缓冲区(不在用户缓冲区、不在 CPU 寄存器、 也不再停留在键盘控制器里)。

考点速记

  1. 四种方式是同一条主线上的四个台阶,主线是逐步减少 CPU 对 I/O 的干预
  2. ⚠️最硬的一条分界:数据经不经过 CPU 的寄存器。 轮询、中断驱动走「设备 → 控制器 → CPU 寄存器 → 内存」;DMA、通道直接在设备与内存间流动。注意"不经过 CPU"指的是不经过 CPU 的寄存器,总线该抢还是要抢。
  3. ⚠️中断驱动的病根是中断频率,不是"还在不在等":它的传输单位仍是,每传一个字中断一次;DMA 是,整块一次。读 1 KB:前者中断 1024 次,后者 1 次。
  4. DMA 三个特征:① 传输基本单位是数据块 ② 数据直接在设备与内存间流动 ③ 仅在传送的开始与结束时需 CPU 干预。四类寄存器:CR 命令/状态、MAR 内存地址、DR 数据、DC 数据计数器。
  5. "只能传连续块到连续内存"的成因:只有单一的 MAR 与 DC,没有第二组寄存器描述"换个内存区继续放",DMA 控制器也不执行指令、无法判断。
  6. DMA 请求优先级高于中断请求,判据是错过了会不会丢数据:中断晚响应只是慢;DMA 晚一个周期,设备按固定速率吐来的下一个数据就把上一个覆盖了。
  7. ⚠️**"CPU 利用率最高的响应最慢"不是笔误——两列是两个口径。利用率量"CPU 有多少比例能干别的",响应延迟量"从发出请求到数据开始搬隔多久"。用更长的启动准备,换 CPU 更少的介入次数。**
  8. 单处理机下能并行的是:处理机与设备、处理机与通道、设备与设备。⚠️进程与进程不能并行(单处理机上只能并发)。
  9. 中断的软硬件分工断点(PC、PSW)归硬件,现场(通用寄存器)归 OS保存中断屏蔽字、提供中断服务、初始化中断向量表都归 OS取中断向量归硬件
  10. 中断处理与子程序调用都压栈保护现场,但中断一定会保存 PSW,子程序调用不会——子程序不跨模式、不改中断允许状态,PSW 没变。
  11. 中断处理程序把数据从数据寄存器搬到内核缓冲区;前一段(设备→数据寄存器)是控制器干的,后一段(内核→用户缓冲区)等系统调用返回时才做。
  12. 中断向量表适合用数组——它要按中断号随机访问且表项定长,链表和队列都做不到 O(1) 定位。

这一节在真题里被考过的形式

io-control 是本章最大的一个筐——挂了 14 道题, 但真正考"四种 I/O 控制方式"的只有两道,其余全落在中断上。 按问法分成四类:

  • ① 考控制方式本身(2009-23、2017-32)。2009-23 问单处理机下可并行的组合,答处理机与设备、处理机与通道、设备与设备三项,⚠️进程与进程不行(速记第八条)。2017-32 问 DMA 读盘四步的顺序,答初始化 DMA 并启动磁盘 → 传输一块数据到内存缓冲区 → DMA 发出中断请求 → 执行"DMA 结束"中断服务程序,即速记第四条那个"开始与结束各干预一次"。
  • ② 考中断的软硬件分工(2012-24、2015-23、2020-25)。2012-24 答中断一定保存 PSW(速记第十条);2015-23 问处理外部中断时该由 OS 保存的是什么,答通用寄存器(⚠️ PC 归硬件,TLB 与 Cache 由硬件自己管,都不是 OS 的活);2020-25 答提供中断服务 + 初始化中断向量表 + 保存中断屏蔽字三项,⚠️保存断点归硬件。三道题共用速记第九条一张表。
  • ③ 考中断处理程序具体做什么(2010-32、2024-31、2026-32、2018-29)。前三道全在考速记第十一条那条数据流:首先获得键盘输入的是中断处理程序中断服务例程结束时数据在内核缓冲区鼠标中断处理程序做的是把数据从数据寄存器搬到内核缓冲区。⚠️2026-32 的干扰项"将数据从输入设备传输到数据寄存器"是控制器干的,"同步到用户应用程序缓冲区"是更上层干的——三段各归各家。2018-29 问时钟中断服务程序更新什么,答内核时钟变量 + 当前进程占用 CPU 的时间 + 时间片剩余量三项全对。
  • ④ 考实现选型(2023-24)。问中断向量表适合什么数据结构,答数组——按中断号随机访问、表项定长(速记第十二条)。

复习优先级必须拿满,但重心要放对。 这一节名义上叫"I/O 控制方式", 实际考的大半是中断,而中断的判据在中断和异常的处理 已经给全了。把速记第九、十、十一条这三条钉死,就吃掉了 14 道里的 7 道。 控制方式本身只要记住第二、三条两个分界(数据经不经过 CPU 寄存器、中断频率)即可。

易错:认为中断驱动方式的问题在于"CPU 还在等"。它不等了,病根是每传一个字就中断一次

易错:认为 DMA 完全不占用总线。"不经过 CPU"指的是不经过 CPU 的寄存器,总线该抢还是要抢。

易错:认为单处理机上进程与进程可以并行。只能并发;能并行的是处理机与设备、处理机与通道、设备与设备。

易错:把保存断点和保存现场的归属搞反。断点(PC、PSW)归硬件,现场(通用寄存器)归 OS

易错:认为中断向量表由硬件初始化。由 OS 在开机时初始化;硬件负责的是"按中断号取向量"。

易错:认为子程序调用也要保存 PSW。它不跨模式、不改中断允许状态,PSW 没变

易错:认为中断服务例程结束时数据已经到了用户缓冲区。它只搬到内核缓冲区;进用户缓冲区要等系统调用返回。

易错:认为"设备 → 数据寄存器"这一段也是中断处理程序干的。那是控制器干的,不需要软件参与。

教材出处
  • 轮询、中断、DMA 三种控制方式的引入与特点,DMA 控制器的四类寄存器与工作过程:汤小丹《计算机操作系统》6.4.3 节,印刷 p195–197
  • DMA 通过窃取指令周期中总线空闲阶段与 CPU 共用系统总线:孙钟秀、费翔林《操作系统教程》(第 6 版)4.1 节,印刷 p124
  • 通道程序的五项信息与通道方式的引入:汤小丹同书 6.4.3 节,印刷 p198

相关知识

设备的基本概念与分类中断和异常的处理I/O 软件层次结构缓冲区管理

真题练习