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的输出中,名字在中括号里的,一般都是内核线程。