2010-01-27 109 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

內核線程構成工作隊列的基礎。它們是在進程上下文中運行的內核幫助例程的唯一類型。