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回調函數