Epoll知识点

本文介绍了Linux的epoll机制,包括epoll_create、epoll_ctl和epoll_wait的用法。重点讨论了边沿触发(ET)和水平触发(LT)两种模式的差异。Netty采用ET模式,它在处理IO事件时更高效,但要求立即处理,而JDK的LT模式则允许稍后处理。在某些Linux内核版本中,LT模式可能存在导致无限read事件的问题。Netty通过判断空轮询次数来避免这个问题。总的来说,ET模式在性能上优于LT模式,但需要配合非阻塞套接字使用。

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

epoll

epoll_create

用于创建一个epoll实例,并返回一个这个实例的文件描述符

epoll_ctl

通过该函数标记对特定的问价描述符感兴趣,当前在epoll实例上注册的文件描述符集有时称为epoll集。

epoll_wait

等待IO事件,如果当前没有可用事件,则会阻塞

edge-triggered

Netty使用ET。

应用程序必须立即处理该事件

ET会在read或write在返回EAGAIN(对于网络IO来说也可能是EWOULDBLOCK, 表示被标记为非阻塞的操作会发生阻塞的异常)时才会返回消息。

level-triggered

JDK使用LT。

应用程序可以不立即处理该事件

LT在读完部分byte后返回,并且如果还有未读的btye,则会立即发起下一个事件,但是如果连接关闭,需要将Selector移除,并创建一个新的Selector,否则会导致无限的read事件。

BUG原因:在部分Linux的2.6的kernel中,poll和epoll对于突然中断的连接socket会对返回的eventSet事件集合置为POLLHUP,也可能是POLLERR,eventSet事件集合发生了变化,这就可能导致Selector会被唤醒。

Netty: 会判断等待时长,如果有512次空轮询,则会重新创建Selector

综上

ET模式在很大程度上减少了epoll事件被重复触发的次数,因此效率要比LT模式高。epoll工作在ET模式的时候,必须使用非阻塞套接口,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值