SoftIRQ和Tasklet之间的区别

时间:2011-08-21 08:25:56

标签: linux-kernel interrupt-handling softirq tasklet

在研究Linux中断处理时,我发现Tasklets和SoftIRQ是执行“下半部分”(较低优先级工作)的两种不同方法。我理解这一点(非常需要)。

区别在于,当Tasklet不是时,SoftIRQ会重新进入。同样的SoftIRQ可以在不同的CPU上运行,而Tasklets也不是这样。

虽然我从表面上理解这一点,但我无法理解这两个功能的要求。在什么情况下我们可以使用这些设施?如何识别我现在应该使用Tasklets和SoftIRQs。

我们的意思是,Tasklets是在SoftIRQ上制作的吗?在我用LKML阅读的一本书中,有关删除Tasklets的争论。我完全搞砸了为什么要引入这样的功能?有些短视(没有冒犯意味着)?

关于此的任何指示都会有很大帮助。

4 个答案:

答案 0 :(得分:16)

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
};

softirqtasklet之间的主要区别是:

  

分配

  • Softirqs在编译时被静态分配。与tasklet不同,您无法动态注册和销毁softirqs。
  • 可以使用DECLARE_TASKLET(name, func, data)静态分配Tasklet,也可以使用tasklet_init(name, func, data)
  • 在运行时动态分配和初始化
  

并发

  • Softirqs可以在多个CPU上同时运行,即使它们属于同一类型,因为softirqs是reentrant函数,并且必须使用自旋锁明确保护其数据结构。
  • Tasklet是non-reentrant,并且相同类型的tasklet总是被序列化:换句话说,两个CPU不能同时执行相同类型的tasklet。但是,不同类型的tasklet可以在多个CPU上同时执行。
  

处理

  • Softirqs通过raise_softirq()激活。挂起的softirq由do_softirq()ksoftirqd
  • 启用后由local_bh_enable()spin_unlock_bh()内核线程处理
  • Tasklet是建立在softirq之上的下半部分机制,即tasklet由两个softirqs表示:HI_SOFTIRQTASKLET_SOFTIRQ。 Tasklet实际上是从softirq运行的。这些类型的唯一真正区别是基于HI_SOFTIRQ的tasklet在TASKLET_SOFTIRQ tasklet之前运行。因此,tasklet_schedule()基本上会调用raise_softirq(TASKLET_SOFTIRQ)
  • 请注意,softirqs(以及因此的tasklet和计时器)在从硬件中断返回时运行,或从系统调用返回时运行。一旦引发softirq的线程结束,运行单个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适用于大部分时间关键时刻系统重要的下半部处理。