epoll事件的两种触发模式

epoll有EPOLLLT和EPOLLET两种触发模式

  • LT是默认的模式
  • ET是高速模式

什么是水平触发(LT)和边缘触发(ET)?

ET和LT,来自电子的概念

  • ET边沿触发:当电平出现变化的时候才触发事件。
  • LT水平触发:只要存在高电平就一直触发事件。

image.png

Level_triggered(水平触发)

image.png
当被监控的文件描述符上有可读写事件发生时,epoll_wait() 会通知处理程序去读写。如果这次没有把数据一次性全部读写完(如读写缓冲区太小),那么下次调用 epoll_wait()时,它还会通知你在上没读写完的文件描述符上继续读写,当然如果你一直不去读写,它会一直通知你!!!如果系统中有大量你不需要读写的就绪文件描述符,而它们每次都会返回,这样会大大降低处理程序检索自己关心的就绪文件描述符的效率!!!

Edge_triggered(边缘触发)

image.png
当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写。如果这次没有把数据全部读写完(如读写缓冲区太小),那么下次调用 epoll_wait()时,它不会通知你,也就是它只会通知你一次,直到该文件描述符上出现第二次可读写事件才会通知你。这种模式比水平触发效率高,系统不会充斥大量你不关心的就绪文件描述符。

  • select(),poll() 模型都是水平触发模式
  • 信号驱动 IO 是边缘触发模式
  • epoll()模型 即支持水平触发,也支持边缘触发,默认是水平触发。

image.png
image.png

image.png
image.png

在Netty中使用Epoll

image.png
image.png