原文:Softirqs and Tasklets
在内核执行的任务中,有些任务不是关键的。中断处理程序的中断服务例程是序列化的,在对应的中断处理程序终止之前,不应该发生中断。相反,可延迟进程可以在启用所有中断的情况下执行。中断它们(可延迟进程)的工作,有助于保持较小的内核响应时间。对于许多时间要求严格的应用程序来说,这是一个非常重要的属性,因为它们希望中断请求在几毫秒内得到处理。
Linux 2.6通过使用两种非紧急可中断的内核函数来应对这样的挑战:所谓的可延迟函数(softirqs和tasklet),以及通过某些工作队列执行的函数(我们将在本章后面的“工作队列”一节中描述它们)。
软中断和tasklet是严格相关的,因为tasklet是基于软中断实现的。事实上,出现在内核源代码中的“软中断”(softirq)一词,通常表示这两种可延迟函数。另一个广泛使用的术语是中断上下文(interrupt context):它指内核当前正在执行的中断处理程序或可延迟函数。
软中断是静态分配的(即在编译时定义),而tasklet也可以在运行时分配和初始化(例如,在加载内核模块时)。
- 软中断可以在几个cpu上并发运行,即使它们的类型相同。
- 软中断是可重入的函数,必须显式地用自旋锁保护其数据结构。
- 相同类型的tasklet总是序列化的:换句话说,相同类型的tasklet不能同时由两个cpu执行。
- 不同类型的tasklet可以在几个cpu上并发执行。序列化tasklet简化了设备驱动程序开发人员的工作,因为tasklet函数不需要可重入。