中断和轮询有什么区别?
更新时间:2026-09-21。问题驱动短答页。中断与 DMA 的系统介绍见 中断与 DMA,中断聚合见 中断聚合,DMA 见 什么是 DMA。
一句话回答
轮询是 CPU 主动、反复去查外设状态位(「好了没?好了没?」),实现简单、响应时间确定,但空闲时也在空转烧 CPU;中断是外设就绪后主动打断 CPU、跳到 ISR 处理,平时 CPU 能休眠或跑别的任务,但有进出场保存现场的开销、延迟也不固定。
对照表
| 维度 | 轮询 polling | 中断 interrupt |
|---|---|---|
| 谁主动 | CPU 反复查询 | 外设通知 CPU |
| 空闲时 CPU | 一直占用、空转 | 可休眠/执行其他任务 |
| 响应延迟 | 确定(取决于查询间隔) | 有中断延迟、受屏蔽/优先级影响 |
| 单次开销 | 小(读个寄存器) | 大(保存恢复现场、跳转) |
| 实现复杂度 | 简单 | 需向量表/优先级/可重入考虑 |
| 高速高频事件 | 把 CPU 占满 | 进出中断开销可能反超 |
怎么选
- 低速、稀疏、要求低功耗:用中断(按键、串口偶尔来数据),CPU 平时能睡眠。
- 极高速、持续、要求确定性低延迟:倾向轮询或结合 DMA——高速时中断频率太高,现场切换成本压垮 CPU,常见做法是轮询 + 中断混合或直接 DMA。
- 多核/网卡高性能场景:NAPI 这类思路就是「中断起手、随后切轮询批量收包」,用中断聚合降低频率(见 中断聚合)。
- 大批量数据搬运:交给 DMA,CPU 只在整段完成时收一次中断,见 什么是 DMA。
写 ISR 的纪律
中断服务程序要短、快、非阻塞:只清中断标志、把数据搬到缓冲、置标志或唤醒任务,重活留给底半部/任务线程;共享数据注意 volatile 与临界区(C 侧见 volatile/restrict)。
常见坑
- 低速场景也用忙等轮询:功耗高、白白占核。
- 高速场景每个事件都中断:CPU 被进出场打满,应聚合或 DMA。
- ISR 里做耗时操作/打印/加锁等待:实时性崩溃甚至死锁。
- 进 ISR 不清中断标志:反复进中断。
- 共享变量不加 volatile/不做临界区:主循环看不到更新或读到撕裂值。
总结
轮询由 CPU 反复查询、实现简单响应确定但空闲也烧 CPU,适合极高速持续且要确定性的场景;中断由外设就绪主动通知、CPU 平时可休眠或跑别的任务,适合低速稀疏和低功耗,但有现场切换开销与不确定延迟,高频时可能压垮 CPU;工程上常用中断聚合或「中断触发+轮询批量处理」混合方案,大批量数据则交给 DMA 让 CPU 只在完成时被打断一次,且 ISR 必须短快非阻塞、及时清标志并正确处理共享数据。