1.什么是軟中斷
中斷處理程序在響應中斷時,可能還會「臨時關閉中斷」,這意味著,如果當前中斷處理程序沒有執行完之前,系統中其他的中斷請求都無法被響應,也就說中斷有可能會丟失,所以中斷處理程序要短且快。這樣才能減少對正常進程運行調度地影響,而且中斷處理程序可能會暫時關閉中斷,這時如果中斷處理程序執行時間過長,可能在還未執行完中斷處理程序前,會丟失當前其他設備的中斷請求。
為了解決中斷處理程序執行過長和中斷丟失的問題,將中斷過程分成了兩個階段,分別是上半部和下半部分。上半部分用來快速處理中斷,一般會暫時關閉中斷請求,主要負責處理跟硬件緊密相關或者時間敏感的事情。下半部用來延遲處理上半部未完成的工作,一般以「內核線程」的方式運行。
2.實際使用
網卡收到網絡包后,會通過硬件中斷通知內核有新的數據到了,于是內核就會調用對應的中斷處理程序來響應該事件,這個事件的處理也是會分成上半部和下半部。上部分要做到快速處理,所以只要把網卡的數據讀到內存中,然后更新一下硬件寄存器的狀態,比如把狀態更新為表示數據已經讀到內存中的狀態值。接著,內核會觸發一個軟中斷,把一些處理比較耗時且復雜的事情,交給軟中斷處理程序去做,也就是中斷的下半部,其主要是需要從內存中找到網絡數據,再按照網絡協議棧,對網絡數據進行逐層解析和處理,最后把數據送給應用程序。
上半部分直接處理硬件請求,作為硬中斷。下半部分由內核觸發,作為軟中斷。軟中斷通常都延遲執行耗時比較長的事情,不會打斷CPU正在執行的任務。
3. 系統里的軟中斷類型
| NET_RX | 網絡接收中斷 |
| NET_TX | 網絡發送中斷 |
| TIMER | 定時中斷 |
| RCU | RCU鎖中斷 |
| SCHED | 內核調度中斷 |