⚙️ 第十一章 访问硬件的方法
📄 一句话概括

外设比 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 秒实验

  1. 在纸上改一改参数:如果设备响应要 5 秒,轮询次数会变成多少。
  2. 想一想:手机上的【按下去才有反应】和【一直刷新看有没有按】,哪种更省电。

常见误区

  1. 以为轮询是错的。它只是费——设备很少很快时反而更简单。
  2. 以为中断是白捡的。保存现场、切换处理程序都要开销。
自测三问(点开对答案) 1. 为什么不用轮询? —— CPU 比设备快好几个数量级,一直去问等于空耗,绝大多数询问都是白问。 2. 中断的完整过程是什么? —— 设备拉线通知,CPU 停下当前事、跳去中断处理程序,处理完保存现场回来后接着干。 3. 中断为什么不是免费的? —— 保存与恢复现场、切换处理程序都有开销,中断太频繁会让 CPU 光忙进忙出。

相关笔记