Skip to content

I/O方式对比

2026 大纲 六(三)I/O 方式(程序查询、程序中断、DMA)。本篇不引入新概念,专做三条的横向对照。

n 个数据,CPU 要被惊动几次

三种 I/O 方式最有用的一个对照,是拿同一件事去问它们:传送 n 个数据,CPU 一共要介入几次?

  • 程序查询:全程无法离开——它自己就是那个不停去问的人;
  • 程序中断n 次——每准备好一个数据就打断 CPU 一次;
  • DMA2 次,与 n 无关——块开始时设一次参数,块结束时收一次中断。

前两行的介入次数都随 n 走,第三行不随。这条比例关系的断裂,就是 DMA 存在的全部意义:设备再快、数据再多,CPU 那一头的开销是恒定的。

顺着这条轴看,三次跃迁放掉的其实不是同一样东西。查询 → 中断放掉的是"等待":设备准备数据的那一大段时间还给了 CPU。中断 → DMA 放掉的是"搬运":数据不再经过 CPU 寄存器中转。DMA → 通道放掉的是"组织":连每块传送的参数都不用 CPU 去设了。剥离的顺序是从最外层(等)到最内层(管),一层比一层深。

等待搬运组织

这里有一处最容易被想当然的地方:中断并没有减少 I/O 本身的 CPU 开销。一次中断通常比一次查询更贵——它多了保存断点、保护现场、恢复现场、中断返回这四段;而两者的介入次数完全相同(都是每个数据一次)。所以拿占比公式算出来,中断的百分比常常比查询还大。它换来的是"那段等待时间可以被别的程序用掉",不是"搬一个数据变便宜了"。判断这一类说法,口径就一句:看它省的是每次传送的开销,还是等待的时间

交互可视化

加载可视化中...

一、一条轴:CPU 介入 I/O 的程度

程序查询全程占用程序中断每个数据一次DMA每块两次通道每次 I/O 任务一次
方式CPU 什么时候必须在场一次传送 n 个数据,CPU 介入几次
程序查询从启动设备到最后一个数据传完,全程全程占用,无法离开
程序中断每个数据就绪时被打断一次n
DMA块开始时设参数、块结束时收中断2 次(与 n 无关)
通道发出一条启动通道的 I/O 指令、收一次结束中断2 次(与块数也无关)

二、三次跃迁,放掉的不是同一样东西

  • 查询 → 中断:放掉的是「等待」。 查询方式下 CPU 与外设串行工作,设备准备数据的那一整段时间里 CPU 反复读状态端口,执行的指令对程序毫无贡献。中断把这一段还给了 CPU——设备准备数据期间 CPU 去跑别的程序,两者并行
  • 中断 → DMA:放掉的是「搬运」。 中断方式下数据仍走"设备接口 → CPU 寄存器 → 主存"这条三段通路,CPU 是不可替代的搬运工,所以每个数据都得惊动它一次。DMA 把通路短路成"设备接口 ↔ 主存",控制器自己发地址、自己发读写信号,介入次数从 n 掉到 2。
  • DMA → 通道:放掉的是「组织」。 DMA 卸掉了搬运,但每次块传送的参数还得 CPU 去设。设备一多,光初始化就吃掉大量 CPU 时间。通道把"先传哪台、传到哪、传完接着做什么"这层组织工作也接了过去——CPU 只发一条启动命令。

越靠后越省 CPU,但代价是硬件:中断要中断控制器和判优电路,DMA 要一整套能主控总线的控制器,通道要一个能取指执行的专用处理器。所以低速简单设备用查询方式不是"落后",是成本与收益算下来更划算。

三、三种方式全面对照

特性程序查询程序中断DMA
数据通路的两端设备接口 → CPU 寄存器 → 主存设备接口 → CPU 寄存器 → 主存设备接口 ↔ 主存(不进 CPU)
谁持有主存地址、谁发起访存CPUCPUDMA 控制器
传送单位字 / 字节(由端口位宽定)字 / 字节(由端口位宽定)数据块
CPU 与外设的关系串行并行并行
CPU 介入频率全程每个数据一次每块两次
请求的是什么不请求(CPU 主动查)CPU 的执行权总线控制权
由谁裁决中断判优总线仲裁
响应时刻查到即处理指令执行结束后存储周期结束后
是否需要中断机制(报告块传送完成)
硬件成本最低中断控制器DMA 控制器
主要适用场景低速设备、简单系统中低速设备高速、成批传送

表里有三行值得单独读一遍。

第一行(数据通路的两端)最容易记岔。 查询与中断都是"设备接口 → CPU 寄存器 → 主存",数据必须在 CPU 里过一手;DMA 是"设备接口 ↔ 主存",不进 CPU。DMA 控制器内部虽然也有一个数据缓冲寄存器,但那只是过渡缓冲,它不改变通路的两端——说"DMA 的数据通路在设备接口和 DMA 控制器之间"是错的。

响应时刻那一行的粒度差别不用背,能推出来。 中断要 CPU 交出执行权,而执行权的最小完整单位是一条指令——必须等一条指令做完,PC 与 PSW 才是干净可恢复的,所以在指令边界响应。DMA 只要总线,总线的最小不可分割单位是一个存储周期,所以在存储周期边界响应。粒度由让出的对象决定。

最后一行的"适用场景"是典型情况,不是硬约束。 给慢速设备配 DMA 完全合法,只是收益不大不值得;反过来的说法才是硬的:高速设备不能用中断方式。所以看到"DMA 适用于高速外部设备""中断方式适用于所有外部设备"这类绝对化措辞,先怀疑——它多半是把"适合不适合"偷换成了"能不能"。

四、定量:三种方式的 CPU 占比

CPU 占比=每秒介入次数×单次介入的时钟周期数主频 f
方式每秒介入次数单次开销
定时查询R/uu = 每次传送字节数)单次查询的周期数
程序中断R/um = 响应 + 处理的周期数
DMAR/BsBs = 块大小,字节)m = 预处理 + 后处理的周期数

其中 R 是设备数据传输率(B/s)。三个公式共用同一副骨架,差别只在"每秒介入次数"这一项:查询与中断都是 R/u,DMA 是 R/Bs。两种查询模型(独占查询 100%、定时查询套公式)的区分见 程序查询方式与程序中断方式

代入时有两个与方式无关的通用失分处:其一,u 由数据端口/缓冲寄存器的位宽决定,不是默认的 1 字节——题面写"接口中有一个 32 位数据缓冲寄存器",u 就是 4 B。其二,指令条数要乘 CPI 才是时钟周期数,而且各部分开销要先相加再乘("服务程序 18 条指令、其他开销相当于 2 条指令"应算 (18+2)×CPI)。这两处踩中任一个,答案都会成倍地偏。

同一台设备三种方式各算一遍:为什么中断的百分比反而比查询大(想弄清"中断到底省了什么"落到数字上是什么样时展开)

同一台机器:主频 f=1 GHz,设备数据传输率 R=1 MB/s,数据缓冲寄存器 32 位(故 u=4 B),单次查询开销 100 个时钟周期,单次中断开销 m=400 个时钟周期,DMA 块大小 Bs=4 KB、预处理 + 后处理同样 400 个周期。

定时查询

(106/4)×100109=2.5×107109=2.5%

程序中断

(106/4)×400109=108109=10%

DMA

(106/4096)×4001099.77×1041090.0098%

2.5%<10% 不是算错了:单次中断(400 周期)比单次查询(100 周期)贵,而两者的介入次数完全相同。但这两个百分比含义不同——查询方式的 2.5% 之外,CPU 还必须守在这台设备旁边(定时查询要求它按节拍回来查,独占查询更是把 100% 的时间钉在这里);中断方式的 10% 之外,CPU 的时间是自由的,可以跑任何别的程序。

中断方式的优势从来不在这个百分比上,而在于它把剩下的时间变成了可支配的时间。 DMA 那一档才是百分比意义上的碾压:介入次数从 R/u 掉到 R/Bs,直接降了 Bs/u=1024 倍。

五、什么时候必须升档

第一层是物理判据,不容商量T设备准备一个数据>T中断响应+中断处理,不成立就会丢数据——上一个数据还没被 ISR 搬走,设备已经把下一个覆盖上去。这不是"慢一点",是功能上不可用。第二层才是性能判据:物理上成立,但 CPU 占比高到挤占正常计算,同样要换 DMA。

往回降档也有条件:设备极慢(每秒几十字节)、系统极简单、不值得为它配中断控制器,程序查询方式就是合适的选择——这时候 CPU 占比本来就可以忽略。

最后两条边界,是"越靠后越好"这句话不能推到极端的地方。其一,DMA 对单个数据不一定比中断快:申请总线、建立总线控制权是一笔固定开销,传一个字节还要走一遍 DMA 流程反而不划算。它的优势在成批传送上——块越大,固定开销摊得越薄。其二,用了 DMA 仍然要用中断:一块传完之后,DMA 控制器要发一次中断请求,由 CPU 执行中断服务程序做后处理。DMA 把中断从"每个数据一次"降到"每块一次",从来没有把中断取消掉。

考点速记

  1. 三种(含通道是四种)I/O 方式是同一条轴上的刻度,轴量的是 CPU 介入 I/O 的程度;传送 n 个数据时查询全程占用、中断 n 次、DMA 2 次(与 n 无关),这条比例关系的断裂是 DMA 的意义所在。
  2. 三次跃迁放掉的是不同的东西:查询→中断放掉等待,中断→DMA 放掉搬运,DMA→通道放掉组织中断没有减少 I/O 的 CPU 开销(单次更贵),它把等待时间变成了可支配时间。
  3. 升档判据分两层:先看 T准备>T响应+处理 是否成立(不成立会丢数据),再看 CPU 占比是否可接受;"适用场景"是典型情况不是硬约束,但高速设备不能用中断

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

这一篇不出计算题(占比计算全在查询与中断DMA 两篇下方),它出的是横向对照的判断题——给四句跨方式的叙述,挑错的那一句。三道题的错项恰好各打一处。

  • 把"适用场景"说成硬约束(2013-22 的 D:中断 I/O 方式适用于所有外部设备,DMA 方式适用于快速外部设备)。两半都错:高速设备不能用中断(中断频率高到丢数据),而 DMA 接慢速设备完全合法、只是不划算。该题另外三句(中断请求 CPU 处理时间 / DMA 请求总线使用权、中断在指令结束后响应 / DMA 在总线事务完成后响应、中断靠软件搬数据 / DMA 靠硬件搬数据)全都是对的,正好是上面第三节那张表的三行。判这类题的口径已经写在表下:看到"仅""所有""必须"先怀疑
  • 把 DMA 说成"CPU 执行某段程序"(2023-22 的 C:DMA 方式下通过 CPU 执行 DMA 传送程序进行 I/O 操作)。DMA 的整个要点就是传送过程不需要 CPU 执行任何程序——CPU 只在块首做预处理、块尾收中断,中间由控制器直接控制总线。这道题的另外三句是对的:查询靠 CPU 执行查询程序、中断靠 CPU 执行中断服务程序、SSD 与网络适配器这类高速设备用 DMA。⚠️ 前两种方式确实都靠"CPU 执行某段程序",唯独 DMA 不是,这就是它与前两者的分界。
  • 判断哪些设备适合用 DMA(2025-21)。答网卡与固态硬盘。判据是"传输率高、且成批传送"——键盘每秒几十字节、针式打印机同样慢,为它们配 DMA 不但收益接近于零,还要多付一整套控制器的成本;而 DMA 的固定开销(申请总线、建立控制权)只有在成批传送时才摊得薄。这道题问的是适合,不是能否,两者的区别正是上一道题错项的来源。

复习优先级:这一篇本身不引入新概念,全部价值在第三节那张对照表上——三道真题的错项与正确项加起来,几乎把表里的每一行都摆过一遍。表里最值得逐行核对的是数据通路的两端、请求的是什么、由谁裁决、响应时刻这四行,它们是三种方式在机制上的真正分界。

易错:以为中断方式比查询方式更省 CPU 开销。单次中断更贵,它省的是等待时间。

易错:说 DMA 的数据通路在设备接口和 DMA 控制器之间。两端是设备接口与主存

易错:把"DMA 适用于高速设备"读成"仅适用于"。硬约束在另一边:高速设备不能用中断。

易错:认为 DMA 传送过程中 CPU 在执行某段传送程序。CPU 只做块首预处理与块尾后处理。

易错:以为 DMA 一定比中断快。对单个数据不一定,它靠成批传送摊薄固定开销。

相关知识

I/O 系统概述程序查询方式与程序中断方式DMA 方式通道方式异常和中断机制

真题练习