精简版 · 小杯2026-08 冻结,已停止更新(发布前修订了 4 处已知错误)。后续勘误与新增内容只在正式版。看正式版(中杯)→
Skip to content

I/O方式对比

考情分析

三种 I/O 方式的对比常在综合题里出现,题面会给出具体参数让你计算 CPU 用于 I/O 的时间占比、实际传输效率。这类题目的核心在于搞清楚每种方式中 CPU 在什么环节介入、介入多少次。

大纲定位

考纲第六章(三):I/O 方式三条的横向对比。

本篇不引入新知识点,专做三种方式的对照与定量计算。

三种方式全面对比

特性程序查询中断驱动DMA
数据传输经过 CPU
数据通路(两端是谁)设备接口 → CPU 寄存器 → 主存设备接口 → CPU 寄存器 → 主存设备接口 ↔ 主存(不进 CPU)
谁持有主存地址、谁发起访存CPUCPUDMA 控制器
传输单位字/字节字/字节数据块
CPU 在传输期间忙等(轮询)可执行其他程序可执行其他程序
CPU 介入频率每个字都全程参与每个字中断一次每个块开始/结束各一次
响应时机随时(查询到就处理)指令执行结束后存储周期结束后
硬件成本最低需要中断控制器需要 DMA 控制器
CPU 利用率最低中等最高
适用设备(主要场景)低速、简单系统中低速设备高速、成批传送

编者注("数据通路"那一行):查询和中断方式下,数据要先进 CPU 的寄存器再写主存,通路是三段;DMA 是设备接口直连主存,CPU 不在通路上。DMAC 内部的数据缓冲寄存器只是过渡缓冲,不改变通路的两端——"数据通路在设备接口和 DMA 控制器之间"是错的说法。

另外,"适用设备"这一栏是主要场景,不是硬限制。DMA 并没有"必须接高速设备"的约束,只要设备支持 DMA 协议就能用。408 里凡是出现"适用于""所有""必须"这类绝对化措辞的选项,先怀疑。

定量分析框架

设 CPU 主频为 f(Hz),一个时钟周期为 T=1/f

程序查询方式的 CPU 开销

假设设备数据传输速率为 R(B/s),每次查询需要 c 条指令,每条指令 k 个时钟周期。

u每次传输的字节数——它由数据端口/缓冲寄存器的宽度决定(端口 8 位则 u=1,32 位则 u=4),不是默认 1 字节

每秒查询次数=RuCPU 用于查询的时钟周期数=Ru×c×kCPU 时间占比=R×c×ku×f×100%

编者注(u 是最常被漏的量):题面里"I/O 数据端口 32 位""每次传送一个字"这类条件就是在告诉你 u。默认按 1 字节算,结果会差 u 倍。

两种模型别混用——先从题面判:

题面怎么说用哪套
"CPU 循环等待直到设备就绪""期间不做其他事"独占查询(忙等),占比 100%,没什么可算
"每隔 T 查询一次""每次查询占用 c 条指令"定时查询,用上面的公式算

408 的计算题一律是定时查询口径——只有它才有东西可算。

中断方式的 CPU 开销

每传一个传输单位u 字节)触发一次中断,每次中断服务需要 m 个时钟周期(含保存/恢复现场)。

每秒中断次数=Ru,CPU 用于中断的时钟周期数=Ru×m

m 常常要自己折算——题目给的是指令条数

m=(服务程序指令数+其他开销折合指令数)×CPI

两部分先相加再乘 CPI

CPU 时间占比=R×mu×f×100%

DMA 方式的 CPU 开销

DMA 以块为单位传输,设块大小为 Bs 字节,每秒传输数据量为 R(B/s)。

每秒 DMA 中断次数 =R/Bs,每次中断 CPU 开销为 m 个时钟周期。

CPU 时间占比=(R/Bs)×mf×100%

由于 Bs 通常很大(如 512 B 或 4 KB),DMA 的 CPU 开销比中断方式低 Bs 倍。

定量对比示例

假设参数如下:

参数
CPU 主频 f1 GHz
设备传输速率 R1 MB/s
查询一次:c×k100 个时钟周期
中断一次:m500 个时钟周期
DMA 块大小 Bs4 KB
DMA 中断一次:m500 个时钟周期
方式每秒 CPU 开销(周期)CPU 时间占比
程序查询106×100=10810%
中断106×500=5×10850%
DMA(106/4096)×5001.22×1050.012%

这里中断的 CPU 开销反而高于查询,因为中断保存/恢复现场的开销(500 周期)大于单次查询(100 周期)。但关键区别是:查询方式下 CPU 在等待期间什么都不能做(忙等),中断方式下 CPU 在等待期间可以执行其他程序。

所以中断方式的优势不是减少 I/O 本身的 CPU 开销,而是让 CPU 在 I/O 等待期间去做有用的事

选择 I/O 方式的决策逻辑

判断标准:

  • 如果设备极慢(键盘、鼠标),中断频率低,中断方式就够了
  • 如果设备很快(磁盘 100 MB/s),每字节中断一次会导致每秒 108 次中断,CPU 完全崩溃,必须用 DMA
  • DMA 将中断频率降低了 Bs 倍(块大小倍)

交互可视化

加载可视化中...

例题

例 1:CPU 主频 800 MHz,某外设数据传输速率 0.5 MB/s,中断服务程序共需 200 个时钟周期。如果采用中断方式,CPU 用于该设备 I/O 的时间占比是多少?

:每秒中断 0.5×106 次,每次 200 周期。

占比=0.5×106×200800×106=1088×108=12.5%

例 2:承接例 1,如果改用 DMA 方式,块大小 512 B,中断处理同样 200 个时钟周期,CPU 时间占比变为多少?

:每秒中断次数 =0.5×106/512976.6 次。

占比=976.6×200800×1060.0244%

与中断方式的 12.5% 相比,DMA 将 CPU 开销降低了约 500 倍(Bs=512)。

例 3:某系统同时连接了键盘(10 B/s)和磁盘(50 MB/s),应该分别采用什么 I/O 方式?

:键盘速率极低,10 B/s 意味着每秒最多 10 次中断,开销可忽略不计,使用中断方式即可。磁盘 50 MB/s 如果用中断方式,每秒 5×107 次中断,CPU 根本处理不过来,必须使用 DMA,以块为单位传输(4 KB 块 → 每秒约 12207 次中断,开销很小)。

考点清单

  • 程序查询 CPU 全程忙等,中断方式释放 CPU 等待时间,DMA 释放 CPU 传输时间
  • 中断方式的优势不在于减少 I/O 的 CPU 开销,而在于 CPU 可以在等待期间做其他事
  • DMA 的 CPU 开销比中断方式低约 Bs 倍(块大小倍)
  • CPU 时间占比 = 每秒中断次数 × 单次中断周期数 / CPU 主频
  • DMA 响应在存储周期结束后(比中断更细粒度)
  • 高速设备必须用 DMA,否则中断频率会压垮 CPU

真题练习