了解epoll

已发布 2017-09-07 09:48:39

简介

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,并在中间对数据进行处理。就是我们应用的逻辑部分。
comments powered by Disqus