這是一篇對IO模式知識點的簡要筆記,後續會根據知識的積累與理解繼續做更新。
幾種常見的IO名稱
最早接觸的是BIO,在Java的網絡編程中,有一個ServerSocket,會調用accept()方法,監聽某個端口,直到有新的連接進來,代碼纔會繼續往後執行;再到後面是NIO,一說是New IO,又說是Non-blocking IO,到底怎麼叫感覺並不重要,重要的是它可以不阻塞代碼的執行,但是這裏有個很關鍵的點:不阻塞代碼的情況下,如何執行相應的處理邏輯(對這個問題會在後續的Reactor相關筆記中進行闡述)?
另外,目前還沒有接觸過AIO,待後續補充。
BIO
完整流程示意圖:
採用的開發模式爲:Thread-Per-Connection,顧名思義,也就是每來一個請求,都會開一個線程,在子線程中進行邏輯處理。
阻塞同步方式
jdk1.4之前
NIO
完整流程示意圖:
採用的開發模式爲:Reactor,簡單說就是:各個業務先說清楚自己關心什麼事件,然後當這個事件發生的時候,會執行該業務的邏輯。
非阻塞同步方式
Since jdk1.4
AIO
非阻塞異步方式
阻塞與非阻塞
阻塞和非阻塞指的是不能立刻得到結果之前,會不會阻塞當前線程。
- 阻塞:當前線程會被掛起,直到結果返回;
- 非阻塞:指在不能立刻得到結果之前,該函數不會阻塞當前線程,而會立刻返回(會導致線程切換的增加)。
線程是否需要阻塞以等待數據準備好,同理寫操作也會直接返回。
同步與異步
描述的是用戶線程與內核的交互方式,與消息的通知機制有關:
- 同步:當一個同步調用發出後,需要等待返回消息(用戶線程不斷去詢問),才能繼續進行;
- 異步:當一個異步調用發出後,調用者不能立即得到返回消息,完成後會通過狀態、通知和回調來通知調用者。
簡單來說就是:
- 同步:同步等待消息通知,消息返回才能繼續進行;
- 異步:異步等待消息通知,完成後被調系統通過回調等來通過調用者。
再簡而言之:數據準備好了誰來讀取。
同步:數據傳好了之後應用程序自己去讀;
異步:OS讀好然後通過回調通知應用程序;