select支持的文件描述符数量过小了,默认是1024。html
epoll没有这个限制,它所支持的FD上限是最大能够打开文件的数目,这个数字通常远大于2048,举个例子,在1GB内存的机器上大约是10万左右,具体数目能够cat /proc/sys/fs/file-max察看,通常来讲这个数目和系统内存关系很大。socket
epoll的解决方案不像select或poll同样每次都把current轮流加入fd对应的设备等待队列中,而只在epoll_ctl时把current挂一遍(这一遍必不可少)并为每一个fd指定一个回调函数,当设备就绪,唤醒等待队列上的等待者时,就会调用这个回调函数,而这个回调函数会把就绪的fd加入一个就绪链表)函数
http://www.cnblogs.com/Anker/p/3265058.htmlspa
select:上世纪 80 年代就实现了,它支持注册 FD_SETSIZE(1024) 个 socket,在那个年代确定是够用的,不过如今嘛,确定是不行了。htm
poll:1997 年,出现了 poll 做为 select 的替代者,最大的区别就是,poll 再也不限制 socket 数量。blog
select 和 poll 都有一个共同的问题,那就是它们都只会告诉你有几个通道准备好了,可是不会告诉你具体是哪几个通道。因此,一旦知道有通道准备好之后,本身仍是须要进行一次扫描,显然这个不太好,通道少的时候还行,一旦通道的数量是几十万个以上的时候,扫描一次的时间都很可观了,时间复杂度 O(n)。因此,后来才催生了如下实现。队列
epoll:2002 年随 Linux 内核 2.5.44 发布,epoll 能直接返回具体的准备好的通道,时间复杂度 O(1)。内存
https://mp.weixin.qq.com/s/lZGL6Tpb2Lpd3EvqnB-0ig回调函数