在Windows內核原理-同步IO與異步IO和《高性能網絡通信原理》兩篇文章中,都出現了中斷這兩個字。本篇文章會對中斷操做的原理進行說明。算法
中斷指當出現須要時,CPU暫時中止當前程序的執行轉而執行處理新狀況的程序和執行過程。即在程序運行過程當中,系統出現了一個必須由CPU當即處理的狀況,此時,CPU暫時停止程序的執行轉而處理這個新的狀況的過程就叫作中斷。緩存
咱們知道CPU是按指令順序進行執行的,操做系統每過大約15ms會發生一次線程調度(Windows下),根據線程優先級先調度優先級高的線程。可是實際狀況並無那麼簡單,若咱們接收到一個網絡請求,若是要等當前線程執行完或15ms線程調度以後纔去處理網絡請求,網卡緩衝區頗有可能會被佔滿,此時就發生了丟包。微信
中斷分爲硬件中斷和軟件中斷。網絡
硬件中斷即爲硬件發出的中斷信號,如I/O中斷和硬件失效中斷。異步
軟件中斷即爲非硬件發出的中斷信號,如程序中斷和時鐘中斷。async
時鐘中斷:由處理器內部的計時器產生,容許操做系統以必定規程執行函數。函數
咱們提到了操做系統每過大約15ms會進行一次線程調度,就是利用時鐘中斷來實現的。性能
本篇文章仍是主要解釋前幾篇文章提到的I/O中斷進行解釋說明,所以僅以I/O中斷舉例,可是中斷的原理和流程都是類似的。操作系統
I/O中斷經過中斷處理器執行中斷操做。當外部設備的I/O模塊準備好時,它會發送給CPU一箇中斷信號,CPU則會「當即」作出響應,暫停當前程序的處理去服務該I/O設備的程序。
也可能不是當即,好比同時存在多箇中斷,則根據實際的中斷算法決定,是按中斷前後順序執行中斷操做,仍是按中斷優先級執行。
I/O中斷時硬件中斷,須要硬件支持來接收中斷信號。
爲了更好的說明中斷帶來的性能提高,咱們先描述一下沒有中斷時程序如何處理I/O操做。
由此可知,有中斷仍是沒有中斷對於用戶來講線程都是阻塞的,對於操做系統內核來講經過中斷方式主動通知CPU的方式減小了線程輪詢判斷,提升了線程執行效率。
固然,爲了進一步提升線程利用率,此時咱們能夠經過異步操做API執行I/O操做。
好比.Net4.5的async
和await
關鍵字,當調用異步操做後,API內部保存了相關狀態機信息(回調信息),線程繼續執行其餘操做,當操做系統內核讀取數據完成時,線程調用回調方法恢復到await
的後續操做。整個過程當中線程不會由於阻塞帶來致使性能損失。
當I/O設備完成一次I/O操做時,發生如下事件:
微信掃一掃二維碼關注訂閱號傑哥技術分享
出處:http://www.javashuo.com/article/p-mtesadfz-bx.html 做者:傑哥很忙 本文使用「CC BY 4.0」創做共享協議。歡迎轉載,請在明顯位置給出出處及連接。