文章目录
  1. 事件集
  2. 最大支持文件描述符数
  3. 工作模式
  4. 具体实现
  5. 小结

事件集

select的事件集由3个fd_set数组指定;fd_set数组在调用select时传入,select调用返回后被内核修改。

poll的事件集由pollfd结构体数组指定,它绑定了文件描述符与事件;pollfd结构体的event成员传入网络程序关注的事件,poll调用返回后修改pollfd结构体的revent成员。

epoll的事件通过epoll_ctl函数进行添加、修改与删除,epoll_wait调用返回的事件存入event数组。

最大支持文件描述符数

poll与epoll_wait函数最多可监听65535个文件描述符;而select最多可监听1024个文件描述符。

工作模式

select与poll只能工作在相对低效的LT模式;而epoll则可以工作在ET高效模式,且epoll还支持EPOLLONESHOT事件,该事件可进一步减少可读/可写/异常事件被触发的次数。

具体实现

select与poll均采用轮询的实现方式,每次调用都要扫描整个注册文件描述符集合;

而epoll_wait采用回调的方式,内核检测到就绪的文件描述符后触发回调函数,回调函数将该文件描述符上对应事件插入内核就绪事件队列,内核最后在合适的时机将该就绪事件队列中的内容拷贝到用户空间。

然而,在活动连接较多时,epoll_wait将会频繁触发回调函数,此时epoll_wait的效率不一定比select/poll高。可见epoll_wait适用于连接数量多,但活动连接少的情形。

小结

这3组I/O复用系统调用的区别如下表总结。