简介
epoll是Linux内核的系统调用,实现了可扩展的I/O事件通知机制。最早在Linux内核2.5.44出现,在版本2.6.2得到完善,代替了原来的select和poll系统调用。
epoll在被监视的文件描述符数量很大的时候具有更好的性能表现,时间复杂度为O(1),而原来的是O(n)。select使用的是线性搜索一个被监控的文件描述符列表,这导致了它的复杂度为O(n)。而epoll使用了内核文件结构体中的回调函数。
类似于epoll,FreeBSD里有kqueue,它可以控制内核暴露到用户空间的一个可配置内核对象。
API
- epoll_create1函数
- 创建一个epoll对象,并返回它的文件描述符
- epoll_ctl函数
- 控制epoll对象监视的文件描述符,可以添加、修改和删除想监视的事件类型
- epoll_wait函数
- 等待被注册的事件发生或者超时,返回发生的事件类型int值
触发模式
类似于电路的触发方式,有两种:边沿触发(edge-triggered)和电平触发(level-triggered)。
在电平触发模式,后续的epoll_wait调用会立即返回。
使用边沿触发,内核不需要跟踪文件描述符的状态信息
应用并发模型
三个部分
- Listener监听者:监听端口并接受请求,建立连接后把连接socket发送给I/O-worker(s)
- I/O-worker(s):一个或多个线程接受监听者发过来的连接,并添加到epoll
- Data Processing Worker(s):一个或多个线程接收并发送数据到 I/O-workers,并在中间对数据进行处理。就是我们应用的逻辑部分。