Appearance
DMA vs 中断 vs 程序查询——模拟器使用指南
考情分析
三种 I/O 方式的对比是 408 选择题的常客。很多同学知道"DMA 最好、程序查询最差",但具体差在哪里——CPU 到底在干什么、数据由谁搬运——描述不清楚。
这个模拟器用同一个场景(CPU 从磁盘读一块数据)对比三种方式:
| 考点 | 考频 |
|---|---|
| 三种 I/O 方式的工作原理 | 🔥🔥🔥 |
| CPU 参与程度和利用率 | 🔥🔥🔥 |
| 传输单位(字 vs 块) | 🔥🔥 |
| 适用场景 | 🔥🔥 |
三种模式
1. 程序查询(CPU 忙等)
CPU 不断查询设备状态寄存器:"好了没?好了没?好了没?"——直到设备准备好数据。
你会看到:CPU 一直显示"忙等轮询"状态,红色占满整个时间线。设备在准备数据的 6 个周期里,CPU 什么有效工作都没做。
CPU 利用率最低
程序查询期间,CPU 100% 被 I/O 占用。如果设备很慢(比如磁盘),CPU 要等几百万个周期——全部浪费在轮询上。
2. 中断驱动(CPU 被打断)
CPU 发出 I/O 请求后转去做其他计算。设备准备好后发中断信号,CPU 暂停当前工作,执行中断服务程序搬运数据。
你会看到:CPU 在设备准备期间显示"正常计算"(绿色),直到收到中断才切换到"中断服务"(橙色)和"搬运数据"(蓝色)。
比程序查询好在哪?
CPU 的等待时间被利用起来了。但每传一个字都要中断一次——如果传 1000 个字,就要中断 1000 次,频繁的中断保存/恢复也有开销。
3. DMA(CPU 最轻松)
CPU 只需告诉 DMA 控制器三件事:源地址、目标地址、传输字节数。DMA 控制器自己接管总线搬运数据,搬完再中断 CPU 一次。
你会看到:CPU 几乎全程显示"正常计算"(绿色),只在开头(初始化 DMA)和结尾(确认完成中断)短暂参与。数据传输由 DMA 控制器完成,CPU 完全不参与。
DMA 的核心考点
DMA 以块为单位传输(不是字)。CPU 只在开始和结束各参与一次。DMA 传输期间需要窃取总线周期(周期窃取方式),可能让 CPU 访存稍微变慢,但比中断方式高效得多。
对比表
| 程序查询 | 中断驱动 | DMA | |
|---|---|---|---|
| CPU 在等待期间 | 忙等轮询 | 做其他计算 | 做其他计算 |
| 数据搬运者 | CPU | CPU(中断中) | DMA 控制器 |
| 传输单位 | 字 | 字 | 块 |
| 中断次数 | 0 | 每字一次 | 每块一次 |
| CPU 利用率 | ~5% | ~70% | ~95% |
| 适用设备 | 简单低速 | 中速 | 高速大量 |
考研高频考点速览
| 考点 | 考频 | 关键记忆 |
|---|---|---|
| 三种方式 CPU 参与度 | 🔥🔥🔥 | 查询:全程;中断:每次中断;DMA:首尾 |
| 传输单位差异 | 🔥🔥🔥 | 查询/中断 = 字,DMA = 块 |
| DMA 周期窃取 | 🔥🔥 | DMA 传输时"偷"总线周期,CPU 不能同时访存 |
| 中断的开销 | 🔥🔥 | 保存/恢复现场 + 中断判优,频繁中断也有代价 |