Netty EpollEventLoopGroup

本文探讨了Netty为何提供基于epoll的实现,即使Oracle JDK已为不同操作系统提供了优化的Selector。Netty的epolltransport采用边缘触发模式,提供额外配置选项,并通过C代码减少GC和同步操作,提升性能。文章还解释了epoll的两种模式:ET(边缘触发)和LT(水平触发),并讨论了它们在读取socket时的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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就算废了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值