(一) 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 : 同步並阻塞,服務器實現模式爲一個連接一個線程,即客戶端有連接請求時服務器端就需要啓動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。
-
Java NIO : 同步非阻塞,服務器實現模式爲一個請求一個線程,即客戶端發送的連接請求都會註冊到多路複用器上,多路複用器輪詢到連接有I/O請求時才啓動一個線程進行處理。
-
Java AIO(NIO.2) : 異步非阻塞,服務器實現模式爲一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啓動線程進行處理,
-
BIO方式適用於連接數目比較小且固定的架構,這種方式對服務器資源要求比較高,併發侷限於應用中,JDK1.4以前的唯一選擇,但程序直觀簡單易理解。
-
NIO方式適用於連接數目多且連接比較短(輕操作)的架構,比如聊天服務器,併發侷限於應用中,編程比較複雜,JDK1.4開始支持。
-
AIO方式使用於連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用OS參與併發操作,編程比較複雜,JDK7開始支持。