以下內容摘自:敖丙肝了一個月的Netty知識點
阻塞與非阻塞
阻塞和非阻塞操作是針對發起的IO請求操作後是否立刻返回一個標誌信息而不讓請求線程等待,當數據準備未完成時,請求線程的狀態:
阻塞:往往需要等待緩衝區中的數據準備好過後才處理其他的事情,否則一直等待在那裏。
非阻塞:無論數據是否準備好,都會直接返回。
阻塞IO
非阻塞IO
同步與異步
同步與異步是基於應用程序和操作系統處理IO事件所採用的方式:
同步:應用程序要直接參與IO讀寫的操作。
異步:所有的IO操作交給操作系統去處理,應用程序只需要等待通知。
異步相比較於同步帶來的直接好處就是在我們處理IO數據的時候,異步的方式我們可以把這部分等待所消耗的資源用於處理其他事務,提升我們服務自身的性能。
同步IO
異步IO
NIO與BIO的區別總結
NIO | BIO |
---|---|
基於緩衝區( Buffer ) | 基於流( Stream ) |
非阻塞 IO | 阻塞 IO |
選擇器( Selector ) | 無 |
BIO
Blocking IO,是同步阻塞的IO模型,傳統的IO【java.io包】就是這種模型。
BIO面向字節流或字符流,以流的方式順序地處理一個或多個字節。
BIO的IO操作是阻塞式的:當一個線程調用read()或write()時,該線程被阻塞,直到有一些數據被讀取,或數據完全寫入。該線程在此期間不能再幹任何事情了。
採用BIO形式的網絡通信,服務器端啓動一個ServerSocket,客戶端需要啓動Socket來進行一對一連接,如果客戶端有多個客戶端請求,當其中一個客戶端線程連接成功後,其他的將會阻塞。如果需要實現服務端同時處理多個客戶端線程,必然需要服務器端開啓多線程與之對應,這樣就會導致如果客戶端請求過多,服務器線程開闢過多導致系統崩潰。
NIO
NIO是Java1.4引入的,相對於傳統的IO來說,N可以代表New的意思,表示新IO,但更爲具體的理解是Non-blocking的意思,是一種同步非阻塞的IO模型。它提供了Buffer,Channel,Selector三大組件。
同步與非阻塞怎麼理解,是否矛盾?
非阻塞體現在:用戶程序發起IO操作請求後不等待數據,而是調用會立即返回一個標誌信息告知條件不滿足,數據未準備好,用戶請求程序繼續執行其他任務。執行完其他任務,用戶程序會主動輪詢查看IO操作條件是否滿足,如果滿足,則用戶程序親自參與拷貝數據動作,這是同步的過程。
NIO支持面向Buffer,基於Channel的IO操作,任何數據在Buffer中進行處理,且能夠任意改變操作位置,處理靈活。
NIO的IO操作可以是非阻塞的:當一個線程執行從Channel讀取數據的IO操作時,如果有數據,則返回數據;如果沒數據,不需要阻塞,而是可以直接返回。
NIO實現非阻塞IO的其中關鍵組件之一就是Selector,可以註冊多個Channel到一個Selector中。Selector可以不斷執行select操作,判斷這些註冊的Channel是否有已就緒的IO事件,如可讀,可寫,網絡連接已完成等。一個線程通過使用一個Selector管理多個Channel。
NIO就是一個線程負責所有請求連接但不處理IO操作,該線程只負責把連接註冊到多路複用器上,多用複用器輪詢到連接有IO請求時候再啓動其它線程處理IO請求操作,實現一個線程或少量線程就可以對應衆多的客戶端線程。
AIO是啥?
JDK1.7中,java.nio.channels
包下增加了多個異步通道,是NIO的升級版本,實現AIO AsynchronousIO的異步非阻塞IO模型。
非阻塞前面已經解釋過了,異步指的就是數據拷貝階段完全由操作系統處理,而應用程序只需要等待通知即可。
總結
- 同步與異步的區別在於數據拷貝階段是否需要完全由操作系統處理。
- 阻塞和非阻塞操作是針對發起的IO請求操作後是否立刻返回一個標誌信息而不讓請求線程等待。
- BIO是同步阻塞式的IO模型,面向流操作,保證順序,如JDK1.4之前的傳統IO操作。
- NIO是同步非阻塞式的IO模型,面向緩衝區,提供Channel,Buffer,Selector等抽象,如JDK1.4引入的IO操作。
- AIO是異步非阻塞式的IO模型,如JDK1.7引入的IO操作。