您好,登錄后才能下訂單哦!
這篇文章主要介紹“NIO有哪些組成部分”,在日常操作中,相信很多人在NIO有哪些組成部分問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”NIO有哪些組成部分”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
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()輪詢拿到已經就緒的事件。
到此,關于“NIO有哪些組成部分”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。