首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SoftIRQ和Tasklet之间的区别

SoftIRQ和Tasklet之间的区别
EN

Stack Overflow用户
提问于 2011-08-21 16:25:56
回答 4查看 36.4K关注 0票数 24

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

不同的是,SoftIRQ是重新出现的,而Tasklet不是。相同的SoftIRQ可以在不同的CPU上运行,但Tasklet并非如此。

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

另外,我们所说的Tasklet是在SoftIRQ上制作的是什么意思?在我用LKML读过的一本书中,有关于删除Tasklet的争论。我完全搞不懂为什么要引入这样的功能?近视(无意冒犯)?

这方面的任何建议都会有很大帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-30 00:44:58

include/linux/interrupt.h

代码语言:javascript
复制
/* 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之间的主要区别是:

分配

  • Softirq在编译时静态分配。与微线程不同,您不能动态注册和销毁softirqs.
  • Tasklets可以使用tasklet_init(name, func, data)

静态分配,也可以动态分配并在运行时使用微线程进行初始化

并发性

  • softirq可以在多个CPU上同时运行,即使它们是相同类型的,因为softirq是reentrant函数,必须使用non-reentrant显式地保护它们的数据结构,并且相同类型的微线程始终是序列化的:换句话说,相同类型的微线程不能同时由两个CPU执行。但是,不同类型的微线程可以在多个CPU上并发执行。

处理

通过raise_softirq()激活

  • Softirq。挂起的软任务由do_softirq()ksoftirqd内核线程在被local_bh_enable()spin_unlock_bh()
  • Tasklets启用后进行处理,软任务是建立在软任务之上的一种下半层机制,即微线程由两个软任务表示:HI_SOFTIRQTASKLET_SOFTIRQ。微线程实际上是从softirq运行的。这些类型之间唯一的真正区别是,基于HI_SOFTIRQ的微线程在TASKLET_SOFTIRQ微线程之前运行。因此,tasklet_schedule()基本上调用软中断(以及微线程和计时器)在从硬件中断返回时或从系统调用返回时运行的raise_softirq(TASKLET_SOFTIRQ)
  • Note。此外,一旦引发软中断的线程结束,就会运行该单个软中断(和其他线程)以最小化softirq latency.
票数 21
EN

Stack Overflow用户

发布于 2012-05-31 23:27:08

softirq是可重入的,即不同的CPU可以获取相同的softirq并在微线程序列化时执行它,即运行微线程的同一个CPU有权完成它,其他CPU无法获取它(在调度的情况下)。请参阅此excellent文章。

您还可以通过在本地CPU上使用local_bh_enable()来启用/禁用延迟处理,这实际上会使_ _local_bh_count不为零。

还有read this book (可免费下载)页码131 -它解释了不同之处,并使用带有伪/虚拟设备滚轮的代码示例进行了解释。

票数 11
EN

Stack Overflow用户

发布于 2014-10-01 13:09:24

Softirq在编译时静态分配。与微线程不同,你不能动态注册和销毁softirqs.Tasklets类似于软中断(工作),但是,它们有一个更简单的接口。Softirqs只有在非常频繁和高度线程化的情况下才需要,而微线程在任何其他情况下都做得很好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7137209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档