选择、调查、epoll的区别总结

选择、调查、epoll都是输入输出多路复用的机制,我/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作


但选择、调查,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间


<强>

选择系统调用的用途是:在一段指定时间内,监听用户所感兴趣的文件描述符上的可读、可写和异常事件

1, sizeof (fd_set)=128,说明能监视的描述符的最大值为128 * 8=1024个

2。,当fd很多时性能会下降

3。由于当有事件发生时,选择返回后会修改三个事件集,所以,,当需要监视的fd数量增多时,性能会下降

适用于所监视的文件描述符数量较少的场景


调查系统调用和选择类似,也是在制定时间内轮询一定数量的文件描述符,以测试其中是否有就绪的文件描述符

1,理论上打开fd的数目跟系统内在有关

2。也不用每次都把fd集合从用户区拷贝数据到内核,它使用一个<强>,struct pollfd 结构体来维护每个fd

它本质上是和selece一样的,只是描述fd集合的方式不同,调查使用pollfd结构而不是选择的fd_set结构,其他的都差不多

也适用于所监视文件描述符少的场景


epoll是Linux特有的IO复用函数,被认为性能最好的一种方法,

它和选择、调查在实现和使用上有很大差异:

,1.使用一组函数来完成,而不是单个

,2. 把用户关心的文件描述符上的事件放在内核的一个事件表中,无须向选择、调查那样每次调用都要重复传入文件描述符集或事件集,但epoll需要用一个额外的文件描述符来表示内核中的这个事件表


epoll函数非常简单,有epoll_create, epoll_ctl, epoll_wait3个函数,先使epoll_create创建一个epoll的句柄,再通过epoll_ctl注册事件,然后epoll_wait检测事件的发生

具备了选择所不具备的所有优点

1。没有fd数量的限制,限是最大可以打开文件的数目,具体数目可cat/proc/sys/fs/file-max察看,一般来说这个数目和系统内存关系很大

2。epoll_ctl

, epoll将以等模式来操作该文件描述符

<强>

,这使得应用程序索引就绪文件描述符的时间复杂度达到O (1)。



选择、调查、epoll的区别总结

选择和调查都只能工作在相对低效的LT模式下,而epoll则可以工作在ET高效模式,并且epoll还支持EPOLLONESHOT事件,该事件能进一步减少可读,可写和异常事件被触发的次数。


,因为此时回调函数被触发的过于频繁,因此epoll_wait适用于连接数量多,但活动连接较少的情况。

《完》

选择、调查、epoll的区别总结