select在一個進程中打開的最大fd是有限制的,由FD_SETSIZE設置,默認值是2048。不過 epoll則沒有這個限制,它所支持的fd上限是最大能夠打開文件的數目,這個數字通常遠大於2048,通常來講內存越大,fd上限越大,1G內存都能達到大約10w左右。進程
select的輪詢機制是系統會去查找每一個fd是否數據已準備好,當fd不少的時候,效率固然就直線降低了,epoll採用基於事件的通知方式,一旦某個fd數據就緒時,內核會採用相似callback的回調機制,迅速激活這個文件描述符,而不須要不斷的去輪詢查找就緒的描述符,這就是epool高效最本質的緣由。事件
不管是select仍是epoll都須要內核把FD消息通知給用戶空間,如何避免沒必要要的內存拷貝就很重要,在這點上,epoll是經過內核於用戶空間mmap同一塊內存實現的,而select則作了沒必要要的拷貝內存