JDK——NIO系统调用浅析
Posted Starzkg
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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目录下了,共用大部分代码。
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系统调用浅析的主要内容,如果未能解决你的问题,请参考以下文章