epoll的事件通知机制
LT 水平触发
当fd有数据可读时,会重复通知多次,直到数据处理完成,是epoll的默认模式
ET 边缘触发
当fd有数据可读时,只通知一次,不管数据是否处理完成
解决方案
epoll_wait监听到fd后,判断fd没有处理完,手动执行epoll_ctl,将fd重新添加到eventpoll里
监听到fd时,while一直读取fd,直到读完(必须是非阻塞的,否则会卡住进程)
lt和et的区别
当产生就绪fd时,list_head拷贝到用户空间时,会断开链表的连接,lt会判断fd是否全部读完,如果没有,重新放到list_head
et不管有没有读完,直接不放入list_head
本质上是一个数据是否重复消费的问题(et需要手动来解决,明显要比lt复杂)
lt的问题
lt会存在多次消费的惊群现象,比如多个进程都监听了epoll_wait,重新放入fd,必然会被多个监听拷贝过去,可能会重复处理
除非特别追求性能,lt完全可以满足需求
epoll的事件通知机制
最新推荐文章于 2024-10-09 10:13:11 发布