亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

select、poll與epoll的優缺點

發布時間:2020-06-07 23:23:46 來源:網絡 閱讀:838 作者:LOVEMERIGHT 欄目:網絡安全

1、select

select本質上是通過設置或者檢查存放fd標志位的數據結構來進行下一步處理。


缺點:

1) 單個進程可監視的fd數量被限制。

2) 需要維護一個用來存放大量fd的數據結構,這樣會使得用戶空間和內核空間在傳遞該結構時復制開銷大。

3) 對fd進行掃描時是線性掃描。fd劇增后,IO效率較低,因為每次調用都對fd進行線性掃描遍歷,所以隨著fd的增加會造成遍歷速度慢的性能問題

4)select() 函數的超時參數在返回時也是未定義的,考慮到可移植性,每次在超時之后在下一次進入到select之前都需要重新設置超時參數。


優點:

1)select()的可移植性更好,在某些Unix系統上不支持poll()

2)select() 對于超時值提供了更好的精度:微秒,而poll是毫秒。


2、poll

poll本質上和select沒有區別,它將用戶傳入的數組拷貝到內核空間,然后查詢每個fd對應的設備狀態,如果設備就緒則在設備等待隊列中加入一項并繼續遍歷,如果遍歷完所有fd后沒有發現就緒設備,則掛起當前進程,直到設備就緒或者主動超時,被喚醒后它又要再次遍歷fd。這個過程經歷了多次無謂的遍歷。poll還有一個特點是“水平觸發”,如果報告了fd后,沒有被處理,那么下次poll時會再次報告該fd。


缺點:

1)大量的fd的數組被整體復制于用戶態和內核地址空間之間,而不管這樣的復制是不是有意義。

2)與select一樣,poll返回后,需要輪詢pollfd來獲取就緒的描述符


優點:

1)poll() 不要求開發者計算最大文件描述符加一的大小。

2)poll() 在應付大數目的文件描述符的時候速度更快,相比于select。

3)它沒有最大連接數的限制,原因是它是基于鏈表來存儲的。


3、epoll

epoll支持水平觸發和邊緣觸發,最大的特點在于邊緣觸發,它只告訴進程哪些fd剛剛變為就需態,并且只會通知一次。還有一個特點是,epoll使用“事件”的就緒通知方式,通過epoll_ctl注冊fd,一旦該fd就緒,內核就會采用類似callback的回調機制來激活該fd,epoll_wait便可以收到通知。


優點:

1)支持一個進程打開大數目的socket描述符(FD)

select最不能忍受的是一個進程所打開的FD是有一定限制的,由FD_SETSIZE設置,默認值是1024/2048。對于那些需要支持的上萬連接數目的IM服務器來說顯然太少了。這時候你一是可以選擇修改這個宏然后重新編譯內核。不過 epoll則沒有這個限制,它所支持的FD上限是最大可以打開文件的數目,這個數字一般遠大于2048,舉個例子,在1GB內存的機器上大約是10萬左右,具體數目可以cat /proc/sys/fs/file-max察看,一般來說這個數目和系統內存關系很大。


2)IO效率不隨FD數目增加而線性下降

傳統的select/poll另一個致命弱點就是當你擁有一個很大的socket集合,不過由于網絡延時,任一時間只有部分的socket是"活躍"的,但是select/poll每次調用都會線性掃描全部的集合,導致效率呈現線性下降。但是epoll不存在這個問題,它只會對"活躍"的socket進行操作---這是因為在內核實現中epoll是根據每個fd上面的callback函數實現的。那么,只有"活躍"的socket才會主動的去調用 callback函數,其他idle狀態socket則不會,在這點上,epoll實現了一個"偽"AIO,因為這時候推動力在Linux內核。


3)使用mmap加速內核與用戶空間的消息傳遞。

這點實際上涉及到epoll的具體實現了。無論是select,poll還是epoll都需要內核把FD消息通知給用戶空間,如何避免不必要的內存拷貝就很重要,在這點上,epoll是通過內核與用戶空間mmap同一塊內存實現的。


4、三者的比較

select、poll與epoll的優缺點



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

醴陵市| 德化县| 崇明县| 谷城县| 比如县| 九江市| 富阳市| 铜陵市| 四子王旗| 旅游| 邻水| 凌海市| 息烽县| 兖州市| 浙江省| 安龙县| 扎兰屯市| 县级市| 平遥县| 濮阳县| 叶城县| 翼城县| 松溪县| 庐江县| 许昌市| 湛江市| 台山市| 鹰潭市| 肇州县| 扎兰屯市| 繁昌县| 察哈| 喜德县| 桐柏县| 遵化市| 宁城县| 英超| 双流县| 东山县| 申扎县| 建德市|