softirq/tasklet/workqueue的區別

softirq和tasklet都屬於軟中斷,tasklet是softirq的特殊實現;

workqueue是普通的工作隊列。

1、softirq

軟中斷支持SMP,同一個softirq可以在不同的CPU上同時運行,softirq必須是可重入的。軟中斷是在編譯期間靜態分配的,它不像tasklet那樣能被動態的註冊或去除。kernel/softirq.c中定義了一個包含32個softirq_action結構體的數組。每個被註冊的軟中斷都佔據該數組的一項。因此最多可能有32個軟中斷。2.6版本的內核中定義了六個軟中斷:HI_SOFTIRQ、TIMER_SOFTIRQ、NET_TX_SOFTIRQ、NET_RX_SOFTIRQ、 SCSI_SOFTIRQ、TASKLET_SOFTIRQ。
一般情況下,在硬件中斷處理程序後都會試圖調用do_softirq()函數,每個CPU都是通過執行這個函數來執行軟中斷服務的。由於軟中斷不能進入硬中斷部分,且同一個CPU上軟中斷的執行是串行的,即不允許嵌套,因此,do_softirq()函數一開始就檢查當前CPU是否已經正出在中斷服務中,如果是則 do_softirq()函數立即返回。這是由do_softirq()函數中的 if (in_interrupt()) return; 保證的。

2、tasklet

引入tasklet,最主要的是考慮支持SMP,提高SMP多個cpu的利用率;不同的tasklet可以在不同的cpu上運行。tasklet可以理解爲softirq的派生,所以它的調度時機和軟中斷一樣。對於內核中需要延遲執行的多數任務都可以用tasklet來完成,由於同類tasklet本身已經進行了同步保護,所以使用tasklet比軟中斷要簡單的多,而且效率也不錯。 tasklet把任務延遲到安全時間執行的一種方式,在中斷期間運行,即使被調度多次,tasklet也只運行一次,不過tasklet可以在SMP系統上和其他不同的tasklet並行運行。在SMP系統上,tasklet還被確保在第一個調度它的CPU上運行,因爲這樣可以提供更好的高速緩存行爲,從而提高性能。
與一般的軟中斷不同,某一段tasklet代碼在某個時刻只能在一個CPU上運行,但不同的tasklet代碼在同一時刻可以在多個CPU上併發地執行。 Kernel/softirq.c中用tasklet_trylock()宏試圖對當前要執行的tasklet(由指針t所指向)進行加鎖,如果加鎖成功(當前沒有任何其他CPU正在執行這個tasklet),則用原子讀函數atomic_read()進一步判斷count成員的值。如果count爲0,說明這個tasklet是允許執行的。如果tasklet_trylock()宏加鎖不成功,或者因爲當前tasklet的count值非0而不允許執行時,我們必須將這個tasklet重新放回到當前CPU的tasklet隊列中,以留待這個CPU下次服務軟中斷向量TASKLET_SOFTIRQ時再執行。爲此進行這樣幾步操作:(1)先關 CPU中斷,以保證下面操作的原子性。(2)把這個tasklet重新放回到當前CPU的tasklet隊列的首部;(3)調用 __cpu_raise_softirq()函數在當前CPU上再觸發一次軟中斷請求TASKLET_SOFTIRQ;(4)開中斷。
軟中斷和tasklet都是運行在中斷上下文中,它們與任一進程無關,沒有支持的進程完成重新調度。所以軟中斷和tasklet不能睡眠、不能阻塞,它們的代碼中不能含有導致睡眠的動作,如減少信號量、從用戶空間拷貝數據或手工分配內存等。也正是由於它們運行在中斷上下文中,所以它們在同一個CPU上的執行是串行的,這樣就不利於實時多媒體任務的優先處理。

3、workqueue

什麼情況下使用工作隊列,什麼情況下使用tasklet。如果推後執行的任務需要睡眠,那麼就選擇工作隊列。如果推後執行的任務不需要睡眠,那麼就選擇tasklet。另外,如果需要用一個可以重新調度的實體來執行你的下半部處理,也應該使用工作隊列。它是唯一能在進程上下文運行的下半部實現的機制,也只有它纔可以睡眠。這意味着在需要獲得大量的內存時、在需要獲取信號量時,在需要執行阻塞式的I/O操作時,它都會非常有用。如果不需要用一個內核線程來推後執行工作,那麼就考慮使用tasklet

*******************************************************************************************************

 當前的2.6版內核中,有三種可能的選擇:softirq、tasklet和work queue。 tasklet基於softirq實現,所以兩者很相近。work queue與它們完全不同,它靠內核線程實現。

1、softirq

       軟中斷支持SMP,同一個softirq可以在不同的CPU上同時運行,softirq必須是可重入。軟中斷是在編譯期間靜態分配的,它不像tasklet那樣能被動態的註冊或去除。kernel/softirq.c中定義了一個包含32個 softirq_action結構體的數組。每個被註冊的軟中斷都佔據該數組的一項。因此最多可能有32個軟中斷。2.6版本的內核中定義了六個軟中斷:HI_SOFTIRQ、TIMER_SOFTIRQ、NET_TX_SOFTIRQ、NET_RX_SOFTIRQ、SCSI_SOFTIRQ、 TASKLET_SOFTIRQ。

       軟中斷的特性:
       1).一個軟中斷不會搶佔另外一個軟中斷。
       2).唯一可以搶佔軟中斷的是中斷處理程序。
       3).其他軟中斷(包括相同類型的)可以在其他的處理其上同時執行。
       4).一個註冊的軟中斷必須在被標記後才能執行。
       5).軟中斷不可以自己休眠(即調用可阻塞的函數或sleep等)。
       6).索引號小的軟中斷在索引號大的軟中斷之前執行。

2、tasklet

      引入tasklet,最主要的是考慮支持SMP,提高SMP多個cpu的利用率;兩個相同的tasklet決不會同時執行。tasklet可以理解爲softirq的派生,所以它的調度時機和軟中斷一樣。對於內核中需要延遲執行的多數任務都可以用tasklet來完成,由於同類tasklet本身已經進行了同步保護,所以使用tasklet比軟中斷要簡單的多,而且效率也不錯。tasklet把任務延遲到安全時間執行的一種方式,在中斷期間運行,即使被調度多次,tasklet也只運行一次,不過tasklet可以在SMP系統上和其他不同的tasklet並行運行。在SMP系統上,tasklet還被確保在第一個調度它的CPU上運行,因爲這樣可以提供更好的高速緩存行爲,從而提高性能。

       tasklet的特性:.不允許兩個兩個相同類型的tasklet同時執行,即使在不同的處理器上。

3、work queue

       如果推後執行的任務需要睡眠,那麼就選擇工作隊列。另外,如果需要用一個可以重新調度的實體來執行你的下半部處理,也應該使用工作隊列。它是唯一能在進程上下文運行的下半部實現的機制,也只有它纔可以睡眠。這意味着在需要獲得大量的內存時、在需要獲取信號量時,在需要執行阻塞式的I/O操作時,它都會非常有用。work queue造成的開銷最大,因爲它要涉及到內核線程甚至是上下文切換。這並不是說work queue的低效,但每秒鐘有數千次中斷,就像網絡子系統時常經歷的那樣,那麼採用其他的機制可能更合適一些。 儘管如此,針對大部分情況工作隊列都能提供足夠的支持。

      工作隊列特性:
      1).工作隊列會在進程上下文中執行!
      2).可以阻塞。(前兩種機制是不可以阻塞的)
      3).可以被重新調度。(前兩種只可以被中斷處理程序打斷)
      4).使用工作隊列的兩種形式:
             1>缺省工作者線程(works threads)
             2>自建的工作者線程
      5).在工作隊列和內核其他部分之間使用鎖機制就像在其他的進程上下文一樣。
      6).默認允許響應中斷。
      7).默認不持有任何鎖。

4、softirq和tasklet共同點

       軟中斷和tasklet都是運行在中斷上下文中,它們與任一進程無關,沒有支持的進程完成重新調度。所以軟中斷和tasklet不能睡眠、不能阻塞,它們的代碼中不能含有導致睡眠的動作,如減少信號量、從用戶空間拷貝數據或手工分配內存等。也正是由於它們運行在中斷上下文中,所以它們在同一個CPU上的執行是串行的,這樣就不利於實時多媒體任務的優先處理。

5、總結

表 1. 對下半部的比較

下半部 上下文 順序執行保障
軟中斷 中斷 沒有
Tasklet 中斷 同類型不能同時執行
工作隊列 進程 沒有(和進程上下文一樣被調度)
       簡單地說,一般的驅動程序的編寫者需要做兩個選擇。 首先,你是不是需要一個可調度的實體來執行需要推後完成的工作――從根本上來說,有休眠的需要嗎?要是有,工作隊列就是你的惟一選擇。 否則最好用tasklet。要是必須專注於性能的提高,那麼就考慮softirq。

 

轉自http://blog.chinaunix.net/uid-27411029-id-3301949.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章