在學習apue時學習訊號程式設計,很多地方不是理解,便查閱了網路上的相關資料,最常見的一句話就是「訊號是中斷機制的一種模擬」,既然提到了中斷,那就首先了解了一下中斷的具體分類以及實現,最後再找出中斷和訊號的區別。l 中 斷(也稱硬體中斷)
定義:中斷是由其他硬體裝置依照cpu
時鐘週期訊號隨機產生的。
分類: 可遮蔽中斷
非可遮蔽中斷
間隔定時器和i/o
l 異 常(也稱軟體中斷)
定義:當指令執行時由
cpu控制單元
產生的,異常也稱為「非同步中斷」是因為只有在 一條指令終止執行後cpu
才會發出中斷。
分類: 處理器探測到的異常
² 故障
² 陷阱
² 異常終止
程式設計異常(
也稱軟中斷)²
int指令
程式的錯誤產生的
核心必須處理的異常(
例如:缺頁和核心服務的請求
-int)
l 當發生異常時,cpu
控制單元產生乙個硬體出錯碼。
l cpu根據該中斷嗎找到中斷向量表內的對應向量,根據該向量轉到中斷處理程式。 l
中斷處理程式處理完之後向當前程序傳送乙個sig***
訊號。l
若程序定義了相應的訊號處理程式則轉移到相應的程式執行,若沒有,則執行核心定義的操作。
l 裝置產生中斷
l pic(可程式設計中斷控制器)會產生乙個對應的中斷向量
l 和中斷向量表中的每乙個中斷向量進行比較,轉到對應的中斷處理程式
l 中斷處理程式進行儲存現場,做相關處理,恢復現場
l 核心排程,返回使用者程序
l 硬體中斷的分類
² 緊急的 —— 這類中斷必須立即執行
² 非緊急的 —— 也必須立即執行
² 非緊急可延遲的 —— 上半部立即執行,下半部延遲執行
硬體中斷任務(處理程式)是乙個快速、非同步、簡單地對硬體做出迅速響應並在最短時間內完成必要操作的中斷處理程式。硬中斷處理程式可以搶占核心任務並且執 行時還會遮蔽同級中斷或其它中斷,因此中斷處理必須要快、不能阻塞。這樣一來對於一些要求處理過程比較複雜的任務就不合適在中斷任務中一次處理。比如,網絡卡接收資料的過程中,
首先網絡卡傳送中斷訊號告訴
cpu來取資料,然後系統從網絡卡中讀取資料存入系統緩衝區中,再下來解析資料然後送入應用層。這些如果都讓中斷處理程式來處理顯然過程太長,造成新來的中斷丟失。因此
linux
開發人員將這種任務分割為兩個部分,乙個叫上底,即中斷處理程式,短平快地處理與硬 件相關的操作(如從網絡卡讀資料到系統快取);而把對時間要求相對寬鬆的任務(如解析資料的工作)放在另乙個部分執行,這個部分就是我們這裡要講的下半底。
下半底是一種推後執行任務,它將某些不那麼緊迫的任務推遲到系統更方便的時刻執行。因為並不是非常緊急,通常還是比較耗時的,
因此由系統自行安排執行時機,不在中斷服務上下文中執行
。核心中實現 下半底的手段經過不斷演化,目前已經從最原始的bh(bottom thalf)
演生出bh
、任務佇列(task queues)、
軟中斷(softirq)、
tasklet
、工作佇列(work queues
)(2.6
核心中新出現的)。
其中的軟中斷和異常中提到的軟中斷的區別:
主要是用來處理非緊急可延遲的硬體中斷
linux系統定定義的,不是使用者定義,並且個數有限
關於軟中斷和硬中斷的其它解析:
軟中斷一般是指由指令int
引起的「偽」
中斷動作——給
cpu製造乙個中斷的假象;而硬中斷則是實實在在由
8259
的連線觸發的中斷。因此,嚴格的 講,
int與
irq毫無關係,但二者均與中斷向量有關係。
int引起的中斷,
cpu是從指令中取得中斷向量號;而
irq引起的中斷,
cpu必須從資料線上取回中斷號,接下來
cpu在軟中斷和硬中斷之間的區別是什麼?
①硬中斷是由外部事件引起的因此具有隨機性和突發性;軟中斷是執行中斷指令產生的,無面外部施加中斷請求信 號,因此中斷的發生不是隨機的而是由程式安排好的。
②硬中斷的中斷響應週期,
cpu需要發中斷回合訊號(
nmi不需要),軟中斷的中斷響應周 期,
cpu不需發中斷回合訊號。
③硬中斷的中斷號是由中斷控制器提供的(
nmi硬中斷中斷號系統指定為
02h);軟中斷的中斷號由指令直接給出, 無需使用中斷控制器。
④硬中斷是可遮蔽的(
nmi硬中斷不可遮蔽),軟中斷不可遮蔽。
l 訊號本質
訊號是非同步的程序間通訊機制
,是在軟體層次上對中斷機制的一種模擬,在原理上,乙個程序收到乙個訊號與處理器收到乙個中斷請求可以說是一樣的。訊號是非同步的,乙個程序不必通過任何操作來等待訊號的到達,事實上,程序也不知 道訊號到底什麼時候到達。
訊號是程序間通訊機制中
唯一的非同步通訊機制,
可以看作是非同步通知,通知接收訊號的程序有哪些事情發生了。核心也可以因為內部事件而給程序傳送訊號,通知程序發生了某個事件。注意,訊號只是用來通知某程序發生了什麼事件,並不給 該程序傳遞任何資料。
l 產生訊號的條件主要有:
1. 使用者在終端 按下某些鍵時,終端驅動程式會傳送訊號給前台程序,例如ctrl-c
產生sigint
信 號,
ctrl-/
產生sigquit
訊號,ctrl-z
產生sigtstp
訊號。2.
硬體異常產生訊號,這些條件由硬體檢測到並通知核心,然後核心向當前程序傳送適當的訊號。例如當前程序執行了 除以0
的指令,
cpu的運算單元會產生異常,核心將這個異常解釋為
sigfpe
訊號傳送給進 程。再比如當前程序訪問了非法記憶體位址,,
mmu會產生異常,核心將這個異常解釋為
sigsegv
信 號傳送給程序。
3. 乙個程序呼叫kill(2)
函式可以傳送信 號給另乙個程序。
4. 可以用kill(1)
命令傳送訊號給某個 程序,
kill(1)
命令也是呼叫
kill(2)
函 數實現的,如果不明確指定訊號則傳送
sigterm
訊號,該訊號的預設處理動作是終止程序。
5. 當 核心檢測到某種軟體條件發生時也可以通過訊號通知程序,例如鬧鐘超時產生sigalrm
信 號,向讀端已關閉的管道寫資料時產生
sigpipe
訊號。l
程序對訊號的處理:
1. 忽略此訊號。
2. 執行該訊號的預設處 理動作。
3. 提供乙個訊號處理函式,要求核心在處理該訊號時切換到使用者態執行這個處理函 數,這種方式稱為捕捉(catch
)乙個訊號。
l 訊號與中斷的相似點:
(1)採用了相同的非同步通訊方式;
(2)當檢測出有訊號或中斷請求時,都暫停正在執行的程式而轉去執行相應的處理程式; (3
)都在處理完畢後返回到原來的斷點;
(4)對訊號或中斷都可進行遮蔽。
l 訊號與中斷的區別:
(1)中斷有優先順序,而訊號沒有優先順序,所有的訊號都是平等的;
(2)訊號處理程式是在使用者態下執行的,而中斷處理程式是在核心態下執行;
(3)中斷響應是及時的,而訊號響應通常都有較大的時間延遲。
l 訊號機制具有以下三方面的功能:
(1)傳送訊號。傳送訊號的程式用系統呼叫
kill( )
實現;(2
)預置對訊號的處理方式。接收訊號的程式用
signal( )
來實現對處理方式的預置;
(3)收受訊號的程序按事先的規定完成對相應事件的處理。
l 訊號捕獲過程
本圖出自ulk
注:從上圖可以看出,訊號的處理時機是在當前程序由於系統呼叫、中斷或者異常而進 入系統空間以後,從系統空間返回到使用者空間前夕(這樣做主要是出於效率的考慮,和 程序的呼叫時機一致,
從系統呼叫返回意味著要離開核心態而返回到使用者態,而狀態的 轉換要花費一定的時間,因此,在返回到使用者態前,系統把在核心態該處理的事全部做 完)。
另外提供兩個關於linux中斷機制和訊號機制的學習文章
關於軟中斷:
關於訊號:
訊號與中斷
訊號是系統為了響應某些狀況而產生的事件,程序收到訊號後應該採取相應的動作。用來通知程序發生了非同步事件。訊號與中斷的相似點 1 採用了相同的非同步通訊方式 2 當檢測出有訊號或中斷請求時,都暫停正在執行的程式而轉去執行相應的處理程式 3 都在處理完畢後返回到原來的斷點 4 對訊號或中斷都可進行遮蔽 ...
Linux中斷機制
中斷 interrupt 被定義為乙個事件,該事件改變處理器執行的指令順序,這樣的事件與cpu晶元內外部硬體電路產生的電訊號相對應。中斷通常分為同步 synchronous 中斷和非同步 asynchronous 中斷。同步中斷指的是當指令執行時由cpu控制單元產生的,之所以稱為同步,是因為只有在一...
Linux程式設計複習 3 訊號與中斷
訊號是響應某些狀況而產生的事件,程序在接收到訊號時會採取相應的行動。某些狀況就是指某些條件錯誤,如記憶體段衝突 浮點處理器錯誤或者非法指令等。訊號是在軟體層次上對中斷的一種模擬,所以訊號也稱為是軟中斷 訊號與中斷的相似點 1,都採用相同的額非同步通訊方式 2,當檢測出有訊號或中斷請求時,都暫停證在執...