tasklet
工作佇列
各種機制的比較
之前提到過,之所以中斷會分成上下兩部分,linux 的上半部就是中斷處理程式,下半部採用三種機制來實現,這樣分兩部執行的策略有利於縮短響應硬體的時限。
對於乙個中斷,如何劃分出上下兩部分呢?哪些處理放在上半步,哪些放在下半部?
這裡有一些經驗可供借鑑:
如果乙個任務對時間十分敏感,將其放在上半部。
如果乙個任務和硬體有關,將其放在上半部。
如果乙個任務要保證不被其他中斷打斷,將其放在上半部。
其他所有任務,考慮放在下半部。
目前使用下面三種方法:
軟中斷tasklet
工作佇列
軟中斷是一組靜態定義的下半部介面,有 32 個,可以在所有處理器上同時執行,型別相同也可以;在編譯時靜態註冊。
軟中斷的流程如下:
軟中斷執行函式如下:
asmlinkage void do_softirq(void)
**之中第一次就判斷是否在中斷處理中,如果在立刻退出函式。這說明了什麼?說明了如果有其他軟中斷觸發,執行到此處由於先前的軟中斷已經在處理,則其他軟中斷會返回。所以,軟中斷不能被另外乙個軟中斷搶占!唯一可以搶占軟中斷的是中斷處理程式,所以軟中斷允許響應中斷。雖然不能在本處理器上搶占,但是其他的軟中斷甚至同型別可以再其他處理器上同時執行。由於這點,所以對臨界區需要加鎖保護。
軟中斷留給對時間要求最嚴格的下半部使用。目前只有網路,核心定時器和 tasklet 建立在軟中斷上。
注意,這第二種機制是基於軟中斷實現的,靈活性強,動態建立的下半部實現機制。兩個不同型別的 tasklet 可以在不同處理器上執行,但相同的不可以,可以通過**動態註冊。
在 smp 上,呼叫 tasklet 是會檢測 tasklet_state_sched 標誌,如果同型別在執行,就退出函式。
tasklet 由於是基於軟中斷實現的,所以也允許響應中斷。但不能睡眠(我認為不能睡眠原因是它們內部有 spin lock)。
將下半部功能交由核心執行緒執行,有著執行緒上下文環境,可以睡眠。
提供介面把需要推後執行的任務排列到佇列裡,提供預設的工作者執行緒處理排到佇列裡的下半部工作。
工作佇列實際上是乙個鍊錶,工作執行緒作為死迴圈,鍊錶空時休眠,不空是執行每乙個工作。
下半部上下文
順序執行保障
軟中斷中斷
隨意,同型別都可以在不同處理器同時執行
tasklet
中斷同型別不能同時執行
工作佇列
程序不保障,可能被排程和搶占
選擇:
- 工作佇列:適用於任務推後到程序上下文完成,可以休眠
- tasklet:任務介面簡單,支援中斷響應,但有同種型別不能同時執行的限制
- 軟中斷:提供的執行順序保障最少,支援中斷響應,由於同型別軟中斷在其他處理器可同時執行,所以要採取措施保護共享資料。
下半部機制之軟中斷
軟中斷 softirq 是用軟體方式模擬硬體中斷的概念,實現巨集觀上的非同步執行效果。softirq是基本的下半部機制,需要互斥使用。一般很少直接使用。通常只用在少數效能比較關鍵的子系統中。它是可重入的,允許乙個softirq的不同例項可同時執行在不同的處理器上。軟中斷的 位於kernel soft...
linux裝置驅動 中斷下半部的三種實現機制
軟中斷 軟中斷是一組靜態定義的下半部介面,有 32 個,可以在所有處理器上同時執行,型別相同,也可以在編譯時靜態註冊。之中第一次就判斷是否在中斷處理中,如果在立刻退出函式。這說明了什麼?說明了如果有其他軟中斷觸發,執行到此處由於先前的軟中斷已經在處理,則其他軟中斷會返回。所以,軟中斷不能被另外乙個軟...
中斷處理 上下半部機制
首先需要了解一下中斷的概念 乙個 中斷 僅僅是乙個訊號,當硬體需要獲得處理器對它的關注時,就可以傳送這個訊號。核心維護了乙個中斷訊號線的登錄檔,該登錄檔類似於i o埠的登錄檔。模組在使用中斷前要先請求乙個中斷通道 或中斷請求irq 然後在使用後釋放該通道。用到的api就是request irq 以及...