為了解決中斷處理程式執行過長和中斷丟失的問題,linux 將中斷處理過程分成了兩個階段,也就是上半部和下半部:
舉個最常見的網絡卡接收資料報的例子,讓你更好地理解。
網絡卡接收到資料報後,會通過硬體中斷的方式,通知核心有新的資料到了。這時,核心就應該呼叫中斷處理程式來響應它。你可以自己先想一下,這種情況下的上半部和下半部分別負責什麼工作呢?
對上半部來說,既然是快速處理,其實就是要把網絡卡的資料讀到記憶體中,然後更新一下硬體暫存器的狀態(表示資料已經讀好了),最後再傳送乙個軟中斷訊號,通知下半部做進一步的處理。
而下半部被軟中斷訊號喚醒後,需要從記憶體中找到網路資料,再按照網路協議棧,對資料進行逐層解析和處理,直到把它送給應用程式。
所以,這兩個階段你也可以這樣理解:
實際上,上半部會打斷 cpu 正在執行的任務,然後立即執行中斷處理程式。而下半部以核心執行緒的方式執行,並且每個 cpu 都對應乙個軟中斷核心執行緒,名字為 「ksoftirqd/cpu 編號」,比如說, 0 號 cpu 對應的軟中斷核心執行緒的名字就是 ksoftirqd/0。
不過要注意的是,軟中斷不只包括了剛剛所講的硬體裝置中斷處理程式的下半部,一些核心自定義的事件也屬於軟中斷,比如核心排程和 rcu 鎖(read-copy update 的縮寫,rcu 是 linux 核心中最常用的鎖之一)等。
那要怎麼知道你的系統裡有哪些軟中斷呢?
檢視軟中斷和核心執行緒
proc 檔案系統,它是一種核心空間和使用者空間進行通訊的機制,可以用來檢視核心的資料結構,或者用來動態修改核心的配置。其中:
執行下面的命令,檢視 /proc/softirqs 檔案的內容,你就可以看到各種型別軟中斷在不同 cpu 上的累積執行次數:
$ cat /proc/softirqs
cpu0 cpu1
hi: 0 0
timer: 811613 1972736
net_tx: 49 7
net_rx: 1136736 1506885
block: 0 0
irq_poll: 0 0
tasklet: 304787 3691
sched: 689718 1897539
hrtimer: 0 0
rcu: 1330771 1354737
在檢視 /proc/softirqs 檔案內容時,你要特別注意以下這兩點。
第一,要注意軟中斷的型別,也就是這個介面中第一列的內容。從第一列你可以看到,軟中斷包括了 10 個類別,分別對應不同的工作型別。比如 net_rx 表示網路接收中斷,而 net_tx 表示網路傳送中斷。
第二,要注意同一種軟中斷在不同 cpu 上的分布情況,也就是同一行的內容。正常情況下,同一種中斷在不同 cpu 上的累積次數應該差不多。比如這個介面中,net_rx 在 cpu0 和 cpu1 上的中斷次數基本是同乙個數量級,相差不大。
不過你可能發現,tasklet 在不同 cpu 上的分布並不均勻。tasklet 是最常用的軟中斷實現機制,每個 tasklet 只執行一次就會結束 ,並且只在呼叫它的函式所在的 cpu 上執行。
因此,使用 tasklet 特別簡便,當然也會存在一些問題,比如說由於只在乙個 cpu 上執行導致的排程不均衡,再比如因為不能在多個 cpu 上並行執行帶來了效能限制。
另外,剛剛提到過,軟中斷實際上是以核心執行緒的方式執行的,每個 cpu 都對應乙個軟中斷核心執行緒,這個軟中斷核心執行緒就叫做 ksoftirqd/cpu 編號。那要怎麼檢視這些執行緒的執行狀況呢?
其實用 ps 命令就可以做到,比如執行下面的指令:
$ ps aux |
grep softirq
root 7 0.0 0.0 0 0 ? s oct10 0:01 [ksoftirqd/0]
root 16 0.0 0.0 0 0 ? s oct10 0:01 [ksoftirqd/1]
注意,這些執行緒的名字外面都有中括號,這說明ps 無法獲取它們的命令列引數(cmline)。一般來說,ps 的輸出中,名字括在中括號裡的,一般都是核心執行緒。 怎麼理解Linux軟中斷?
如果覺得該文章不錯,可以嘗試購買該課程學習。傳送門 中斷是系統用來響應硬體裝置請求的一種機制,它會打斷程序的正常排程和執行,然後呼叫核心中的中斷處理程式來響應裝置的請求。舉個生活中的例子 比如說你訂了乙份外賣,但是不確定外賣什麼時候送到,也沒有別的方法了解外賣的進度,但是,配送員送外賣是不等人的,到...
09 基礎篇 怎麼理解Linux軟中斷?
程序的不可中斷狀態是系統的一種保護機制,可以保證硬體的互動過程不被意外打斷 所以,短時間的不可中斷狀態是很正常的 當程序長時間都處於不可中斷狀態時,就得當心了 可以使用dstat pidstat等工具,確認是不是磁碟i o的問題,進而排查相關的程序和磁碟裝置 除了iowait,軟中斷 softirq...
Linux怎麼取消軟鏈結
linux下取消軟連線,做個案例來說明 1.先建立乙個軟連線 1 2 3 4 5 6 7 8 9 10 11 12 13 root rekfan.comtest ls il 總計 0 1491138 rw r r 1 root root 48 07 14 14 17 file1 1491139 rw...