select,poll,epoll区别面试常问
select,poll,epoll區別:
select優點
1)select()的可移植性更好,在某些Unix系統上不支持poll()
2)select() 對于超時值提供了更好的精度:微秒,而poll是毫秒。
?
select缺點
1) 單個進程可監視的fd數量被限制。
2) 需要維護一個用來存放大量fd的數據結構,這樣會使得用戶空間和內核空間在傳遞該結構時復制開銷大。
3) 對fd進行掃描時是線性掃描。fd劇增后,IO效率較低,因為每次調用都對fd進行線性掃描遍歷,所以隨著fd的增加會造成遍歷速度慢的性能問題
4)select() 函數的超時參數在返回時也是未定義的,考慮到可移植性,每次在超時之后在下一次進入到select之前都需要重新設置超時參數。
poll
poll與select不同,通過一個pollfd數組向內核傳遞需要關注的事件,故沒有描述符個數的限制,
pollfd中的events字段和revents分別用于標示關注的事件和發生的事件,故pollfd數組只需要被初始化一次。
poll的實現機制與select類似,其對應內核中的sys_poll,只不過poll向內核傳遞pollfd數組,然后對pollfd中的每個描述符進行poll,相比處理fdset來說,poll效率更高。
poll返回后,需要對pollfd中的每個元素檢查其revents值,來得指事件是否發生。
poll優點
1)poll() 不要求開發者計算最大文件描述符加一的大小。
2)poll() 在應付大數目的文件描述符的時候相比于select速度更快
3)它沒有最大連接數的限制,原因是它是基于鏈表來存儲的。
poll缺點
1)大量的fd的數組被整體復制于用戶態和內核地址空間之間,而不管這樣的復制是不是有意義。
2)與select一樣,poll返回后,需要輪詢pollfd來獲取就緒的描述符
epoll
epoll是Linux下多路復用IO接口select/poll的增強版本。
它能顯著減少程序在大量并發連接中只有少量活躍的情況下的系統CPU利用率,因為它不會復用文件描述符集合來傳遞結果而迫使開發者每次等待事件之前都必須重新準備要被偵聽的文件描述符集合。
另一點原因就是獲取事件的時候,它無須遍歷整個被偵聽的描述符集,只要遍歷那些被內核IO事件異步喚醒而加入Ready隊列的描述符集合就行了。
epoll除了提供select/poll 那種IO事件的電平觸發(Level Triggered)外,還提供了邊沿觸發(Edge Triggered),這就使得用戶空間程序有可能緩存IO狀態,減少epoll_wait/epoll_pwait的調用,提高應用程序效率。
底層實現
epoll在底層實現了自己的高速緩存區,并且建立了一個紅黑樹用于存放socket,另外維護了一個鏈表用來存放準備就緒的事件。
工作過程:
執行epoll_ create時,創建了紅黑樹和就緒鏈表,執行epoll_ ctl時,如果增加socket句柄,則檢查在紅黑樹中是否存在,存在立即返回,不存在則添加到樹干上,然后向內核注冊回調函數,用于當中斷事件來臨時向準備就緒鏈表中插入數據。執行epoll_wait時立刻返回準備就緒鏈表里的數據即可。
epoll優點
1)支持一個進程打開大數目的socket描述符(FD)
2)IO效率不隨FD數目增加而線性下降
3)使用mmap加速內核與用戶空間的消息傳遞。
總結
以上是生活随笔為你收集整理的select,poll,epoll区别面试常问的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tcp三次握手为啥不是4次
- 下一篇: 软中断和硬中断