select,poll,epoll这三个函数是服务器端开发必须要精通的函数,而且也是面试中常会问到的知识。
其中select和poll的功能比较相似,而epoll是linux所特有的,是linux对poll的改进版。以下是这三个函数的主要特点:
select:
1.select对每个所监视的描述符进行轮循,当描述符增加时,select的效率就会下降;
2.select所能监视的描述符是有上限的
3.在用户态和内核态之间传送文件描述符集的数据结构的开销是比较大的。
poll:
1.与select的第一点相同;
2.监视的描述符没有最大限制,因为使用的是链表的方式
3.与select的第三点大致相同,但poll传递的是数组。
4.poll使用的是“水平触发方式”,
epoll:
1.没有select/poll的第一个问题,因为可以采用“边沿触发方式”
2.有限制,但是上限值是相当大的
3.使用mmap实现内存共享,复制开销比较小。
水平触发和边沿触发方式。
水平触发方式:如果报告的描述符未被处理,下次将重新被报告。
边沿触发方式:只报告发生变化的描述符,而且只报告一次。
但是并不是说epoll就没有缺点,它的缺点是代码复杂,开销大。
参考:
http://blog.csdn.net/sunboy_2050/article/details/5971779
http://blog.sina.com.cn/s/blog_8fa7dd41010153zx.html 这个用表的形式进行了总结。