什么时候在Linux内核中使用内核线程vs工作队列

有很多方法可以在Linux内核中安排工作:定时器,小程序,工作队列和内核线程。 什么时候使用一个vs另一个的准则?

有明显的因素:定时器函数和小程序不能睡觉,所以他们不能等待互斥,条件variables等。

司机select哪种机制还有哪些其他因素?

哪些是首选机制?

Solutions Collecting From Web of "什么时候在Linux内核中使用内核线程vs工作队列"

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

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

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

内核定时器是很好的,当你知道什么时候你想要发生什么事情,而不想在此期间中断/阻止一个进程。 他们运行在流程的上下文之外,对于其他代码也是异步的,所以如果你不小心的话,它们就是竞争条件的来源。

希望这可以帮助。

 softirqs:延迟工作在中断上下文中运行
 tasklets:延迟工作在中断上下文中运行
工作队列:延迟工作在进程上下文中运行

 softirqs:不能在不同的CPU上同时运行
 tasklets:不能在不同的CPU上同时运行
工作队列:可以在不同的CPU上同时运行

 softirqs:不能去睡觉
 tasklets:不能去睡觉
工作排队:可以去睡觉

 softirqs:不能被抢占/时间表
 tasklets:不能被抢占/时间表
工作队列:可能被抢占/时间表

 softirqs:不好用
 tasklets:易于使用
工作队列:易于使用

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