Linux select/poll和epoll實現機制對比


關於這個話題,網上已經介紹的比較多,這里只是以流程圖形式做一個簡單明了的對比,方便區分。

 

一、select/poll實現機制

特點:

1.select/poll每次都需要重復傳遞全部的監聽fd進來,涉及用戶空間和內核直接的數據拷貝。

2.fd事件回調函數是pollwake,只是將本進程喚醒,本進程需要重新遍歷全部的fd檢查事件,然后保存事件,拷貝到用戶空間,函數返回。

3.每次循環都是對全部的監測的fd進行輪詢檢測,可能發生事件的fd很少,這樣效率很低。

4.當有事件發生,需要返回時,也需要將全部fd的事件進行返回,而其中可能只有很少的fd有事件發生。

5.select/poll返回時,會將該進程從全部監聽的fd的等待隊列里移除掉,這樣就需要select/poll每次都要重新傳入全部監聽的fd,然后重新將本進程掛載到全部的監測fd的等待隊列,大量重復勞動,效率很低。

 

參考鏈接:http://www.cnblogs.com/apprentice89/archive/2013/05/09/3070051.html

 

二、epoll實現機制

特點:

1.每次累加添加,不需要每次傳入全部的監測fd。

2.每個fd只將本進程掛載到自己的等待隊列一次,直到該fd被從epoll移除,不需要重復掛載。

3.fd事件回調函數是ep_epoll_callback,該函數將發生事件的fd加入到epoll專門的就緒隊列rdllist中,同時喚醒本進程。

4.本進程不需要遍歷每一個fd去監測事件是否發生,而只需要判斷epoll中的就緒隊列rdllist是否為空即可。

5.epoll返回時,只返回就緒隊列rdllist中的項,避免了無關項的操作,應用層也就不需要再次重復遍歷。

6.epoll內部使用紅黑樹存儲監測fd,支持大量fd的快速查詢、修改和刪除操作。

 

epoll與select/poll機制的相同點:

1.主要監測流程是一樣的,都需要將當前進程掛載到對應fd的隊列中去。如果fd有事件發生,調用掛載的回調函數,該回調函數基本的作用是喚醒本進程。

2.主事件檢測循環是一樣的,循環檢測是否有事件發生,有則處理事件后返回;沒有則調用schedule_timeout睡眠一會。不同的是,select/poll直接檢測每個fd,而epoll只需檢測就緒隊列rdllist是否有數據即可。

 

epoll針對select/poll的痛點進行的修改,也就是高效之處總結:

1. select/poll把fd的監聽列表放在用戶空間,由用戶空間管理,導致在用戶空間和內核空間之間頻繁重復拷貝大量fd;epoll在內核建立fd監聽列表(實際是紅黑樹),每次通過epoll_ctl增刪改即可。

2. select/poll每當有fd內核事件時,都喚醒當前進程,然后遍歷監聽列表全部fd,檢查所有就緒fd並返回;epoll在有fd內核事件時,通過回調把該fd放到就緒隊列中,只需返回該就緒隊列即可,不需要每次遍歷全部監聽fd。

 

參考鏈接:http://www.cnblogs.com/apprentice89/p/3234677.html

 

注:引用本人文章請注明出處,謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM