epoll
Linux内核提供的高性能I/O事件通知机制,通过状态常驻内核、红黑树管理描述符和就绪队列回调,实现近O(1)复杂度的大规模并发I/O多路复用
时间轴 (近 90 天)
libevent在Linux上封装epoll,在BSD/macOS上封装kqueue,在Solaris上使用/dev/poll或event ports,在Windows上使用select或IOCP,并对外提供统一的event_base事件循环接口。
epoll 允许单个线程同时监视成千上万个文件描述符,当某个 socket 可读或可写时内核通知应用程序处理对应事件。
epoll提供水平触发(LT,默认)和边缘触发(ET)两种工作模式,ET只在状态变化时通知一次,要求应用配合非阻塞I/O一次性读干净数据直到EAGAIN
Nginx默认使用ET模式以减少epoll_wait的唤醒次数,每个worker进程在读事件时循环读取直到缓冲区耗尽
边缘触发模式下若只读取部分数据就返回等待下次通知,剩余数据将不再触发事件,造成连接假死
epoll通过epoll_create、epoll_ctl、epoll_wait三个系统调用实现事件通知
Linux上实现kqueue的统一能力需组合使用epoll、inotify、signalfd、timerfd等多套API
epoll与kqueue遵循相同哲学:注册一次多次等待、只返回活跃事件、内核主动通知,使单机支撑百万级并发连接成为现实
水平触发容错性高、适合快速开发或旧代码迁移,边缘触发性能更高但更容易写出bug,这是二者的权衡
epoll内核内部用红黑树管理注册的描述符,并维护就绪队列,epoll_wait复杂度接近O(1),只与活跃连接数相关
全部知识事实 (10)
libevent在Linux上封装epoll,在BSD/macOS上封装kqueue,在Solaris上使用/dev/poll或event ports,在Windows上使用select或IOCP,并对外提供统一的event_base事件循环接口。
50%待验证epoll 允许单个线程同时监视成千上万个文件描述符,当某个 socket 可读或可写时内核通知应用程序处理对应事件。
50%待验证epoll提供水平触发(LT,默认)和边缘触发(ET)两种工作模式,ET只在状态变化时通知一次,要求应用配合非阻塞I/O一次性读干净数据直到EAGAIN
50%待验证Nginx默认使用ET模式以减少epoll_wait的唤醒次数,每个worker进程在读事件时循环读取直到缓冲区耗尽
50%待验证边缘触发模式下若只读取部分数据就返回等待下次通知,剩余数据将不再触发事件,造成连接假死
50%待验证epoll通过epoll_create、epoll_ctl、epoll_wait三个系统调用实现事件通知
50%待验证Linux上实现kqueue的统一能力需组合使用epoll、inotify、signalfd、timerfd等多套API
50%待验证epoll与kqueue遵循相同哲学:注册一次多次等待、只返回活跃事件、内核主动通知,使单机支撑百万级并发连接成为现实
50%待验证水平触发容错性高、适合快速开发或旧代码迁移,边缘触发性能更高但更容易写出bug,这是二者的权衡
50%待验证epoll内核内部用红黑树管理注册的描述符,并维护就绪队列,epoll_wait复杂度接近O(1),只与活跃连接数相关
50%