天天看點

12、 什麼是軟中斷?

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

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

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

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

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

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

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

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

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

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

繼續閱讀