Java_BIO/NIO/AIO

(一)       BIO

傳統的server/client實現是基於thread per request.

(二)       NIO

最核心的一點就是反應器模式:當有感興趣的事件發生時,就通知對應的事件處理器去處理事件,如果沒有,則不處理。所以使用一個線程做輪詢就可以了。

JDK1.4中推出NIO,對高速地塊讀取、對I/O多路複用和非阻塞進行支持。考慮到流I/O採用阻塞方式進行網絡I/P,浪費了大量的時間在等待數據上,所以新的方式需要能提供非阻塞的支持,提高線程的利用率,減少系統在管理線程和線程上下文切換的開銷。

 

引起多線程模型的高併發、短連接時性能嚴重下降,併發性能不高的原因有兩個方面;一方面是流I/O技術讀寫速度慢,另外流I/O技術的阻塞特性將純種的一部分時間浪費在等待I/O操作上,同時大量地創建、管理、銷燬純種以及上下文切換也使得性能下降和消耗大量系統資源。

一方面需要提高I/O讀寫的速度,同時採用非阻塞的方式讀取,減少等候時間。(NIO,如何理解非阻塞???

一方面需求提高線程的使用效率,減少系統資源的消耗。(線程池

提出的JAVA高性能網絡應用開發模型:reactor模型,最後分析建立的新模型基礎上的MINA框架。

Reactor模型是一個事件觸發模型,當I/O操作準備就緒時,觸發讀寫操作,然後使用線程池進行數據處理,避免了傳統的java網絡應用開發模型使用一個線程處理一個客戶端連接的所有事件,導致在客戶端連接增多的時候,性能急劇下降,併發性能不好。

 

 

關鍵概念:channel,buffer.

緩衝,就是不對stream對象直接進行操作。

通道,就像是流,通過它讀取和寫入數據。

選擇器selector是selectableChannel對象的多路複用器。Selector具有註冊事件、監控事件的能力。

能夠區分select,poll,epoll方式的差異(用於獲取它們所綁定的selectablechannel類型通道)

關於塊傳輸,就是一種傳輸速度與處理速度的平衡。切塊之後,處理迅速加快,而傳輸速度下降,因爲還要切換等。


先來個例子理解一下概念,以銀行取款爲例:

  • 同步 : 自己親自出馬持銀行卡到銀行取錢(使用同步IO時,Java自己處理IO讀寫)。

  • 異步 : 委託一小弟拿銀行卡到銀行取錢,然後給你(使用異步IO時,Java將IO讀寫委託給OS處理,需要將數據緩衝區地址和大小傳給OS(銀行卡和密碼),OS需要支持異步IO操作API)。

  • 阻塞 : ATM排隊取款,你只能等待(使用阻塞IO時,Java調用會一直阻塞到讀寫完成才返回)。

  • 非阻塞 : 櫃檯取款,取個號,然後坐在椅子上做其它事,等號廣播會通知你辦理,沒到號你就不能去,你可以不斷問大堂經理排到了沒有,大堂經理如果說還沒到你就不能去(使用非阻塞IO時,如果不能讀寫Java調用會馬上返回,當IO事件分發器會通知可讀寫時再繼續進行讀寫,不斷循環直到讀寫完成)。


Java對BIO、NIO、AIO的支持

  • Java BIO : 同步並阻塞,服務器實現模式爲一個連接一個線程,即客戶端有連接請求時服務器端就需要啓動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。

  • Java NIO : 同步非阻塞,服務器實現模式爲一個請求一個線程,即客戶端發送的連接請求都會註冊到多路複用器上,多路複用器輪詢到連接有I/O請求時才啓動一個線程進行處理。

  • Java AIO(NIO.2) : 異步非阻塞,服務器實現模式爲一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啓動線程進行處理,


BIO、NIO、AIO適用場景分析:

  • BIO方式適用於連接數目比較小且固定的架構,這種方式對服務器資源要求比較高,併發侷限於應用中,JDK1.4以前的唯一選擇,但程序直觀簡單易理解。

  • NIO方式適用於連接數目多且連接比較短(輕操作)的架構,比如聊天服務器,併發侷限於應用中,編程比較複雜,JDK1.4開始支持。

  • AIO方式使用於連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用OS參與併發操作,編程比較複雜,JDK7開始支持。


另外,I/O屬於底層操作,需要操作系統支持,併發也需要操作系統的支持,所以性能方面不同操作系統差異會比較明顯。










發佈了8 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章