监听文件描述符的状态来进行相应的读写操作,3个函数:
1 | select |
1 | int (int nfds, fd_set *readfds, fd_set *writefds, |
select
将监听的读、写、except三类文件描述符分开传入,且nfds最大支持1024个。
poll
类似于select,只不过将这3类文件描述符放到一个数组中了,同时fds没有最大限制。
select
poll
需要逐个轮询每个fd的状态,且每个fd的用户空间数据需要独立copy(内核代码: do_sys_poll
-> copy_from_user
)。
epoll
是以上2个函数的增强版,nfds没有最大限制,理论上跟系统支持的最大文件描述符个数相等,所有fd的用户空间数据一次拷贝完成,且不用轮询每个fd的状态,而是通过注册回调的方式,效率明显提高。
各种I/O阻塞时间比较:
参考:
Linux I/O详解