Skip to main content
 首页 » 编程设计

linux-kernel之SoftIRQ和Tasklet之间的区别

2025年04月02日28bhlsheji

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

区别在于,SoftIRQ重新提供,而Tasklet未提供。相同的SoftIRQ可以在不同的CPU上运行,而Tasklet则不是这样。

尽管我从表面上理解了这一点,但是我无法理解这两个功能的要求。在什么情况下我们可以使用这些设施?如何识别我现在应该使用Tasklet,然后再使用SoftIRQ。

另外,在SoftIRQ上创建Tasklet是什么意思?在我用LKML阅读的其中一本书中,有关于删除Tasklets的辩论。我完全感到困惑,为什么会有这样的功能?一些近视(没有冒犯的意思)?

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

请您参考如下方法:

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之间的主要区别是:

Allocation


  • Softirq在编译时静态分配。与Tasklet不同,您不能动态注册和销毁softirq。
  • Tasklets可以使用DECLARE_TASKLET(name, func, data)静态分配,也可以动态分配并在运行时使用tasklet_init(name, func, data)初始化

  • Concurrency


  • Softirqs可以在多个CPU上同时运行,即使它们是相同类型的,因为softirqs是reentrant函数,必须使用自旋锁显式保护其数据结构。
  • Tasklet是non-reentrant,并且始终将序列化相同类型的Tasklet:换句话说,同一类型的Tasklet不能同时由两个CPU执行。但是,不同类型的小任务可以在多个CPU上同时执行。

  • Processing


  • Softirqs通过raise_softirq()激活。由do_softirq()ksoftirqd
  • 启用后,待处理的softirq由 local_bh_enable()spin_unlock_bh()内核线程处理
  • Tasklets是建立在softirq之上的下半部分机制,即tasklet由两个softirq表示:HI_SOFTIRQTASKLET_SOFTIRQ。 Tasklet实际上是从softirq运行的。这些类型的唯一真正区别是,基于HI_SOFTIRQ的任务集在TASKLET_SOFTIRQ任务集之前运行。因此,tasklet_schedule()基本上称为raise_softirq(TASKLET_SOFTIRQ)
  • 请注意,softirq(以及因此的tasklet和计时器)是在硬件中断返回或系统调用返回时运行的。同样,提起softirq的线程结束后,将运行该单个softirq(及其他)以最小化softirq latency