I/O多路复用三胞胎

select

在这里插入图片描述
时间复杂度O(n)
特点
可监控的文件描述符个数取决与sizeof(fd_set)的值. 我这边服务器上sizeof(fd_set)=512,每bit表示一个文件描述符,则我服务器上支持的最大文件描述符是512*8=4096.
将fd加入select监控集的同时,还要再使用一个数据结构array保存放到select监控集中的fd,

 一、是用于再select 返回后,array作为源数据和fd_set进行FD_ISSET判断。

二、是select返回后会把以前加入的但并无事件发生的fd清空,则每次开始select前都要重新从array取得fd逐一加入(FD_ZERO最先),扫描array 的同时取得fd 最大值maxfd,用于select 的第一个参数。

缺点
      每次调用select,都需要手动设置fd 集合,从接口使用角度来说也非常不便。
      每次调用select ,都需要把 fd 集合从用户态拷贝到内核态,这个开销在fd 很多时会很大。
      同时每次调用select 都需要在内核遍历传递进来的所有fd,这个开销在fd 很多时也很大。
      select 支持的文件描述符数量太小。

poll

特点
      select调用过程和select类似
      select时间复杂度:O(n)
      select其和select不同的地方:采用链表的方式替换原有fd_set数据结构,而使其没有连接数的限制。

缺点
poll 中监听的文件描述符数目增多时

      和select函数一样,poll返回,需要轮询pollfd来获取就绪的文件描述符。
      每次调用poll 都需要把大量的pollfd 结构从用户态拷贝到内核中。
      同时连接的大量客户端在一时刻可能只有很少的处于就绪状态,因此随着监视的描述符数量的增长,其效率也会线性下降。

epoll

在这里插入图片描述
特点
接口使用方便。虽然拆分成了三个函数,但是反而使用起来更加方便高效,不需要每次循环都设置关注的文件描述符,也做到了输入输出参数分离
数据拷贝轻量。只在合适的时候调用 EPOLL_CTL_ADD将文件描述符结构拷贝到内核中,这个操作并不频繁。
没有数量限制。文件描述符数目无上限。

发布了41 篇原创文章 · 获赞 121 · 访问量 8726

猜你喜欢

转载自blog.csdn.net/famur/article/details/105120211