📄 一句话概括
外设比 CPU 慢得多,让它一直盯着问就是空耗;于是改成设备干完活主动喊一声——这就是中断请求。
📝 本节和前面几节的关系
11.2 讲的是 CPU 主动去读写端口,这一节反过来:设备主动来找 CPU。
一、让 CPU 干等太浪费
CPU 快到什么程度?它一秒钟能执行上亿条指令。 设备慢到什么程度?磁盘寻道要几毫秒,键盘还得看你手速。 两者差着好几个数量级——让 CPU 站在旁边一遍遍问【好了没】,纯属浪费。 这种笨办法叫轮询:它没错,只是太费。
二、改成让设备主动喊
中断的做法是反过来:设备干完活了,拉一根线告诉 CPU。 CPU 收到之后:停下当前的事 → 跳去中断处理程序 → 处理完回来接着干。 回来之前必须先把现场保存好——不然刚才算到一半的活儿就没了。 这就是中断请求(IRQ)——它是【事件驱动】这套思路在硬件上的原型。
三、为什么它更划算
算一笔账:十台设备、每 10 毫秒查一次、设备平均 500 毫秒才响应。 每台要查 50 次,十台合计 500 次——其中绝大多数是白问。 换成中断,每台设备只需 1 次:它自己会喊。 差别不在【快】,而在CPU 从【全程陪着】变成【平时不管】。
四、中断也不是免费的
跳来跳去本身有开销:保存现场、查中断表、恢复现场。 如果中断太频繁,CPU 就光忙着进进出出了——这叫中断开销压过了正事。 所以真正干活的时候常常攒一批一起处理(这正是 11.5 里 DMA 的出发点)。 【用中断还是攒批】,本质上是在【及时】和【少折腾】之间挑一个。
五、动手 Demo:外部设备的中断请求
外设比 CPU 慢得多,让 CPU 一直盯着问就是空耗。 轮询和中断的差距,算一笔账就出来了。
devs, poll_ms, resp_ms = 10, 10, 500
polls = resp_ms // poll_ms
print("每台设备要查", polls, "次")
print("十台合计空查", polls * devs, "次")
print("用中断则每台只需", 1, "次")
实跑输出:
--------------------------------------------------------------------
外部设备的中断请求
--------------------------------------------------------------------
**外设比 CPU 慢得多**——磁盘几毫秒、键盘看人手速。
如果让 CPU 一直盯着问【好了没】,**那就是在空耗。**
两种办法对比:
轮询(不断去问) 中断(好了来喊)
-------------------------------------------------------
谁发起 CPU 主动去查 设备主动通知
CPU 开销 一直陪着 平时不管,来事才管
响应及时性 看查询间隔 几乎立刻
适合 设备很少、很快 设备多、快慢不一
算一笔账就明白为什么后来都选中断:
设备台数 10 台
轮询间隔 10 毫秒
设备平均响应 500 毫秒
每台设备要查 50 次
十台合计空查 500 次(其中绝大多数是白发问)
用中断则每台只需 1 次(它自己会喊)
中断怎么走:**设备拉一根线 → CPU 停下当前事 → 跳去中断处理程序 → 处理完回来接着干。**
**回来之前要先把现场保存好**——不然刚才算到一半的活儿就没了。
这也解释了另一件事:**中断不是免费的**,跳来跳去本身有开销。
所以真正干活时【用中断、还是攒一批一起处理】,是要权衡的。
实测:每台查 50 次、十台合计 500 次空查,而中断方案每台只要 1 次。 差别不在快,而在 CPU 从【全程陪着】变成【平时不管】。
30 秒实验
- 在纸上改一改参数:如果设备响应要 5 秒,轮询次数会变成多少。
- 想一想:手机上的【按下去才有反应】和【一直刷新看有没有按】,哪种更省电。
常见误区
- 以为轮询是错的。它只是费——设备很少很快时反而更简单。
- 以为中断是白捡的。保存现场、切换处理程序都要开销。
自测三问(点开对答案)
1. 为什么不用轮询? —— CPU 比设备快好几个数量级,一直去问等于空耗,绝大多数询问都是白问。 2. 中断的完整过程是什么? —— 设备拉线通知,CPU 停下当前事、跳去中断处理程序,处理完保存现场回来后接着干。 3. 中断为什么不是免费的? —— 保存与恢复现场、切换处理程序都有开销,中断太频繁会让 CPU 光忙进忙出。- ☐ 下一节(11.4 通过中断实现实时处理)
相关笔记
- 通过中断实现实时处理 — 中断最典型的一种用法
- 负责硬件输入输出的in指令和out指令 — 中断来了之后做什么
- 决定程序流程的程序计数器 — 被中断打断的是什么
- 🔵 计算机基础 · 索引 — 硬件底层的入门课
- ⚙️ 程序是怎样跑起来的 · 索引