ZBLOG

水平触发与边沿触发的区别

水平触发(Level-Triggered)与边沿触发(Edge-Triggered)的区别

核心区别

特性 水平触发(LT) 边沿触发(ET)
触发条件 只要缓冲区有数据/可写就会持续通知 仅在状态变化时通知一次(如空→非空)
事件处理要求 不需要一次性处理完所有数据 必须一次性处理完所有数据,否则会丢失事件
性能开销 可能因重复通知产生额外系统调用 系统调用次数更少,性能更高
典型实现 select/poll/默认的epoll LT模式 epoll ET模式

技术细节对比

  1. 读事件场景

    • LT模式:只要接收缓冲区有数据,每次调用epoll_wait()都会返回该socket的可读事件。
    • ET模式:仅在以下情况触发:
      • 新数据到达时(从无到有)
      • 接收缓冲区从满变为非满后又有新数据到达
  2. 写事件场景

    1. // ET模式下必须非阻塞写入,直到EAGAIN
    2. while (send(sock, buf, len, MSG_DONTWAIT) > 0);
  3. 代码实现差异 “`cpp // LT模式简单处理(可能多次触发) if (events[i].events & EPOLLIN) { read(fd, buf, sizeof(buf)); }

// ET模式必须循环读取到EAGAIN if (events[i].events & EPOLLIN) {

  1. while ((n = read(fd, buf, sizeof(buf))) > 0);
  2. if (errno != EAGAIN) error();

}

  1. ---
  2. #### **选择建议**
  3. 1. **优先使用ET的场景**
  4. - 需要高性能的服务器(如nginxredis
  5. - 能保证一次性完整处理事件的场景
  6. 2. **适合LT的场景**
  7. - 简单应用或调试阶段
  8. - 无法保证及时处理所有数据的场景
  9. ---
  10. #### **底层原理图示
  1. 数据到达 持续通知(LT) 仅通知一次(ET)
  2. ▲-------►

Socket缓冲区 [#####] → epoll_wait()返回 → epoll_wait()返回一次

  1. ├-----未读完-----► X (不再通知)
  2. 再次epoll_wait()返回

”`

📌 关键记忆点

  • LT像”持续提醒的闹钟”,ET像”单次触发的机关”
  • Redis采用ET+非阻塞IO,Java NIO默认使用LT


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23329

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?