在研究Linux中断处理时,我发现Tasklets和SoftIRQs是执行"下半部分"(低优先级工作)的两种不同方法。我理解这个(真正的需要)。
不同之处在于,SoftIRQs是可重入的,而Tasklet则不是。相同的SoftIRQ可以在不同的cpu上运行,而tasklet则不是这样。
虽然我从表面上理解了这一点,但我没有理解这两个功能的需求。在什么情况下我们可以使用这些设施?如何认识到我现在应该使用微线程,然后使用SoftIRQs。
我们所说的微线程是在SoftIRQs上创建的是什么意思?在我读过的一本关于LKML的书中,有关于删除微线程的争论。我完全不明白为什么有人会引入这样的功能?目光短浅(无意冒犯)?
include/linux/interrupt.h
/* PLEASE, avoid to allocate new softirqs, if you need not _really_ high
frequency threaded job scheduling. For almost all the purposes
tasklets are more than enough. F.e. all serial device BHs et
al. should be converted to tasklets, not to softirqs.
*/
enum
{
HI_SOFTIRQ=0, /* High Priority */
TIMER_SOFTIRQ,
NET_TX_SOFTIRQ,
NET_RX_SOFTIRQ,
BLOCK_SOFTIRQ,
BLOCK_IOPOLL_SOFTIRQ,
TASKLET_SOFTIRQ,
SCHED_SOFTIRQ,
HRTIMER_SOFTIRQ,
RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */
NR_SOFTIRQS
};
softirq
和tasklet
的主要区别是:
分配
- 软件在编译时静态分配。与微线程不同,你不能动态注册和销毁软线程。
- 微线程可以使用
DECLARE_TASKLET(name, func, data)
静态分配,也可以使用tasklet_init(name, func, data)
动态分配并在运行时初始化
并发性
- Softirqs可以并发地运行在多个cpu上,即使它们是相同类型的,因为Softirqs是
reentrant
函数,必须用自旋锁显式地保护它们的数据结构。 - 微线程是
non-reentrant
,并且相同类型的微线程总是序列化的,换句话说,相同类型的微线程不能被两个cpu同时执行。但是,不同类型的微线程可以在多个cpu上并发执行。
处理
- 软响应是通过
raise_softirq()
激活的。在local_bh_enable()
或spin_unlock_bh()
启用后,暂挂软线程由do_softirq()
和ksoftirqd
内核线程处理。 - 微线程是建立在软线程之上的下半机制,即微线程由两个软线程表示:
HI_SOFTIRQ
和TASKLET_SOFTIRQ
。微线程实际上是从一个软线程运行的。这些类型之间唯一真正的区别是基于HI_SOFTIRQ
的微线程在TASKLET_SOFTIRQ
微线程之前运行。因此,tasklet_schedule()
基本上调用raise_softirq(TASKLET_SOFTIRQ)
- 请注意,软线程(以及微线程和计时器)是在硬件中断返回时运行的,或者是从系统调用返回时运行的。而且,一旦触发软线程结束,就会运行单个软线程(以及其他软线程)以最小化
softirq latency
。
微线程是可重入的,也就是说不同的CPU可以使用相同的微线程并执行它,而微线程是序列化的,即运行微线程的同一CPU有权利完成它,没有其他CPU可以使用它(在调度的情况下)。参考这篇优秀的文章。
你也可以通过在本地CPU上使用local_bh_enable()来启用/禁用延迟处理,这实际上使_ _local_bh_count不为零。
也可以阅读这本书(免费下载)第131页-它解释了两者的区别,并使用了一个假/假设备- roller的代码示例进行了解释。
软件在编译时静态分配。与微线程不同,你不能动态注册和销毁软线程。微线程类似于软线程(工作),但是它们有一个更简单的接口。软线程只有在非常高的频率和高线程使用时才需要,而微线程在任何其他情况下都可以做得很好。
微线程是在软线程之上实现的,所以它们是软线程。它们由两个软码"HI_SOFTIRQ &TASKLET_SOFTIRQ"的差异是优先级。尽管它们是在软件的基础上实现的,但它们的不同之处在于:
-
微线程可以静态或动态地创建/销毁,但软线程只能静态地创建/销毁。
-
两个不同的微线程可以在同一个cpu上并发运行。但是两个相同类型的微线程不能在同一个cpu上运行。而软软件则相反。
Softirq's是为大多数时间紧迫的&