怎麼理解Linux軟中斷?

2022-07-01 21:45:10 字數 1869 閱讀 6305

如果覺得該文章不錯,可以嘗試購買該課程學習。傳送門

中斷是系統用來響應硬體裝置請求的一種機制,它會打斷程序的正常排程和執行,然後呼叫核心中的中斷處理程式來響應裝置的請求。

"舉個生活中的例子"

比如說你訂了乙份外賣,但是不確定外賣什麼時候送到,也沒有別的方法了解外賣的進度,但是,配送員送外賣是不等人的,到了你這兒沒人取的話,就直接走人了。所以你只能苦苦等著,時不時去門口看看外賣送到沒,而不能幹其他事情。

不過呢,如果在訂外賣的時候,你就跟配送員約定好,讓他送到後給你打個**,那你就不用苦苦等待了,就可以去忙別的事情,直到**一響,接**、取外賣就可以了。

這裡的「打**」,其實就是乙個中斷。

沒接到**的時候,你可以做其他的事情;只有接到了**(也就是發生中斷),你才要進行另乙個動作:取外賣。

這個例子你就可以發現,中斷其實是一種非同步的事件處理機制,可以提高系統的併發處理能力。

由於中斷處理程式會打斷其他程序的執行,所以,為了減少對正常程序執行排程的影響,中斷處理程式就需要盡可能快地執行。

如果中斷本身要做的事情不多,那麼處理起來也不會有太大問題;但如果中斷要處理的事情很多,中斷服務程式就有可能要執行很長時間。

特別是,中斷處理程式在響應中斷時,還會臨時關閉中斷。這就會導致上一次中斷處理完成之前,其他中斷都不能響應,也就是說中斷有可能會丟失。

那麼還是以取外賣為例:假如你訂了 2 份外賣

乙份主食和乙份飲料,並且是由 2 個不同的配送員來配送。這次你不用時時等待著,兩份外賣都約定了**取外賣的方式。但是,問題又來了。

當第乙份外賣送到時,配送員給你打了個很長的**,商量發票的處理方式。與此同時,第二個配送員也到了,也想給你打**。

但是很明顯,因為**佔線(也就是關閉了中斷響應),第二個配送員的**是打不通的。所以,第二個配送員很可能試幾次後就走掉了(也就是丟失了一次中斷)。

如果你弄清楚了「取外賣」的模式,那對系統的中斷機制就很容易理解了。

事實上,為了解決中斷處理程式執行過長和中斷丟失的問題,linux 將中斷處理過程分成了兩個階段,也就是上半部和下半部:

上半部用來快速處理中斷,它在中斷禁止模式下執行,主要處理跟硬體緊密相關工作。

下半部用來延遲處理上半部未完成的工作,通常以核心執行緒的方式執行。

比如說前面取外賣的例子,上半部就是你接聽**,告訴配送員你已經知道了,其他事兒見面再說,然後**就可以結束通話了;下半部才是取外賣的動作,以及見面後商量發票處理的動作。

這樣,第乙個配送員不會占用你太多時間,當第二個配送員過來時,照樣能正常打通你的**。

除了取外賣,我再舉個最常見的網絡卡接收資料報的例子,讓你更好地理解。

網絡卡接收到資料報後,會通過硬體中斷的方式,通知核心有新的資料到了。這時,核心就應該呼叫中斷處理程式來響應它。

對上半部來說,既然是快速處理,其實就是要把網絡卡的資料讀到記憶體中,然後更新一下硬體暫存器的狀態(表示資料已經讀好了),最後再傳送乙個軟中斷訊號,通知下半部做進一步的處理。

而下半部被軟中斷訊號喚醒後,需要從記憶體中找到網路資料,再按照網路協議棧,對資料進行逐層解析和處理,直到把它送給應用程式。

所以,這兩個階段你也可以這樣理解:

上半部直接處理硬體請求,也就是我們常說的硬中斷,特點是快速執行;

而下半部則是由核心觸發,也就是我們常說的軟中斷,特點是延遲執行;

f: 經常聽同事說大量的網路小包會導致效能問題,為什麼呢?

q:因為大量的網路小包會導致頻繁的硬中斷和軟中斷?所以大量網路小包傳輸很慢,但如果將網路包一次傳遞,是不是會快很多呢?

Linux 怎麼理解Linux軟中斷?

為了解決中斷處理程式執行過長和中斷丟失的問題,linux 將中斷處理過程分成了兩個階段,也就是上半部和下半部 舉個最常見的網絡卡接收資料報的例子,讓你更好地理解。網絡卡接收到資料報後,會通過硬體中斷的方式,通知核心有新的資料到了。這時,核心就應該呼叫中斷處理程式來響應它。你可以自己先想一下,這種情況...

09 基礎篇 怎麼理解Linux軟中斷?

程序的不可中斷狀態是系統的一種保護機制,可以保證硬體的互動過程不被意外打斷 所以,短時間的不可中斷狀態是很正常的 當程序長時間都處於不可中斷狀態時,就得當心了 可以使用dstat pidstat等工具,確認是不是磁碟i o的問題,進而排查相關的程序和磁碟裝置 除了iowait,軟中斷 softirq...

Linux軟中斷通訊

程序對訊號的響應 1 忽略訊號 不採取任何操作 有兩個訊號不能被忽略 sigkill和sigstop。如果忽略,系統管理無法殺死 暫停程序,無法對系統進行管理。2 捕獲並處理訊號 3 執行預設操作,通常是終止程序 訊號的預設操作 通過 man 7 signal 檢視 系統呼叫或庫函式 1 lockf...