1.21、介绍一下socket中的多路复用、epoll的水平和边缘触发模式?

多路复用机制及优缺点

1. select

优点

  • • 可移植性好,几乎所有Unix系统都支持。
  • • 支持微秒级超时精度,适合对超时要求较高的场景。

缺点

  • • 监听的文件描述符数量有限制,默认最大1024个(可调,但有限制)。
  • • 每次调用都需要将文件描述符集合从用户空间复制到内核空间,调用结束后再复制回来,内存拷贝开销大。
  • • 需要维护fd_set数据结构,且调用时需重新设置,效率较低。

2. poll

优点

  • • 没有文件描述符数量的硬性限制,理论上支持更多连接。
  • • 接口比select更简洁,无需重置fd集合。

缺点

  • • 和select一样,每次调用都需要在用户态和内核态之间复制文件描述符数组,内存拷贝开销大。
  • • 仍然是线性扫描所有监听的文件描述符,效率随数量增加线性下降。

3. epoll(Linux特有)

优点

  • • 不限制监听的文件描述符数量,支持大规模连接。
  • • 内核维护监听集合,用户态无需每次复制整个集合,只在添加/修改时复制一次,减少内存拷贝开销。
  • • 事件通知采用回调方式,只返回触发事件的文件描述符,避免无效扫描,效率高,时间复杂度接近O(1)。
  • • 支持多线程同时等待同一个epoll实例,提高并发性能。

缺点

  • • 仅Linux支持,不具备跨平台性。
  • • 使用复杂度较高,尤其是边缘触发模式,需要正确处理非阻塞I/O,容易出错。

epoll的触发模式:水平触发(Level-Triggered, LT)与边缘触发(Edge-Triggered, ET)

水平触发(LT)

  • • 默认模式。
  • • 只要文件描述符处于就绪状态(如缓冲区有数据可读),epoll_wait就会持续通知应用程序。
  • • 应用程序可以多次读取数据,每次调用epoll_wait都会返回该文件描述符。
  • • 编程简单,不容易漏掉事件,但可能产生重复通知,导致系统调用次数多,效率稍低。

边缘触发(ET)

  • • 只有在文件描述符状态发生变化时(如从不可读变为可读)才通知一次。
  • • 应用程序必须一次性读完所有数据,或写完所有数据,否则不会再次收到通知。
  • • 需要将文件描述符设置为非阻塞模式,配合循环读写直到返回EAGAIN
  • • 减少系统调用次数,提升效率,适合高性能场景。
  • • 编程复杂,稍有不慎可能导致事件丢失或死锁。

总结

selectpoll适合连接数较少、跨平台需求强的应用,epoll适合Linux下高并发、大连接数的网络服务器。epoll的边缘触发模式在性能上优于水平触发,但对程序设计要求更高,需要开发者合理使用非阻塞I/O和事件循环机制。
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)

 

阅读剩余
THE END