当前位置: 代码迷 >> 综合 >> select, poll, epoll的选择
  详细解决方案

select, poll, epoll的选择

热度:18   发布时间:2023-12-07 04:42:47.0

 

原贴:http://blog.csdn.net/pmunix/archive/2008/02/25/2120263.aspx

 

select的本质是采用32个整数的32位,即32*32= 1024来标识,fd值为1-1024。当fd的值超过1024限制时,就必须修改FD_SETSIZE的大小。这个时候就可以标识32*max值范围的fd。

对于单进程多线程,每个线程处理多个fd的情况,select是不适合的。

1.所有的线程均是从1-32*max进行扫描,每个线程处理的均是一段fd值,这样做有点浪费

2.1024上限问题,一个处理多个用户的进程,fd值远远大于1024

 

所以这个时候应该采用poll,poll传递的是数组头指针和该数组的长度,只要数组的长度不是很长,性能还是很不错的,因为poll一次在内核中申请4K(一个页的大小来存放fd),尽量控制在4K以内

至于epoll还是poll的一种优化,返回后不需要对所有的fd进行遍历,在内核中维持了fd的列表。select和poll是将这个内核列表维持在用户态,然后传递到内核中。但是只有在2.6的内核才支持。

epoll更适合于处理大量的fd ,且活跃fd不是很多的情况,毕竟fd较多还是一个串行的操作

 

  相关解决方案