一.與IO區別
1. 組件
* NIO中
* 核心概念:
* selector:選擇器
* channel:通道
* buffer:緩衝區
* 即面向塊兒 (block)或者緩衝區buffer 編程的
NIO中面向塊兒( block、 buffer )編程,
Buffer本身就是一內存,實際上是數組,數據的讀寫都是通過Buffer來實現的。
Channel 就像IO中的stream
1數據要從channel 進入到buffer 中,有buffer進入到程序中。也可以將數據寫回到buffer中。即通過buffer.flip().
讀寫的切換就是由flip 切換的。Flip中維護了一些數位
2. 除了數組之外,buffer還提供了對於數據的結構化方式,即讀寫的位置,
3. java的8中原生類型都有各自對應的buffer類型:但沒有BooleanBuffer
IntBuffer,LongBuffer ,ByteBuffer ,CharBuffer
4. channel 是指向其寫入或讀取數據的對象,類似於IO中的stream 。其所有的數據的讀寫都要通過buffer操作。
5. channel是雙向的,channel 創建後可以進行讀或寫 。在Linux系統中,底層操作系統的通道就是雙向的,
1.DirectBytrBuffer
操作系統在操作heapByteBuffer 時,不會直接操作堆空間內存,而是需要把堆的內存的數據拷貝到堆外內存,再進行與IO設備交互。而
DirectBytrBuffer就直接在堆外內存中,直接跟IO設備交互,少了一次數據拷貝的過程。
如果OS直接訪問堆內存的話,此時JVM進行GC,回收後內存地址會發生變更。並且拷貝的過程中也不能發生GC,如果發生了GC也會發生問題。
拷貝到堆外的內存當OS使用完後直接釋放掉。但對於directByteBuffer,
2. DirectBytrBuffer對象本身還是在堆中,其address引用指向了一塊堆外內存
二.buffer 屬性講解
1. position : 讀,寫元素的下一個位置的索引值
當buffer中讀取元素調用flip()之後,positon重新指向寫元素的第一個位置
Positon 永遠不會大於limit 的值
2. limit :
3.capacity :容量的值大小不會變
三.byteBuffer
HeapByteBuffer extend ByteBuffer
四.DirectByteBuffer
1.
五.NIO – selector選擇器
1. 傳統的網絡編程:構造ServerSocket ,將其綁定到某端口上,
ServerSocket會調用accept方法,阻塞等待客戶端連接:即服務端的代碼就等待阻塞,當有鏈接時就返回一個Socket對象,標示跟客戶端的連接,
客戶端與服務端進行連接的端口就是服務端開啓的端口,但兩者進行數據傳遞的端口是由操作系統另外分配的。
2. 異步處理客戶端的請求( NIO )
Selector 可以監聽客戶端的事件event ,註冊通道是通過selectionKey
Selector 通過三種selectionKey 維護IO事件的狀態,可得到是哪個channel產生的selectionKey
2.1 select 方法,阻塞方法:當其連接的通道有任何變更時,都會通知相應的通道,返回相應的集合
3.
The first invocation of this method locates the default provider
* object as follows
第一次調用這個方法定位默認程序 。
SelectionKey 在使用完後一定要關閉。
六 . 字符集處理
七.高性能—Reactor 模式(重點)
1. Reactor:反應器模式( Scalable IO in java : doug Lea 主導java併發編程的作者 )
Nio中的EventLoop就是一個reactor 。
-
- 可伸縮的網絡服務
-
- 事件驅動處理
1.3 多線程版本
八.Proactor 模式