NIO的組成有哪些——奈學

奈學教育發表於2020-08-06
Buffer:與Channel進行互動,資料是從Channel讀入緩衝區,從緩衝區寫入Channel中的
flip方法 : 反轉此緩衝區,將position給limit,然後將position置為0,其實就是切換讀寫模式
clear方法 :清除此緩衝區,將position置為0,把capacity的值給limit。
rewind方法 : 重繞此緩衝區,將position置為0
DirectByteBuffer可減少一次系統空間到使用者空間的複製。但Buffer建立和銷燬的成本更高,不可控,通常會用記憶體池來提高效能。直接緩衝區主要分配給那些易受基礎系統的本機I/O 操作影響的大型、持久的緩衝區。如果資料量比較小的中小應用情況下,可以考慮使用heapBuffer,由JVM進行管理。
Channel:表示 IO 源與目標開啟的連線,是雙向的,但不能直接訪問資料,只能與Buffer 進行互動。透過原始碼可知,FileChannel的read方法和write方法都導致資料複製了兩次!
Selector可使一個單獨的執行緒管理多個Channel,open方法可建立Selector,register方法向多路複用器器註冊通道,可以監聽的事件型別:讀、寫、連線、accept。註冊事件後會產生一個SelectionKey:它表示SelectableChannel 和Selector 之間的註冊關係,wakeup方法:使尚未返回的第一個選擇操作立即返回,喚醒的
原因是:註冊了新的channel或者事件;channel關閉,取消註冊;優先順序更高的事件觸發(如定時器事件),希望及時處理。
Selector在Linux的實現類是EPollSelectorImpl,委託給EPollArrayWrapper實現,其中三個native方法是對epoll的封裝,而EPollSelectorImpl. implRegister方法,透過呼叫epoll_ctl向epoll例項中註冊事件,還將註冊的檔案描述符(fd)與SelectionKey的對應關係新增到fdToKey中,這個map維護了檔案描述符與SelectionKey的對映。
fdToKey有時會變得非常大,因為註冊到Selector上的Channel非常多(百萬連線);過期或失效的Channel沒有及時關閉。fdToKey總是序列讀取的,而讀取是在select方法中進行的,該方法是非執行緒安全的。
Pipe:兩個執行緒之間的單向資料連線,資料會被寫到sink通道,從source通道讀取
NIO的服務端建立過程:Selector.open():開啟一個Selector;ServerSocketChannel.open():建立服務端的Channel;bind():繫結到某個埠上。並配置非阻塞模式;register():註冊Channel和關注的事件到Selector上;select()輪詢拿到已經就緒的事件。
本文來自:奈學開發者社群,如有侵權,請聯絡我刪除~


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69976011/viewspace-2709652/,如需轉載,請註明出處,否則將追究法律責任。

相關文章