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

DMA vs 中断 vs 程序查询——模拟器使用指南

这个模拟器帮你看清什么

三种 I/O 方式的结论很好背——"DMA 最好、程序查询最差"。真正说不清的是那句"CPU 在等待期间可以做别的事"到底长什么样:CPU 具体在哪几个周期空转、哪几个周期在干活、数据是谁搬的。

这个模拟器把同一件事(读一块数据)用三种方式各跑一遍,时间线是并排可比的。看完你应该能指着任意一个周期说出 CPU 此刻在做什么。

概念本身别在这里学,见文末链接。

加载可视化中...

界面速览

位置控件作用
顶部程序查询 / 中断驱动 / DMA 三个按钮切换 I/O 方式,时间线随之重算
中部CPU 状态块、设备状态块显示当前周期各自在做什么
中部CPU 利用率条绿=有效计算、红=忙等浪费、蓝=数据传输
底部◀ | ▶/⏸ | ▶上一步 | 播放/暂停 | 下一步
底部N / 总数当前在第几个周期
底部速度下拉0.5x / 1x / 2x
底部「重新播放」跑到末尾才出现

颜色对照(读时间线全靠它):

CPU 状态颜色含义
忙等轮询反复读状态寄存器,纯浪费
正常计算绿在跑别的程序,这才是有效工作
搬运数据数据正经过 CPU 寄存器
中断服务正在执行 ISR

设备侧只有三态:准备中 / 数据就绪 / 空闲。

三种模式怎么看

程序查询

操作:点顶部「程序查询」,把速度调到 0.5x,点 ▶ 播放。

盯哪里:CPU 状态块的颜色,以及利用率条里红色占多长。

该看到:设备显示"准备中"的整段时间里,CPU 一直是红色的"忙等轮询",利用率条几乎全红。一次有效计算都没有。

看懂的标志:你能回答"这段时间 CPU 执行了指令吗?"——执行了,但执行的全是查询状态寄存器的指令,对程序毫无贡献。忙等不是停机,是空转。

中断驱动

操作:点「中断驱动」,用 ▶ 单步走,不要连播。

盯哪里:CPU 状态从绿变橙的那一刻,以及橙色持续几个周期。

该看到:设备"准备中"期间 CPU 是绿色(正常计算)——等待时间被利用起来了;设备"数据就绪"后 CPU 转橙色(中断服务)再转蓝色(搬运数据)

看懂的标志:你能指出绿色那段就是中断方式相对程序查询省下来的东西。省的不是 I/O 开销本身,是等待时间。

DMA

操作:点「DMA」,先连播一遍看整体,再单步回看开头和结尾。

盯哪里:CPU 状态块几乎全程是绿的,而数据仍在传。

该看到:CPU 只在开头(初始化 DMA 控制器:给源地址、目标地址、传输字节数)和结尾(收完成中断)各参与一次,中间整段数据传输它完全不在场。

看懂的标志:你能说出"这段时间数据在动,但它没经过 CPU"——数据通路是设备接口 ↔ 主存,CPU 不在通路上。这正是 DMA 与前两种的本质差别。

三个动手任务

做完这三个,这个模拟器的价值就榨干了:

  1. 切到程序查询,数一数利用率条里红色占了几个周期;再切到中断驱动数绿色。两个数字的差就是"CPU 被解放出来的时间"。
  2. 在中断模式下单步到中断发生的那一拍,记下 CPU 状态从绿变橙的周期号。想一想:如果要传的不是 1 个字而是 1000 个字,这个橙色段会出现多少次?(答案是 1000 次——这就是中断方式的天花板。)
  3. 在 DMA 模式下找出 CPU 参与的两个时刻,用自己的话说出它各做了什么。做不到就回 DMA 方式 再读一遍。

概念去哪里学

本文只讲怎么用这个模拟器,不讲概念:

真题练习