1. 程式人生 > >I/O中斷原理

I/O中斷原理

目錄

  • I/O中斷原理
    • 前言
    • 什麼是中斷
    • 中斷型別
      • 硬體中斷
      • 軟體中斷
    • 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操作。

  • 當我們程式需要從硬碟讀取一個檔案時,會先檢查核心快取中是否有資料,若沒有資料,則執行實際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的asyncawait關鍵字,當呼叫非同步操作後,API內部儲存了相關狀態機資訊(回撥資訊),執行緒繼續執行其他操作,當作業系統核心讀取資料完成時,執行緒呼叫回撥方法恢復到await的後續操作。整個過程中執行緒不會因為阻塞帶來導致效能損失。

中斷處理

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

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

相關文獻

  1. 《作業系統-精髓與設計原理》
  2. 時鐘中斷是rt-thread的執行緒排程器的驅動力


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