NIO、BIO、AIO、同步異步、阻塞非阻塞傻傻分不清楚?

以下內容摘自:敖丙肝了一個月的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操作。

參考閱讀

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