NIO提供了selector的epoll实现,为什么Netty还要实现自己的Epoll版本呢?

这其实是Stackoverflow上的一个问题。Netty的核心开发者Norman Maurer给出了答案:

Netty的epoll transport使用了边缘触发,而java的NIO库使用了水平触发。而且Netty的epoll transport支持了java nio没有支持的配置选项,例如TCP_CORK、SO_REUSEPORT等等。

epoll的边缘触发(Edge Triggered,ET)和水平触发(Level Triggered,LT)

对于水平触发LT来说,会持续通知直到事件处理完毕。而边缘触发ET只会通知一次,不管事件是否处理完毕。

epoll_wait的相关工作流程:

  • 当内核监控的fd产生用户关注的事件,内核将fd(epi)节点信息添加进就绪队列。
  • 内核发现就绪队列有数据,唤醒进程工作。
  • 内核先将fd从就绪队列删除。
  • 然后将fd对应就绪事件信息从内核空间拷贝到工作空间。
  • 事件数据拷贝完成之后,内核检查事件模式是lt还是et。如果不是et,重新将fd信息添加回就绪队列,下次重新触发epoll_wait。

参考

nio - Why native epoll support is introduced in Netty? - Stack Overflow

如何理解Epoll中的LT和ET模式,底层实现又是怎么样的? - 知乎 (zhihu.com)

相关推荐
我怎么又饿了呀几秒前
CentOs 10 虚拟机安装【解决方法】VMware无法打开内核设备,未能启动虚拟机
linux·运维·centos
爱敲代码的憨仔几秒前
Spring-AOP
java·后端·spring
H Journey1 分钟前
Centos与Ubuntu差异总结
linux·ubuntu·centos
阿拉伯柠檬1 分钟前
Git原理与使用(一)
大数据·linux·git·elasticsearch·面试
短剑重铸之日3 分钟前
《设计模式》第四篇:观察者模式
java·后端·观察者模式·设计模式
冰冰的coco6 分钟前
如何设置需要sudo的命令开机自启动
linux·运维·服务器
辞旧 lekkk8 分钟前
【Linux】Linux进程控制(三)自主实现简易shell命令行解释器
linux·运维·服务器·学习·萌新
Hx_Ma1610 分钟前
SpringBoot注册格式化器
java·spring boot·后端
乔江seven14 分钟前
【python轻量级Web框架 Flask 】1 Flask 初识
开发语言·后端·python·flask
HIT_Weston19 分钟前
119、【Ubuntu】【Hugo】首页板块配置:Template Lookup Order
linux·运维·ubuntu