在研究Linux中断处理时,我发现Tasklets和SoftIRQ是执行“下半部分”(较低优先级工作)的两种不同方法。我理解这一点(非常需要)。
区别在于,当Tasklet不是时,SoftIRQ会重新进入。同样的SoftIRQ可以在不同的CPU上运行,而Tasklets也不是这样。
虽然我从表面上理解这一点,但我无法理解这两个功能的要求。在什么情况下我们可以使用这些设施?如何识别我现在应该使用Tasklets和SoftIRQs。
我们的意思是,Tasklets是在SoftIRQ上制作的吗?在我用LKML阅读的一本书中,有关删除Tasklets的争论。我完全搞砸了为什么要引入这样的功能?有些短视(没有冒犯意味着)?
关于此的任何指示都会有很大帮助。
答案 0 :(得分:16)
/* 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,也可以使用tasklet_init(name, func, data)
并发
reentrant
函数,并且必须使用自旋锁明确保护其数据结构。non-reentrant
,并且相同类型的tasklet总是被序列化:换句话说,两个CPU不能同时执行相同类型的tasklet。但是,不同类型的tasklet可以在多个CPU上同时执行。处理
raise_softirq()
激活。挂起的softirq由do_softirq()
或ksoftirqd
local_bh_enable()
和spin_unlock_bh()
内核线程处理
HI_SOFTIRQ
和TASKLET_SOFTIRQ
。 Tasklet实际上是从softirq运行的。这些类型的唯一真正区别是基于HI_SOFTIRQ
的tasklet在TASKLET_SOFTIRQ
tasklet之前运行。因此,tasklet_schedule()
基本上会调用raise_softirq(TASKLET_SOFTIRQ)
softirq latency
。答案 1 :(得分:11)
Sofirqs是可重入的,即不同的CPU可以采用相同的softirq并执行它,而Tasklet是序列化的,运行tasklet的CPU是否有权完成它,没有其他CPU可以接受它(如果安排)。 请参阅此excellent文章。
此外,您可以使用本地CPU上的local_bh_enable()来启用/禁用延迟处理,这实际上使_ _local_bh_count不为零。
另外read this book(可免费下载)第131页 - 这解释了使用伪造/虚拟设备的代码示例的区别和解释 - 滚动。
答案 2 :(得分:2)
Softirqs在编译时被静态分配。与tasklet不同,你不能动态注册和销毁softirqs.Tasklets类似于softirqs(工作),但是,它们有一个更简单的接口。 Softirqs仅适用于非常高频率和高线程的用途,而tasklet在任何其他情况下都可以正常使用。
答案 3 :(得分:1)
Tasklet是在softirq上实现的,因此它们是softirq的。它们由两个softirq代表的“HI_SOFTIRQ& TASKLET_SOFTIRQ”区别优先。 尽管它们是在softirq之上实现的,但它们的区别在于:
可以静态或动态地创建/销毁Tasklet,但softirq只能通过静态方式。
两个不同的tasklet可以在同一个cpu上并发运行。但是两个相同类型的tasklet不能在同一个cpu上运行。而softirq则是另一种方式。
Softirq适用于大部分时间关键时刻系统重要的下半部处理。