I/O中斷原理



I/O中斷原理

前言

Windows內核原理-同步IO與異步IO《高性能網絡通信原理》兩篇文章中,都出現了中斷這兩個字。本篇文章會對中斷操做的原理進行說明。算法

什麼是中斷

中斷指當出現須要時,CPU暫時中止當前程序的執行轉而執行處理新狀況的程序和執行過程。即在程序運行過程當中,系統出現了一個必須由CPU當即處理的狀況,此時,CPU暫時停止程序的執行轉而處理這個新的狀況的過程就叫作中斷。緩存

咱們知道CPU是按指令順序進行執行的,操做系統每過大約15ms會發生一次線程調度(Windows下),根據線程優先級先調度優先級高的線程。可是實際狀況並無那麼簡單,若咱們接收到一個網絡請求,若是要等當前線程執行完或15ms線程調度以後纔去處理網絡請求,網卡緩衝區頗有可能會被佔滿,此時就發生了丟包。微信

中斷類型

中斷分爲硬件中斷和軟件中斷。網絡

硬件中斷

硬件中斷即爲硬件發出的中斷信號,如I/O中斷和硬件失效中斷。異步

  • I/O中斷:由I/O控制器產生,用於發送信號通知操做完成等信號。
  • 硬件失效中斷:如掉電或存儲器奇偶錯之類的故障。

軟件中斷

軟件中斷即爲非硬件發出的中斷信號,如程序中斷和時鐘中斷。async

  • 程序中斷:一些指令產生的異常(如算數移除、除數爲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
微信掃一掃二維碼關注訂閱號傑哥技術分享
出處:http://www.javashuo.com/article/p-mtesadfz-bx.html 做者:傑哥很忙 本文使用「CC BY 4.0」創做共享協議。歡迎轉載,請在明顯位置給出出處及連接。

相關文章
相關標籤/搜索