NIO體系

 

 

一.與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. 可伸縮的網絡服務

 

    1. 事件驅動處理

 

 

1.3 多線程版本

八.Proactor 模式

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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