關於NIO的學習理解

2021-10-06 02:44:43 字數 1335 閱讀 3090

全稱new input output。針對於檔案系統的io,提供記憶體對映以提高io效率;對於網路io,提供乙個執行緒可以管理多個連線的能力。

針對於本地檔案系統,不支援選擇通道+io多路復用。檔案要被應用所訪問到,路徑為  磁碟-->>>核心空間-->>>使用者空間,磁碟到核心空間有乙個dma控制器,dma控制器從磁碟載入資料是不需要消耗cpu的,但核心空間到使用者空間需要消耗cpu,nio中的buffer元件能提供記憶體對映,避免了核心空間把檔案內容進行中轉的cpu消耗,如下圖,圖1為沒用記憶體對映,圖2用了記憶體對映

針對於網路io,支援可選擇通道+多路復用,提供了以下模型,選擇器可以選擇就緒的通道進行操作,如下圖:

socket+nio與傳統socket+bio優勢

乙個選擇器可以管理多個客戶端通道;如果是傳統的方式,由於socket是阻塞的,所以為了解決多個客戶端連線的問題,需要開多個執行緒,乙個執行緒處理乙個客戶端,由於執行緒資源寶貴且數量有上限,無法處理併發高的情況。

buffer是用於承載於通道兩端實體資料的容器,類圖如下:

只有bytebuffer才能被管道所使用,因為作業系統的資料儲存都是基於位元組的。位元組緩衝區又分為直接緩衝區與非直接緩衝區,直接緩衝區就是用了記憶體對映。

直接緩衝區的好處:

1. 基於記憶體對映,io效率高

2. 由作業系統分配記憶體,所以不占用jvm的記憶體

直接緩衝區的壞處:

1. 需要作業系統來分配排程,所以代價昂貴

檢視緩衝區與位元組緩衝區

檢視緩衝區只能由位元組緩衝區生成,檢視緩衝區是原始型別的緩衝區,與原緩衝區資料共享,但是單獨維護了limit,position等重要屬性。

通道是連線於兩端實體的管道,兩端資料的傳遞把資料放入buffer,然後經過管道傳輸。

注意: 只有繼承了selectablechannel的之類才能配合選擇器使用

通道類圖如下:

filechannel不支援選擇通道+多路復用,因為沒有繼承selectablechannel

由通道註冊到選擇器後返回的物件,封裝了 選擇器與通道的關係和通道的就緒狀態和感興趣的操作。

用於選擇出已經準備就緒的通道。

個人關於NIO的理解

一 同步 非同步 阻塞 非阻塞的聯絡和區別 同步和非同步是針對於應用程式和核心的互動而言的,阻塞和非阻塞是針對使用者程序訪問資料而言的。同步 使用者程序觸發io操作後,就一直等待或者輪詢直到io操作完成。非同步 使用者程序觸發io操作後,就可以開始做自己的事,等到io完成後會收到乙個通知。阻塞 讀取...

NIO學習一 NIO簡介

最近在學習nio,根據學習總結了一下,如果有不對的地方,請大佬指出。nio,就是new io,從jdk 1.4開始引入的新的api,它跟io的作用相同。它與傳統的io相比,有如下特性 1 nio是面向緩衝區的,io是面向流的。2 io是阻塞的操作,如果乙個io的read或者write沒有得到資料的時...

學習NIO小結

nio 同步非阻塞 在jdk1.4時推出,和傳統的io 同步阻塞 比較有著新的思想,在網上學習和整理知識點時知道學習nio可分為3個部分 1.channel 通道,資料的讀取和寫入都可以通過它來完成。2.selector 選擇器,用於選擇註冊在通道中的已發生的事件。3.bytebuffer 乙個新的...