一尘不染

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

linux

在Linux内核中有许多安排工作的方法:计时器,tasklet,工作队列和内核线程。什么时候使用一个对另一个的准则是什么?

有明显的因素:计时器功能和小任务无法进入睡眠状态,因此它们无法等待互斥量,条件变量等。

在驱动程序中为我们选择哪种机制的其他因素是什么?

首选的机制是什么?


阅读 257

收藏
2020-06-03

共1个答案

一尘不染

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

工作队列将工作推迟到内核线程中-您的工作将始终在流程上下文中运行。他们是可安排的,因此可以入睡。

通常,在工作队列或sotftirqs /
tasklet之间没有争论。如果延迟的工作需要睡眠,则使用工作队列,否则使用softirqs或tasklet。Tasklet也更适合于中断处理(它们得到了一定的保证,例如:Tasklet永远不会在下一个滴答中运行,它总是相对于其自身进行序列化等)。

当您确切地知道何时要发生某件事,并且不想在此期间中断/阻止进程时,内核计时器将非常有用。它们在流程上下文之外运行,并且相对于其他代码而言也是异步的,因此,如果您不小心,它们将成为争用条件的来源。

希望这可以帮助。

2020-06-03