select在一个进程中打开的最大fd是有限制的,由FD_SETSIZE设置,默认值是2048。不过 epoll则没有这个限制,它所支持的fd上限是最大能够打开文件的数目,这个数字通常远大于2048,通常来讲内存越大,fd上限越大,1G内存都能达到大约10w左右。进程
select的轮询机制是系统会去查找每一个fd是否数据已准备好,当fd不少的时候,效率固然就直线降低了,epoll采用基于事件的通知方式,一旦某个fd数据就绪时,内核会采用相似callback的回调机制,迅速激活这个文件描述符,而不须要不断的去轮询查找就绪的描述符,这就是epool高效最本质的缘由。事件
不管是select仍是epoll都须要内核把FD消息通知给用户空间,如何避免没必要要的内存拷贝就很重要,在这点上,epoll是经过内核于用户空间mmap同一块内存实现的,而select则作了没必要要的拷贝内存