在linux内核中何时使用内核线程与工作队列

在linux内核中何时使用内核线程与工作队列,linux,linux-kernel,Linux,Linux Kernel,在linux内核中有许多方法来安排工作:计时器、微线程、工作队列和内核线程。什么时候使用一个与另一个的准则是什么 有一些明显的因素:计时器函数和微线程不能休眠,因此它们不能等待互斥体、条件变量等 在选择驾驶员的哪种机制时,还有哪些其他因素 哪些是首选机制?正如您所说,这取决于手头的任务: 工作队列将工作延迟到内核线程中—您的工作将始终在进程中运行 上下文它们是可调度的,因此可以睡觉 通常情况下,工作队列或SOTFTIRQ/Tasklet之间不存在争论;如果延迟的工作需要睡眠,则使用工作队列,否则

在linux内核中有许多方法来安排工作:计时器、微线程、工作队列和内核线程。什么时候使用一个与另一个的准则是什么

有一些明显的因素:计时器函数和微线程不能休眠,因此它们不能等待互斥体、条件变量等

在选择驾驶员的哪种机制时,还有哪些其他因素


哪些是首选机制?

正如您所说,这取决于手头的任务:

工作队列将工作延迟到内核线程中—您的工作将始终在进程中运行 上下文它们是可调度的,因此可以睡觉

通常情况下,工作队列或SOTFTIRQ/Tasklet之间不存在争论;如果延迟的工作需要睡眠,则使用工作队列,否则使用softirq或tasklet。微线程也更适合于中断处理(它们得到了某些保证,例如:微线程的运行时间永远不会晚于下一个周期,它总是对自身进行序列化,等等)

当您确切地知道希望什么时候发生某件事情,并且不想同时中断/阻塞某个进程时,内核计时器是很好的。它们在进程上下文之外运行,并且对于其他代码也是异步的,因此如果您不小心的话,它们就是竞争条件的来源

希望这有帮助

softirqs : deferred work runs in interrupt context tasklets : deferred work runs in interrupt context work queues : deferred work runs in process context softirqs : Softirqs of the same type can run concurrently on several CPUs. tasklets : Tasklets of different types can run concurrently on several CPUs, but tasklets of the same type cannot. work queues : can run simultaneously on different CPU's softirqs : cannot go to sleep tasklets : cannot go to sleep work queues : can go to sleep softirqs : cannot be preempted/schedule tasklets : cannot be preempted/schedule work queues : maybe be preempted/schedule softirqs : not easy to use tasklets : easy to use work queues : easy to use softirqs:延迟工作在中断上下文中运行 微线程:延迟的工作在中断上下文中运行 工作队列:流程上下文中的延迟工作运行 SoftIRQ:相同类型的SoftIRQ可以在多个CPU上并发运行。 微线程:不同类型的微线程可以在多个CPU上同时运行,但同一类型的微线程不能。 工作队列:可以在不同的CPU上同时运行 无法入睡 微线程:无法入睡 工作队列:可以进入睡眠状态 软件IRQ:不能被抢占/计划 微线程:不能被抢占/调度 工作队列:可能被抢占/计划 软件:不容易使用 微线程:易于使用 工作队列:易于使用
内核线程构成了工作队列的基础。它们是在进程上下文中运行的唯一类型的内核帮助程序例程。

您如何在使用内核线程和工作队列之间进行选择?创建工作队列的目的是,它们将部分替换内核线程,作为在内核中调度任务的一种方法(懒惰的工作队列是解决这一问题的最新努力)因为在某一点上,一个盒子中的内核线程数量的管理成本会很高。考虑到这一点,我认为在大多数情况下,我更倾向于工作队列而不是内核线程。实际上,softirq是无限可扩展的,也就是说,它们可以在不同的CPU上同时运行:“SoftIRQ可以在多个CPU上并发运行,即使它们是相同类型的。因此,SoftIRQ是可重入函数,必须使用旋转锁显式保护其数据结构。相同类型的微线程总是序列化的:换句话说,同一类型的微线程不能由两个CPU同时执行。“请参阅:编辑:当然,序列化仅对相同类型的微线程有效。“不同类型的微线程可以在多个CPU上同时执行。”axeoth是正确的。而且,自2012年8月以来,工作队列中相同类型的“工作项”无法在不同CPU上同时运行,因为工作队列现在不可重入: