在研究Linux中断处理时,我发现Tasklets和SoftIRQ是执行“下半部分”(优先级较低的工作)的两种不同方法。我理解这一点(相当真实的需要)。
不同的是,SoftIRQ是重新出现的,而Tasklet不是。相同的SoftIRQ可以在不同的CPU上运行,但Tasklet并非如此。
虽然我从表面上理解了这一点,但我无法理解这两个功能的要求。在什么情况下我们可以使用这些设施?如何认识到我现在应该使用Tasklets,然后使用SoftIRQ。
另外,我们所说的Tasklet是在SoftIRQ上制作的是什么意思?在我用LKML读过的一本书中,有关于删除Tasklet的争论。我完全搞不懂为什么要引入这样的功能?近视(无意冒犯)?
这方面的任何建议都会有很大帮助。
发布于 2015-07-30 00:44:58
/* 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之间的主要区别是:
分配
tasklet_init(name, func, data)静态分配,也可以动态分配并在运行时使用微线程进行初始化
并发性
reentrant函数,必须使用non-reentrant显式地保护它们的数据结构,并且相同类型的微线程始终是序列化的:换句话说,相同类型的微线程不能同时由两个CPU执行。但是,不同类型的微线程可以在多个CPU上并发执行。处理
通过raise_softirq()激活
do_softirq()和ksoftirqd内核线程在被local_bh_enable()或spin_unlock_bh()HI_SOFTIRQ和TASKLET_SOFTIRQ。微线程实际上是从softirq运行的。这些类型之间唯一的真正区别是,基于HI_SOFTIRQ的微线程在TASKLET_SOFTIRQ微线程之前运行。因此,tasklet_schedule()基本上调用软中断(以及微线程和计时器)在从硬件中断返回时或从系统调用返回时运行的raise_softirq(TASKLET_SOFTIRQ)softirq latency.发布于 2012-05-31 23:27:08
softirq是可重入的,即不同的CPU可以获取相同的softirq并在微线程序列化时执行它,即运行微线程的同一个CPU有权完成它,其他CPU无法获取它(在调度的情况下)。请参阅此excellent文章。
您还可以通过在本地CPU上使用local_bh_enable()来启用/禁用延迟处理,这实际上会使_ _local_bh_count不为零。
还有read this book (可免费下载)页码131 -它解释了不同之处,并使用带有伪/虚拟设备滚轮的代码示例进行了解释。
发布于 2014-10-01 13:09:24
Softirq在编译时静态分配。与微线程不同,你不能动态注册和销毁softirqs.Tasklets类似于软中断(工作),但是,它们有一个更简单的接口。Softirqs只有在非常频繁和高度线程化的情况下才需要,而微线程在任何其他情况下都做得很好。
https://stackoverflow.com/questions/7137209
复制相似问题