I/O中斷原理




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操作。

20191214121307.png

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

有中斷

20191214121702.png

  • 當我們程序需要從硬盤讀取一個文件時,會先檢查內核緩存中是否有數據,若沒有數據,則執行實際I/O操作。在I/O操作執行時,我們的用戶線程將阻塞等待數據從硬盤寫到內存中。對於用戶來說線程是被阻塞的。
  • 在實際的I/O操作過程中,CPU向I/O模塊(DMA控制器)發送讀指令,然后就去調度其他線程。
  • 當I/O模塊(DMA控制器)I/O執行完成后,會產生中斷信號在通知CPU,CPU將線程加入到線程就緒隊列中並恢復線程上下文信息。
  • 線程處於就緒隊列,可以被操作系統調度從而繼續執行讀操作,此時會將數據從操作系統內核緩存讀取到用戶緩存中。

由此可知,有中斷還是沒有中斷對於用戶來說線程都是阻塞的,對於操作系統內核來說通過中斷方式主動通知CPU的方式減少了線程輪詢判斷,提高了線程執行效率。
當然,為了進一步提高線程利用率,此時我們可以通過異步操作API執行I/O操作。
比如.Net4.5的asyncawait關鍵字,當調用異步操作后,API內部保存了相關狀態機信息(回調信息),線程繼續執行其他操作,當操作系統內核讀取數據完成時,線程調用回調方法恢復到await的后續操作。整個過程中線程不會因為阻塞帶來導致性能損失。

中斷處理

當I/O設備完成一次I/O操作時,發生以下事件:

  • 開始I/O操作前,處理器將當前處理的相關信息如指令地址、必要的狀態信息等保存到棧中,使得中斷后可以恢復執行。
  • I/O操作完成后,設備給處理器發送一個中斷信號。
  • 處理器響應中斷信號。
  • 處理器對中斷信號進行判斷,若存在未響應的中斷,則給產生中斷信號的設備發送確認信號,確認信號使得設備取消它的中斷信號。
  • 處理器將控制前轉移給中斷程序中,中斷程序從棧中獲取之前保存的信息,使得能繼續執行I/O完成時的后續操作。
  • 處理器將中斷程序入口地址載入到程序計數器中,使得處理器能繼續執行下一個指令周期。

相關文獻

  1. 《操作系統-精髓與設計原理》
  2. 時鍾中斷是rt-thread的線程調度器的驅動力

20191127212134.png
微信掃一掃二維碼關注訂閱號傑哥技術分享
出處:https://www.cnblogs.com/Jack-Blog/p/12038716.html
作者:傑哥很忙
本文使用「CC BY 4.0」創作共享協議。歡迎轉載,請在明顯位置給出出處及鏈接。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM