https://blog.youkuaiyun.com/alex_xfboy/article/details/89643638
Java NIO根据操作系统不同,比如macosx是KQueueSelectorProvider、windows有WindowsSelectorProvider、Linux有EPollSelectorProvider或PollSelectorProvider,可见不同的系统对nio的selector有不同的实现。
Oracle jdk会自动选择合适的Selector,为什么Netty还要提供一个基于epoll的实现呢?
(1)Netty的epoll transport使用edge-triggered,而javar的nio使用level-triggered.
(2)Netty的epoll transport暴漏了更多的nio没有的配置参数。
(3)c代码,更少gc,更少synchronized
https://blog.youkuaiyun.com/xiaoqi030611a/article/details/8820875
epoll两种模式:
1、ET(Edge Triggered)
每当状态变化时发生一个io事件。
2、LT(Level Triggered),水平解发/条件触发
只要满足条件,就触发一个事件(只要有数据没有被获取,内核就不断通知你)。
举个读socket的例子,假定经过长时间的沉默后,现在来了100个字节,这时无论边缘触发还是水平触发都会产生一个read ready notification通知应用程序可读。应用程序读了50个字节,然后重新调用api等待io事件。这时条件触发的api会因为还有50个字节可读,而立即返回用户一个read ready notification。而边缘触发的api会因为可读这个状态没有发生变化而长期等待。因此在使用边缘触发的api时,要注意每次都要读到socket返回EWOULDBLOCK为止,否则这个socket就算废了。