Linux 将中断处理过程分成了2个阶段:
- 上半部:
- 下半部:
比如以网卡接收到数据包为例:
网卡接收到数据包后,会通过硬件中断的方式,通知内核有新的数据到了。这时,内核就应该调用中断处理程序来响应它。
对上半部来说,既然是快速处理,其实就是要把网卡的数据读到内存中,然后更新一下硬件寄存器的状态(表示数据已经读好了),最后再发送一个软中断信号,通知下半部做进一步的处理。
而下半部被软中断信号唤醒后,需要从内存中找到网络数据,再按照网络协议栈,对数据进行逐层解析和处理,直到把它送给应用程序。
查看软中断和和内核线程
/proc/softirqs 提供了软中断的运行情况
# cat /proc/softirqs
CPU0
HI: 1
TIMER: 1189813227
NET_TX: 8
NET_RX: 26627363
BLOCK: 2361265
IRQ_POLL: 0
TASKLET: 16
SCHED: 0
HRTIMER: 0
RCU: 145966351
第一列,表示软中断的类型:
-
NET_RX
网络小包会导致性能问题,大量的网络小包会导致频繁的硬中断和软中断。 NET_TX
后面表示同一种软中断在不同CPU上的分布情况。
软中断实际上是以内核线程的方式运行的,每个 CPU 都对应一个软中断内核线程,这个软中断内核线程就叫做 ksoftirqd/CPU 编号。
# ps aux | grep softirq | grep -v "grep"
root 7 0.0 0.0 0 0 ? S Oct25 4:20 [ksoftirqd/0]
网友评论