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

如下內容摘自:敖丙肝了一個月的Netty知識點java

阻塞與非阻塞

阻塞和非阻塞操做是針對發起的IO請求操做後是否馬上返回一個標誌信息而不讓請求線程等待,當數據準備未完成時,請求線程的狀態:服務器

阻塞:每每須要等待緩衝區中的數據準備好事後才處理其餘的事情,不然一直等待在那裏。網絡

非阻塞:不管數據是否準備好,都會直接返回。多線程

阻塞IO

非阻塞IO

同步與異步

同步與異步是基於應用程序和操做系統處理IO事件所採用的方式:異步

同步:應用程序要直接參與IO讀寫的操做。性能

異步:全部的IO操做交給操做系統去處理,應用程序只須要等待通知。操作系統

異步相比較於同步帶來的直接好處就是在咱們處理IO數據的時候,異步的方式咱們能夠把這部分等待所消耗的資源用於處理其餘事務,提高咱們服務自身的性能。.net

同步IO

異步IO

NIO與BIO的區別總結

NIO BIO
基於緩衝區( Buffer ) 基於流( Stream )
非阻塞 IO 阻塞 IO
選擇器( Selector )

BIO

Blocking IO,是同步阻塞的IO模型,傳統的IO【java.io包】就是這種模型。線程

BIO面向字節流或字符流,以流的方式順序地處理一個或多個字節。3d

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操做。

參考閱讀

相關文章
相關標籤/搜索