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

时间:2010-01-27 13:50:26

标签: linux linux-kernel

有许多方法可以在Linux内核中安排工作:定时器,tasklet,工作队列和内核线程。什么时候使用一个与另一个有什么指导方针?

有明显的因素:计时器功能和tasklet无法休眠,因此他们不能等待互斥锁,条件变量等。

在驱动程序中为我们选择哪种机制有哪些其他因素?

哪些是首选机制?

3 个答案:

答案 0 :(得分:31)

softirqs : deferred work runs in interrupt context
tasklets : deferred work runs in interrupt context
work queues : deferred work runs in process context

softirqs : cannot run simultaneously on different CPU's
tasklets : cannot run simultaneously on different CPU's
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

答案 1 :(得分:29)

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

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

通常,工作队列或sotftirqs / tasklet之间没有争论;如果延迟工作需要休眠,则使用工作队列,否则使用softirqs或tasklet。 Tasklet也更适合中断处理(它们有一定的保证,例如:一个tasklet永远不会比下一个tick更晚运行,它总是按照自身序列化等等。)

如果您确切知道何时发生某些事情,并且不想在此期间中断/阻止进程,则内核计时器很好。它们在进程上下文之外运行,并且它们在其他代码方面也是异步的,因此如果你不小心,它们就是竞争条件的来源。

希望这有帮助。

答案 2 :(得分:1)

内核线程构成工作队列的基础。它们是在进程上下文中运行的唯一类型的内核帮助程序。