第五章第四节 三组I/O复用函数的比较
事件集
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复用系统调用的区别如下表总结。