中断其实是一种异步的事件处理机制, 可以提高系统的并发处理能力. 由于中断处理程序会打断其他进程的运行, 所以为了减少对正常进程运行调度的影响, 中断处理程序需要尽可能快的运行.
<aside> 💡 中断处理程序在响应中断的时候, 还会临时关闭中断. 此时后续的中断都不能响应. 也就是说中断可能会丢失
</aside>
Linux 中对于执行时间较长的中断, 称之为软中断. 它的处理过程分为两个阶段
第一个阶段用于快速处理中断, 它在中断禁止模式下运行, 主要处理硬件紧密相关的或时间敏感的工作.
举例说明就是系统需要快速响应来自硬件的中断请求, 后续处理交由第二阶段内核线程处理
第二个阶段用来延迟处理第一个阶段未完成的工作, 通常以内核线程的方式运行
举例说明.
网卡接收到数据, 将会发出一个硬中断(也可以理解为硬件中断)信号, 通知内核有新的数据. (这个阶段会立马打断 CPU 正在执行的任务, 然后将网卡数据读取到内存中, 复位网卡寄存器, 特点是快速执行).
在执行完成第一阶段之后, 将会发送一个软中断信号, 通知内核执行下一步工作 ( 从内存中寻找数据, 解析等 )
软中断是以内核线程的方式执行, 并且每个 CPU 都对应一个软中断内核线程. 名字为 "ksoftirqd/CPU 编号"
<aside> 💡 软中断不只包括前面说的硬件设备中断处理程序的下半部分, 一些内核自定义的事件也属于软中断. 如内核调度等
</aside>