Java NIO
根据操作系统不同, 针对Selector
有不同的默认实现:
- macosx:KQueueSelectorProvider
- solaris:DevPollSelectorProvider
- Linux:EPollSelectorProvider (Linux kernels >= 2.6)或 PollSelectorProvider
- windows: WindowsSelectorProvider
为什么netty
还要提供一个基于epoll
的实现
自4.0.16起, Netty
为Linux
通过JNI
的方式提供了native socket transport
.
NioEventLoopGroup
→EpollEventLoopGroup
NioEventLoop
→EpollEventLoop
NioServerSocketChannel
→EpollServerSocketChannel
NioSocketChannel
→EpollSocketChannel
原因:
Netty
的epoll transport
使用epoll
边缘触发 而java nio
使用epoll
水平触发(在这个模式下,io来了数据,就只通知这些io设备对应的fd,上次通知过的fd不再通知,内核不用扫描一大堆fd)netty epoll transport
暴露了更多的java nio
没有的配置参数, 如TCP_CORK
,SO_REUSEADDR
等