软中断小结
内核处理的任务中有的不是那么紧迫的,在必要的时间可以把它们延迟一段时间,这就是软中断形成的背景。这对于哪些期望它们的中断能在几毫秒内得到处理的“急迫”应用来说是非常重要的。由此,硬中断负责处理紧急的任务,软中断负责处理不是那么紧迫的任务。
Linux 2.6内核提供了两种非紧迫、可中断函数:所谓的延迟函数(包括软中断和tasklets)和通过工作队列来执行的函数。
软中断和tasklet有密切的关系,tasklet是在软中断之上实现。事实上,出现在内核代码中的术语“软中断(softirq)常常表示可延迟函数的所有种类”。另外一种被广泛使用的术语是“中断上下文”,表示内核当前正在执行一个中断处理程序或一个可延迟的函数。
软中断的分配是静态的(即在编译时定义),而tasklet的分配和初始化可以在运行时进行(例如,安装一个内核模块时)。软中断(即便是同一种类型的软中断)可以并发地运行在多个CPU上。因此,软中断是可重入函数而且必须明确地使用自旋锁保护其数据结构。tasklet不必担心这个问题,因为内核对tasklet的执行进行了更加严格的控制。相同类型的tasklet总是串行地执行,换句话就是,不能在两个CPU上同时运行相同类型的tasklet。但是,类型不同的tasklet可以在几个不同的CPU上并发执行。tasklet的串行化使tasklet函数不必是可重入的。