2010-01-27 64 views
29

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

有明显的因素:定时器功能和任务蕾无法入睡,所以他们不能在互斥,条件变量等待,等

什么是选择哪种机制给我们司机的其他因素?

哪些是首选机制?

回答

26

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

工作队列推迟工作纳入内核线程 - 你的工作会一直运行过程 上下文。它们是可调度的,因此可以睡觉。

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

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

希望这会有所帮助。

+0

如何选择使用内核线程和工作队列? – 2010-01-27 14:12:09

+3

好吧,工作队列创建背后的意图是,他们将部分替换内核线程作为在内核中调度任务的一种方式(懒惰工作队列是最新的工作来处理这个问题),因为在某些时候,内核线程的数量一个盒子的管理成本很高。考虑到这一点,我认为我通常会赞成在内核线程上使用workqueues来达到大多数意图和目的。 – 2010-01-27 14:33:36

30
​​
+11

实际上,softirq具有无限可扩展性,即它们可以在不同的CPU上同时运行:“即使它们属于相同类型,Softirqs也可以在多个CPU上同时运行。因此,softirqs是可重入函数,并且必须显式保护其数据结构自旋锁,相同类型的Tasklet总是被序列化的:换句话说,同一类型的tasklet不能被两个CPU同时执行。请参阅:http://www.91kaifa.com/doc/ulk/0596005652/understandlk-chp-4-sect-7.html – user1284631 2012-10-04 19:18:53

+4

编辑:当然,序列化仅适用于*相同类型*的任务。 “不同类型的小程序可以在多个CPU上同时执行。” – user1284631 2012-10-04 19:21:08

+2

axeoth是正确的。而且,自2012年8月以来,workqueue中同一类型的“工作项目”无法在不同的CPU上同时运行,因为工作队列现在不可重入:http://lwn.net/Articles/511421/ – Dexuan 2014-07-09 04:56:15

1

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