1. 程式人生 > 其它 >什麼是軟中斷?

什麼是軟中斷?

前面我們也提到了,中斷請求的處理程式應該要短且快,這樣才能減少對正常程序執行排程地影響,而且中斷處理程式可能會暫時關閉中斷,這時如果中斷處理程式執行時間過長,可能在還未執行完中斷處理程式前,會丟失當前其他裝置的中斷請求。

那 Linux 系統為了解決中斷處理程式執行過長和中斷丟失的問題,將中斷過程分成了兩個階段,分別是「上半部和下半部分」

  • 上半部用來快速處理中斷,一般會暫時關閉中斷請求,主要負責處理跟硬體緊密相關或者時間敏感的事情。
  • 下半部用來延遲處理上半部未完成的工作,一般以「核心執行緒」的方式執行。

前面的外賣例子,由於第一個配送員長時間跟我通話,則導致第二位配送員無法撥通我的電話,其實當我接到第一位配送員的電話,可以告訴配送員說我現在下樓,剩下的事情,等我們見面再說(上半部),然後就可以結束通話電話,到樓下後,在拿外賣,以及跟配送員說其他的事情(下半部)。

這樣,第一位配送員就不會佔用我手機太多時間,當第二位配送員正好過來時,會有很大機率撥通我的電話。

再舉一個計算機中的例子,常見的網絡卡接收網路包的例子。

網絡卡收到網路包後,通過 DMA 方式將接收到的資料寫入記憶體,接著會通過硬體中斷通知核心有新的資料到了,於是核心就會呼叫對應的中斷處理程式來處理該事件,這個事件的處理也是會分成上半部和下半部。

上部分要做的事情很少,會先禁止網絡卡中斷,避免頻繁硬中斷,而降低核心的工作效率。接著,核心會觸發一個軟中斷,把一些處理比較耗時且複雜的事情,交給「軟中斷處理程式」去做,也就是中斷的下半部,其主要是需要從記憶體中找到網路資料,再按照網路協議棧,對網路資料進行逐層解析和處理,最後把資料送給應用程式。

所以,中斷處理程式的上部分和下半部可以理解為:

  • 上半部直接處理硬體請求,也就是硬中斷,主要是負責耗時短的工作,特點是快速執行;
  • 下半部是由核心觸發,也就說軟中斷,主要是負責上半部未完成的工作,通常都是耗時比較長的事情,特點是延遲執行;

還有一個區別,硬中斷(上半部)是會打斷 CPU 正在執行的任務,然後立即執行中斷處理程式,而軟中斷(下半部)是以核心執行緒的方式執行,並且每一個 CPU 都對應一個軟中斷核心執行緒,名字通常為「ksoftirqd/CPU 編號」,比如 0 號 CPU 對應的軟中斷核心執行緒的名字是 ksoftirqd/0

不過,軟中斷不只是包括硬體裝置中斷處理程式的下半部,一些核心自定義事件也屬於軟中斷,比如核心排程等、RCU 鎖(核心裡常用的一種鎖)等。