I/O中斷原理
前言
在Windows內核原理-同步IO與異步IO和《高性能網絡通訊原理》兩篇文章中,都出現了中斷這兩個字。本篇文章會對中斷操作的原理進行說明。
什么是中斷
中斷指當出現需要時,CPU暫時停止當前程序的執行轉而執行處理新情況的程序和執行過程。即在程序運行過程中,系統出現了一個必須由CPU立即處理的情況,此時,CPU暫時中止程序的執行轉而處理這個新的情況的過程就叫做中斷。
我們知道CPU是按指令順序進行執行的,操作系統每過大約15ms會發生一次線程調度(Windows下),根據線程優先級先調度優先級高的線程。但是實際情況並沒有那么簡單,若我們接收到一個網絡請求,如果要等當前線程執行完或15ms線程調度之后才去處理網絡請求,網卡緩沖區很有可能會被占滿,此時就發生了丟包。
中斷類型
中斷分為硬件中斷和軟件中斷。
硬件中斷
硬件中斷即為硬件發出的中斷信號,如I/O中斷和硬件失效中斷。
- I/O中斷:由I/O控制器產生,用於發送信號通知操作完成等信號。
- 硬件失效中斷:如掉電或存儲器奇偶錯之類的故障。
軟件中斷
軟件中斷即為非硬件發出的中斷信號,如程序中斷和時鍾中斷。
- 程序中斷:一些指令產生的異常(如算數移除、除數為0等)。
- 時鍾中斷:由處理器內部的計時器產生,允許操作系統以一定規程執行函數。
我們提到了操作系統每過大約15ms會進行一次線程調度,就是利用時鍾中斷來實現的。
I/O中斷流程
本篇文章還是主要解釋前幾篇文章提到的I/O中斷進行解釋說明,因此僅以I/O中斷舉例,但是中斷的原理和流程都是相似的。
I/O中斷通過中斷處理器執行中斷操作。當外部設備的I/O模塊准備好時,它會發送給CPU一個中斷信號,CPU則會“立即”做出響應,暫停當前程序的處理去服務該I/O設備的程序。
也可能不是立即,比如同時存在多個中斷,則根據實際的中斷算法決定,是按中斷先后順序執行中斷操作,還是按中斷優先級執行。
I/O中斷時硬件中斷,需要硬件支持來接收中斷信號。
無中斷
為了更好的說明中斷帶來的性能提升,我們先描述一下沒有中斷時程序如何處理I/O操作。

- 當我們程序需要從硬盤讀取一個文件時,會先檢查內核緩存中是否有數據,若沒有數據,則執行實際I/O操作。在I/O操作執行時,我們的用戶線程將阻塞等待數據從硬盤寫到內存中。對於用戶來說線程是被阻塞的。
- 在實際的I/O操作過程中,若沒有中斷操作,CPU會不斷輪詢檢查I/O操作是否完成,若I/O操作沒有完成則繼續調度其他線程,過一會兒再來檢查。若操作完成,CPU將線程加入到線程就緒隊列中並恢復線程上下文信息。
- 線程處於就緒隊列,可以被操作系統調度從而繼續執行讀操作,此時會將數據從操作系統內核緩存讀取到用戶緩存中。
有中斷

- 當我們程序需要從硬盤讀取一個文件時,會先檢查內核緩存中是否有數據,若沒有數據,則執行實際I/O操作。在I/O操作執行時,我們的用戶線程將阻塞等待數據從硬盤寫到內存中。對於用戶來說線程是被阻塞的。
- 在實際的I/O操作過程中,CPU向I/O模塊(DMA控制器)發送讀指令,然后就去調度其他線程。
- 當I/O模塊(DMA控制器)I/O執行完成后,會產生中斷信號在通知CPU,CPU將線程加入到線程就緒隊列中並恢復線程上下文信息。
- 線程處於就緒隊列,可以被操作系統調度從而繼續執行讀操作,此時會將數據從操作系統內核緩存讀取到用戶緩存中。
由此可知,有中斷還是沒有中斷對於用戶來說線程都是阻塞的,對於操作系統內核來說通過中斷方式主動通知CPU的方式減少了線程輪詢判斷,提高了線程執行效率。
當然,為了進一步提高線程利用率,此時我們可以通過異步操作API執行I/O操作。
比如.Net4.5的async和await關鍵字,當調用異步操作后,API內部保存了相關狀態機信息(回調信息),線程繼續執行其他操作,當操作系統內核讀取數據完成時,線程調用回調方法恢復到await的后續操作。整個過程中線程不會因為阻塞帶來導致性能損失。
中斷處理
當I/O設備完成一次I/O操作時,發生以下事件:
- 開始I/O操作前,處理器將當前處理的相關信息如指令地址、必要的狀態信息等保存到棧中,使得中斷后可以恢復執行。
- I/O操作完成后,設備給處理器發送一個中斷信號。
- 處理器響應中斷信號。
- 處理器對中斷信號進行判斷,若存在未響應的中斷,則給產生中斷信號的設備發送確認信號,確認信號使得設備取消它的中斷信號。
- 處理器將控制前轉移給中斷程序中,中斷程序從棧中獲取之前保存的信息,使得能繼續執行I/O完成時的后續操作。
- 處理器將中斷程序入口地址載入到程序計數器中,使得處理器能繼續執行下一個指令周期。
相關文獻
- 《操作系統-精髓與設計原理》
- 時鍾中斷是rt-thread的線程調度器的驅動力
微信掃一掃二維碼關注訂閱號傑哥技術分享
出處:https://www.cnblogs.com/Jack-Blog/p/12038716.html
作者:傑哥很忙
本文使用「CC BY 4.0」創作共享協議。歡迎轉載,請在明顯位置給出出處及鏈接。

