中斷下半部的三種機制

2021-07-25 21:45:53 字數 1548 閱讀 5814

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 以及...