在研究Linux中断处理时,我发现Tasklet和SoftIRQ是执行“下半”(优先级较低的工作)的两种不同方法。我了解这一点(确实需要)。
区别在于,SoftIRQ重新提供,而Tasklet未提供。相同的SoftIRQ可以在不同的CPU上运行,而Tasklet则不是这样。
尽管我从表面上理解了这一点,但是我无法理解这两个功能的要求。在什么情况下我们可以使用这些设施?如何识别我现在应该使用Tasklet,然后再使用SoftIRQ。
另外,在SoftIRQ上创建Tasklet是什么意思?在我用LKML阅读的其中一本书中,有关于删除Tasklets的辩论。我完全感到困惑,为什么会有这样的功能?一些近视(没有冒犯的意思)?
关于此的任何指示都会有很大帮助。
请您参考如下方法:
/* 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
之间的主要区别是:
Allocation
DECLARE_TASKLET(name, func, data)
静态分配,也可以动态分配并在运行时使用tasklet_init(name, func, data)
初始化Concurrency
reentrant
函数,必须使用自旋锁显式保护其数据结构。 non-reentrant
,并且始终将序列化相同类型的Tasklet:换句话说,同一类型的Tasklet不能同时由两个CPU执行。但是,不同类型的小任务可以在多个CPU上同时执行。 Processing
raise_softirq()
激活。由do_softirq()
或ksoftirqd
local_bh_enable()
和
spin_unlock_bh()
内核线程处理
HI_SOFTIRQ
和TASKLET_SOFTIRQ
。 Tasklet实际上是从softirq运行的。这些类型的唯一真正区别是,基于HI_SOFTIRQ
的任务集在TASKLET_SOFTIRQ
任务集之前运行。因此,tasklet_schedule()
基本上称为raise_softirq(TASKLET_SOFTIRQ)
softirq latency
。