在Linux内核中有许多安排工作的方法:计时器,tasklet,工作队列和内核线程。什么时候使用一个对另一个的准则是什么?
有明显的因素:计时器功能和小任务无法进入睡眠状态,因此它们无法等待互斥量,条件变量等。
在驱动程序中为我们选择哪种机制的其他因素是什么?
首选的机制是什么?
如您所说,这取决于手头的任务:
工作队列将工作推迟到内核线程中-您的工作将始终在流程上下文中运行。他们是可安排的,因此可以入睡。
通常,在工作队列或sotftirqs / tasklet之间没有争论。如果延迟的工作需要睡眠,则使用工作队列,否则使用softirqs或tasklet。Tasklet也更适合于中断处理(它们得到了一定的保证,例如:Tasklet永远不会在下一个滴答中运行,它总是相对于其自身进行序列化等)。
当您确切地知道何时要发生某件事,并且不想在此期间中断/阻止进程时,内核计时器将非常有用。它们在流程上下文之外运行,并且相对于其他代码而言也是异步的,因此,如果您不小心,它们将成为争用条件的来源。
希望这可以帮助。