Fork me on GitHub

理解Linux软中断

中断:中断是系统用来响应硬件设备请求的一种机制,它会打断进程的正常执行和调度,然后调用内核中的中断处理程序来响应设备的请求。

中断的形象化描述:取外卖场景

1.中断是一种异步的事件处理机制,能提高系统的并发处理能力

2.为了减少对正常进程运行进行影响,中断处理程序需要尽快运行

3.中断分为,上下两个部分

(1)上半部用来快速处理中断,在中断禁止模式下,主要处理跟硬件紧密相关的或时间敏感的工作
(2)下半部用来延迟处理上半部未完成的工作,通常以内核线程的方式运行。

小结:

  • 上半部直接处理硬件请求,即硬中断,特点是快速执行
  • 下半部由内核触发,即软中断,特点是延迟执行

实际上,上半部会打断CPU正在执行的任务,然后立即执行终端处理程序。而下半部分以内核线程的方式执行,并且每个CPU都对应一个软中断内核线程,名为“ksoftirq/cpu编号”。

软中断除了硬件设备中断处理程序的下半部分,还包括一些内核自定义的事件,如:内核调度RCU锁

4.proc文件系统是一种内核空间和用户空间进行通信的机制,可以用来查看内核的数据结构或者用来动态修改内核配置,如:

  • /proc/softirqs提供软中断的运行情况
  • /proc/interrupts提供硬中断的运行情况

辅助案例加深理解

例子:网卡接收数据包

网卡接收到数据包后,会通过硬件中断的方式,通知内核有新的数据到了。这时,内核就会调用中断处理程序来响应它。

在这个案例中,上半部和下半部负责的工作:

  • 上半部:既然是快速处理,其实就是要把网卡的数据读到内存中,然后更新一下硬件寄存器的状态(表示数据已经读好了),最后再发送一个软中断信息,通知下半部做进一步处理了。
  • 下半部:被软中断唤醒后,需要从内存中找到网络数据,再按照网络协议栈,对数据进程逐层解析和处理,直到把它送给应用程序。