select比epoll效率差的原因:select是輪詢,epoll是觸發式的,所以效率高。
Select:
1.Socket數量限制:該模式可操作的Socket數由FD_SETSIZE決定,內核默認32*32=1024.
2.操作限制:通過遍歷FD_SETSIZE(1024)個Socket來完成調度,不管哪個Socket是活躍的,都遍歷一遍.
Poll:
1.Socket數量幾乎無限制:該模式下的Socket對應的fd列表由一個數組來保存,大小不限(默認4k).
2.操作限制:同Select.
Epoll:
1.Socket數量無限制:同Poll
2.操作無限制:基於內核提供的反射模式,有活躍Socket時,內核訪問該Socket的callback,不需要遍歷輪詢.但是當所有Socket都活躍的時候,這時候所有的callback都被喚醒,會導致資源的競爭.既然都是要處理所有的Socket,那麼遍歷是最簡單最有效的實現方式.
而在java NIO中主要是有selector觸發調用系統函數而實現這種多路複用機制