概念太多了,信號,軟中斷,中斷等等。試着作總結。html
下面這個裏面主要講了硬件中斷:編程
http://www.cnblogs.com/charlesblc/p/6261741.html緩存
下面這個裏面主要講了軟中斷,硬中斷:異步
http://www.cnblogs.com/charlesblc/p/6263208.html 函數
參考 http://blog.csdn.net/dodo_check/article/details/8806961spa
l 中 斷(也稱硬件中斷).net
定義:中斷是由其餘硬件設備依照CPU時鐘週期信號隨機產生的。code
分類: 可屏蔽中斷htm
非可屏蔽中斷blog
來源:間隔定時器和I/O
l 異 常(也稱軟件中斷)
定義:當指令執行時由CPU控制單元產生的。
分類: 處理器探測到的異常
² 故障
² 陷阱
² 異常終止
編程異常(也稱軟中斷)
² int指令
來源: 程序的錯誤產生的
內核必須處理的異常(例如:缺頁和內核服務的請求-int)
l 當發生異常時,CPU控制單元產生一個硬件出錯碼。
l CPU根據該中斷嗎找到中斷向量表內的對應向量,根據該向量轉到中斷處理程序。
l 中斷處理程序處理完以後向當前進程發送一個SIG***信號。
l 若進程定義了相應的信號處理程序則轉移到相應的程序執行,若沒有,則執行內核定義的操做。
l 設備產生中斷
l PIC(可編程中斷控制器)會產生一個對應的中斷向量
l 和中斷向量表中的每個中斷向量進行比較,轉到對應的中斷處理程序
l 中斷處理程序進行保存現場,作相關處理,恢復現場
l 內核調度,返回用戶進程
l 硬件中斷的分類
² 緊急的 —— 這類中斷必須當即執行
² 非緊急的 —— 也必須當即執行
² 非緊急可延遲的 —— 上半部當即執行,下半部延遲執行
硬件中斷任務(處理程序)是一個快速、異步、簡單地對硬件作出迅速響應並在最短期內完成必要操做的中斷處理程序。硬中斷處理程序能夠搶佔內核任務而且執 行時還會屏蔽同級中斷或其它中斷,所以中斷處理必須要快、不能阻塞。這樣一來對於一些要求處理過程比較複雜的任務就不合適在中斷任務中一次處理。好比,網卡接收數據的過程當中,首先網卡發送中斷信號告訴CPU來取數據,而後系統從網卡中讀取數據存入系統緩衝區中,再下來解析數據而後送入應用層。這些若是都讓中斷處理程序來處理顯然過程太長,形成新來的中斷丟失。所以Linux開發人員將這種任務分割爲兩個部分,一個叫上底,即中斷處理程序,短平快地處理與硬 件相關的操做(如從網卡讀數據到系統緩存);而把對時間要求相對寬鬆的任務(如解析數據的工做)放在另外一個部分執行,這個部分就是咱們這裏要講的下半底。
下半底是一種推後執行任務,它將某些不那麼緊迫的任務推遲到系統更方便的時刻運行。由於並非很是緊急,一般仍是比較耗時的,所以由系統自行安排運行時機,不在中斷服務上下文中執行。內核中實現 下半底的手段通過不斷演化,目前已經從最原始的BH(bottom half)演生出BH、任務隊列(Task queues)、軟中斷(Softirq)、Tasklet、工做隊列(Work queues)(2.6內核中新出現的)。
其中的軟中斷和異常中提到的軟中斷不同的(後者特指對硬中斷的模擬):
前者主要是用來處理非緊急可延遲的硬件中斷,是Linux系統定定義的,不是用戶定義,而且個數有限
關於軟中斷和硬中斷的其它解析(上面提到的int指令模擬中斷):
軟中斷通常是指由指令int引發的「僞」中斷動做——給CPU製造一箇中斷的假象;而硬中斷則是實實在在由8259的連線觸發的中斷。所以,嚴格的 講,int與IRQ毫無關係,但兩者均與中斷向量有關係。int引發的中斷,CPU是從指令中取得中斷向量號;而IRQ引發的中斷,CPU必須從數據線上取回中斷號,接下來CPU的工做就同樣了:保護現場、根據中斷號獲得中斷處理程序地址、執行中斷處理、恢復現場繼續執行被中斷的指令。
在軟中斷(模擬中斷)和硬中斷之間的區別是什麼?
①硬中斷是由外部事件引發的所以具備隨機性和突發性;軟中斷是執行中斷指令產生的,無面外部施加中斷請求信 號,所以中斷的發生不是隨機的而是由程序安排好的。
②硬中斷的中斷響應週期,CPU須要發中斷回合信號(NMI不須要),軟中斷的中斷響應周 期,CPU不需發中斷回合信號。
③硬中斷的中斷號是由中斷控制器提供的(NMI硬中斷中斷號系統指定爲02H);軟中斷的中斷號由指令直接給出, 無需使用中斷控制器。
④硬中斷是可屏蔽的(NMI硬中斷不可屏蔽),軟中斷不可屏蔽。
先接上面這篇參考文章的內容:
信號是異步的進程間通信機制,是在軟件層次上對中斷機制的一種模擬
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信號。
另,參考 http://www.cnblogs.com/lcw/p/3235994.html
(1)採用了相同的異步通訊方式;
(2)當檢測出有信號或中斷請求時,都暫停正在執行的程序而轉去執行相應的處理程序;
(3)都在處理完畢後返回到原來的斷點;
(4)對信號或中斷均可進行屏蔽。
(1)中斷有優先級,而信號沒有優先級,全部的信號都是平等的;
(2)信號處理程序是在用戶態下運行的,而中斷處理程序是在覈心態下運行;
(3)中斷響應是及時的,而信號響應一般都有較大的時間延遲。
(1)發送信號。發送信號的程序用系統調用kill( )實現;
(2)預置對信號的處理方式。接收信號的程序用signal( )來實現對處理方式的預置;
(3)收受信號的進程按事先的規定完成對相應事件的處理。
當一個進程要進入或退出一個低優先級睡眠狀態時,或一個進程即將從核心態返回用戶態時,核心都要檢查該進程是否已收到軟中斷。當進程處於核心態時,即便收到軟中斷也不予理睬;只有當它返回到用戶態後,才處理軟中斷信號。對軟中斷信號的處理分三種狀況進行:
(1)若是進程收到的軟中斷是一個已決定要忽略的信號(function=1),進程不作任何處理便當即返回;
(2)進程收到軟中斷後便退出(function=0);
(3)執行用戶設置的軟中斷處理程序。
http://blog.csdn.net/c453787298/article/details/18004261
中斷:
中斷更傾向於硬件,外部設備狀態變化時發送給cup的一個信號,可是cpu如何捕捉這樣的一個信號呢,原來cpu的控制單元會檢查在執行前一條指令的過程當中是否有中斷或異常發生。當捕捉到這樣一個信號後,便開始當即執行do_irq()函數,執行相應的中斷處理程序(上半部),從cpu開始處理中斷至此,cpu對於其餘的中斷都是不處理的,上半部主要負責一些要緊可是不耗時的操做,後來的操做便由下半部來處理。對於上半部如何與下半部聯繫起來,即是用接下來要說的軟中斷了。
軟中斷:
軟中斷是內核的一種機制,模擬硬中斷(即上面所說的中斷)的實現,既然是對中斷的模擬,對於某個軟中斷向量便會有對應的軟中斷處理函數,對於多核cpu(SMP),存在這樣的規則,哪一個cpu觸發的軟中斷,便由哪一個cpu來執行相應的中斷程序,中斷處理程序(包括上半部和下半部)沒有本身的堆棧,執行的時候都是使用的當前用戶進程的內核棧,若當前沒有用戶進程,便使用idle進程的內核棧。軟中斷處理程序的執行在某一個cpu(多核中的一個)上應是線性的,只有上一個軟中斷處理完成以後才能執行下一個軟中斷處理程序。
信號:
信號應該就是進程對內核軟中斷的一種模擬了,主要用於進程之間的信息的傳遞,觸發的相應的處理函數在進程的用戶空間裏執行。