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
。 - • 减少系统调用次数,提升效率,适合高性能场景。
- • 编程复杂,稍有不慎可能导致事件丢失或死锁。
总结
select
和poll
适合连接数较少、跨平台需求强的应用,epoll
适合Linux下高并发、大连接数的网络服务器。epoll
的边缘触发模式在性能上优于水平触发,但对程序设计要求更高,需要开发者合理使用非阻塞I/O和事件循环机制。
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/1236
文章版权归作者所有,未经允许请勿转载。
THE END