epoll 模型
- 工作原理
epoll
是 Linux 内核为处理大批量文件描述符而作了改进的 I/O 多路复用技术,它使用事件驱动的方式,当有文件描述符就绪时,内核会直接通知应用程序。epoll
通过三个系统调用epoll_create
、epoll_ctl
和epoll_wait
来完成文件描述符的管理和事件的监听。 - 函数原型
#include <sys/epoll.h>
// 创建一个 epoll 实例,返回一个文件描述符
int epoll_create(int size);
// 对 epoll 实例进行控制,如添加、修改或删除要监视的文件描述符及其事件
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
// 等待 epoll 实例上的事件发生
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
-
优缺点
-
优点
:
- 高效:
epoll
使用内核事件表来管理文件描述符,避免了select
和poll
每次调用时的大量数据复制操作,提高了性能。 - 事件驱动:
epoll
采用事件驱动机制,当有事件发生时,内核会直接将发生事件的文件描述符通知给应用程序,无需像select
和poll
那样遍历所有文件描述符,大大提高了处理效率。 - 支持边缘触发(ET)和水平触发(LT)模式:边缘触发模式下,只有在文件描述符的状态发生变化时才会通知应用程序,减少了不必要的通知次数;水平触发模式则与
select
和poll
的行为类似。
- 高效:
-
缺点:
epoll
是 Linux 特有的 I/O 多路复用技术,不具备跨平台性。
-
三种模型对比总结
模型 | 文件描述符数量限制 | 数据复制开销 | 事件遍历效率 | 跨平台性 |
---|---|---|---|---|
select | 有(通常为 1024) | 每次调用都需复制 | 低(需遍历所有描述符) | 好 |
poll | 无 | 每次调用都需复制 | 低(需遍历所有描述符) | 较好 |
epoll | 无 | 少量复制(只需添加或删除描述符时) | 高(直接返回就绪描述符) |