簡略梳理IO模型

這是一篇對IO模式知識點的簡要筆記,後續會根據知識的積累與理解繼續做更新。

幾種常見的IO名稱

最早接觸的是BIO,在Java的網絡編程中,有一個ServerSocket,會調用accept()方法,監聽某個端口,直到有新的連接進來,代碼纔會繼續往後執行;再到後面是NIO,一說是New IO,又說是Non-blocking IO,到底怎麼叫感覺並不重要,重要的是它可以不阻塞代碼的執行,但是這裏有個很關鍵的點:不阻塞代碼的情況下,如何執行相應的處理邏輯(對這個問題會在後續的Reactor相關筆記中進行闡述)?

另外,目前還沒有接觸過AIO,待後續補充。

BIO

完整流程示意圖:

BIO示意圖

採用的開發模式爲:Thread-Per-Connection,顧名思義,也就是每來一個請求,都會開一個線程,在子線程中進行邏輯處理。

阻塞同步方式

jdk1.4之前

NIO

完整流程示意圖:

NIO示意圖

採用的開發模式爲:Reactor,簡單說就是:各個業務先說清楚自己關心什麼事件,然後當這個事件發生的時候,會執行該業務的邏輯。

非阻塞同步方式

Since jdk1.4

AIO

非阻塞異步方式

阻塞與非阻塞

阻塞和非阻塞指的是不能立刻得到結果之前,會不會阻塞當前線程

  1. 阻塞:當前線程會被掛起,直到結果返回;
  2. 非阻塞:指在不能立刻得到結果之前,該函數不會阻塞當前線程,而會立刻返回(會導致線程切換的增加)。

線程是否需要阻塞以等待數據準備好,同理寫操作也會直接返回。

同步與異步

描述的是用戶線程內核的交互方式,與消息的通知機制有關:

  1. 同步:當一個同步調用發出後,需要等待返回消息(用戶線程不斷去詢問),才能繼續進行;
  2. 異步:當一個異步調用發出後,調用者不能立即得到返回消息,完成後會通過狀態、通知和回調來通知調用者。

簡單來說就是:

  1. 同步:同步等待消息通知,消息返回才能繼續進行;
  2. 異步:異步等待消息通知,完成後被調系統通過回調等來通過調用者。

再簡而言之:數據準備好了誰來讀取。

同步:數據傳好了之後應用程序自己去讀

異步:OS讀好然後通過回調通知應用程序;

參考:
極客時間-Netty源碼剖析與實戰
Java 5種IO模型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章