epoll --水平触发与边缘触发

  epoll 提供了边沿触发 (ET) 和电平触发 (LT)的事件触发方式。两种机制的区别如下:

  先假设出现如下情况:

  1. 某个有一个管道已经建立连接,fd加入了epoll中,监测可读事件。
  2. 管道的写入者,写入了2KB的数据。
  3. 读取者调用epoll_wait()成功返回了事件。
  4. 但是管道的读取者只读取了1KB 的数据。
  5. 读取者读取结束,再次调用epoll_wait()

  如果用户在添加fd到epoll时,使用了参数EPOLLET(边缘触发)。 当读线程执行第5步的时候,线程可能会被挂起,尽管缓冲区汇总还存在数据,与此同时远端可能在等待当前线程的相应。边缘触发就是套接字的状态改变时才触发,具体说就是从不可读到切换到可读的这一瞬间才会触发。所以可能会导致第5步被永久的阻塞。

  使用边缘触发时,应该避免使用阻塞的套接字,以避免部分的套接字被饿死。具体建议如下:

  1、使用非阻塞的文件描述符

  2、只有当read或write返回EAGAIN以后,才再次调用wait(就是数据全部读写完成了)。

 

  水平触发模式是默认的模式。

  

优点:

  当多个线程或进程同时wait同一个epoll时,如果设置了边缘触发,可以避免出现“惊群”效应,把所有的线程都唤醒了。

 

 

  

  

  

 

posted @   核心已转储  阅读(837)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示