中断是什么?
在计算机中,中断(Interrupt) 是一种异步事件处理机制,用于响应硬件设备发出的请求。当操作系统收到硬件的中断请求时,它会打断 CPU 正在执行的当前进程,并立即跳转到内核空间,执行预设的中断处理程序(Interrupt Handler)来响应硬件请求。
处理完成后,CPU 会返回到之前被打断的地方,继续执行原来的进程。
为什么需要软中断?
中断处理程序在执行期间,通常会屏蔽同类型甚至所有中断,以防止嵌套中断导致系统混乱。这意味着如果中断处理程序执行时间过长,系统将无法及时响应其他硬件的中断请求,可能导致数据丢失等严重问题。
为了解决这个问题,Linux 系统将中断处理过程分成了两个阶段:
上半部 (Top Half) - 硬中断:
- 触发方式:由硬件直接触发,具有最高的优先级。
- 执行内容:只处理与硬件紧密相关或有严格时间限制的任务,例如从网卡缓冲区读取数据包、响应时钟滴答等。
- 特点:执行速度极快,耗时极短,在执行期间会屏蔽中断。
下半部 (Bottom Half) - 软中断:
- 触发方式:由上半部(硬中断)在执行结束前调度或标记,而不是直接触发。它会在一个更安全、更合适的时机被内核执行。
- 执行内容:处理上半部未完成的、耗时较长的工作,例如对接收到的网络数据包进行协议解析和分发。
- 特点:延迟执行,以内核线程的方式运行,执行期间不屏蔽中断。
简单来说,这种两阶段机制的核心思想是“紧急的活儿马上干,耗时的活儿延后干”。
硬中断与软中断的对比
| 特性 | 硬中断 (上半部) | 软中断 (下半部) |
|---|---|---|
| 触发源 | 硬件 | 内核(由硬中断调度) |
| 响应时间 | 立即、实时 | 延迟、非实时 |
| 执行上下文 | 中断上下文(不能睡眠) | 进程上下文(可以睡眠) |
| 优先级 | 高 | 较低 |
| 执行时机 | 立即打断当前任务 | 内核在合适的时机调度 |
| 屏蔽中断 | 是 | 否 |
每个 CPU 核心都有一个专门用于处理软中断的内核线程,名为 ksoftirqd/CPU编号(例如,0 号 CPU 对应 ksoftirqd/0)。当软中断事件频繁发生时,你可能会在 top 等工具中看到这些内核线程占用了较高的 CPU。
常见的软中断类型
Linux 系统中定义了多种软中断类型,用于处理不同的下半部任务。

其中最常见的包括:
NET_RX/NET_TX: 用于处理网络数据包的接收和发送。TIMER: 用于处理内核定时器事件。SCHED: 用于进程调度。RCU: 用于 RCU(Read-Copy-Update)锁的相关处理。
你可以通过以下命令查看系统中各类软中断的累计次数:
shell
# 查看累计中断次数
<NolebasePageProperties />
cat /proc/softirqs
# 实时观察中断次数的变化率
watch -d cat /proc/softirqs