有许多方法可以在Linux内核中安排工作:定时器,tasklet,工作队列和内核线程。什么时候使用一个与另一个有什么指导方针?
有明显的因素:计时器功能和tasklet无法休眠,因此他们不能等待互斥锁,条件变量等。
在驱动程序中为我们选择哪种机制有哪些其他因素?
哪些是首选机制?
答案 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)
内核线程构成工作队列的基础。它们是在进程上下文中运行的唯一类型的内核帮助程序。