Linux将中断处理分为了2个阶段:
1.上半部直接处理硬件请求(硬中断),快速处理中断,主要处理跟硬件相关或是时间敏感的工作。
2.下半部则是内核触发(软中断)用来延迟处理上半部未完成的任务,通常以内核线程的方式运行。
这里可以用取外卖举个例子:
上半部分:接听电话,沟通送餐地址,发票或者其他事情等见面再说。
下半部分:取外卖、处理发票等事情。
查看软中断和内核线程
- /proc/softirqs 提供了软中断的运行情况;
- /proc/interrupts 提供了硬中断的运行情况。
查看各种类型的软中断在cpu上的运行次数
$ cat /proc/softirqs
CPU0 CPU1
HI: 0 0
TIMER: 811613 1972736
NET_TX: 49 7
NET_RX: 1136736 1506885
BLOCK: 0 0
IRQ_POLL: 0 0
TASKLET: 304787 3691
SCHED: 689718 1897539
HRTIMER: 0 0
RCU: 1330771 1354737
软中断是以内核线程的方式运行的,每个cpu会对应一个软中断内核线程,这个软中断内核线程叫做ksoftirqd/CPU编号:
ps aux | grep softirq
root 7 0.0 0.0 0 0 ? S Oct10 0:01 [ksoftirqd/0]
root 16 0.0 0.0 0 0 ? S Oct10 0:01 [ksoftirqd/1]
ps的输出中,名字在中括号里的,一般都是内核线程。