JDK——NIO系统调用浅析
概要
NIO(Non-blocking I/O,在Java領域,也稱為New I/O),是一種同步非阻塞的I/O模型,也是I/O多路復用的基礎,已經被越來越多地應用到大型應用服務器,成為解決高并發與大量連接、I/O處理問題的有效方式。
類圖
類關系圖
SelectorProvider類圖
Selector類圖
Channel類圖
FileChannel 從文件中讀寫數據。
DatagramChannel 能通過UDP讀寫網絡中的數據。
SocketChannel 能通過TCP讀寫網絡中的數據。
ServerSocketChannel可以監聽新進來的TCP連接,像Web服務器那樣。對每一個新進來的連接都會創建一個SocketChannel。
Pipe類圖
實現
NIO并沒有完全屏蔽平臺差異,它仍然是基于各個操作系統的I/O系統實現的,差異仍然存在。
不同操作系統提供 不同的 SelectorProvider 實現
SelectorProvider 可以通過DefaultSelectorProvider 或者jvm參數java.nio.channels.spi.SelectorProvider加載
SelectorProvider 可以 open 各種channel 、pipe、selector
SelectorProvider
Window
select模型
- 并發性能不是很好。而且FD_SETSIZE不能超過Windows下層提供者的限制,這個限制通常是1024。
Linux
JDK里,Java標準庫和部分工具的源碼中,BSD和Linux的平臺相關源碼都是在solaris目錄里的。 原本Sun
JDK的源碼里平臺相關的目錄就是從solaris和windows這兩個目錄開始的,后來Unix系列的平臺相關代碼全都放在solaris目錄下了,共用大部分代碼。
下載OpenJDK源碼
Epoll是Linux下多路復用IO接口select/poll的增強版本,它能顯著提高程序在大量并發連接中只有少量活躍的情況下的系統CPU利用率,因為它會復用文件描述符集合來傳遞結果而不用迫使開發者每次等待事件之前都必須重新準備要被偵聽的文件描述符集合,另一點原因就是獲取事件的時候,它無須遍歷整個被偵聽的描述符集,只要遍歷那些被內核IO事件異步喚醒而加入Ready隊列的描述符集合就行了。epoll除了提供select/poll那種IO事件的電平觸發(Level Triggered)外,還提供了邊沿觸發(Edge Triggered),這就使得用戶空間程序有可能緩存IO狀態,減少epoll_wait/epoll_pwait的調用,提高應用程序效率。
epoll native 方法
openjdk\jdk\src\solaris\native\sun\nio\ch\EPoll.c
openjdk\jdk\src\solaris\classes\sun\nio\ch\EPoll.java
MacOS NIO 實現
KQueue
流程
參考文章
- 為什么OpenJDK只有share,solaris,windows下有源碼而bsd和linux沒有呢?
- Improving (network) I/O performance …
- Java從BIO到NIO,多路復用select、poll和epoll與JDK的關系
- 淺談NIO和Epoll的實現原理
總結
以上是生活随笔為你收集整理的JDK——NIO系统调用浅析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Cloud Gateway
- 下一篇: 高并发系统架构