91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

IO多路復用--select、 poll、 epoll的區別

發布時間:2020-07-10 04:48:51 來源:網絡 閱讀:270 作者:小鎮青苔 欄目:網絡安全

select,poll,epoll都是IO多路復用的機制。I/O多路復用就通過一種機制,可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程序進行相應的讀寫操作。

IO多路復用適用如下場合:

(1)當客戶處理多個描述字時(一般是交互式輸入和網絡套接口),必須使用I/O復用。

(2)當一個客戶同時處理多個套接口時,而這種情況是可能的,但很少出現。

(3)如果一個TCP服務器既要處理監聽套接口,又要處理已連接套接口,一般也要用到I/O復用。

(4)如果一個服務器即要處理TCP,又要處理UDP,一般要使用I/O復用。

(5)如果一個服務器要處理多個服務或多個協議,一般要使用I/O復用。

與多進程和多線程技術相比,I/O多路復用技術的最大優勢是系統開銷小,系統不必創建進程/線程,也不必維護這些進程/線程,從而大大減小了系統的開銷。

select:

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

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

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

3 對socket進行掃描時是線性掃描

poll

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

它沒有最大連接數的限制,原因是它是基于鏈表來存儲的,但是同樣有一個缺點:大量的fd的數組被整體復制于用戶態和內核地址空間之間,而不管這樣的復制是不是有意義。

poll還有一個特點是“水平觸發”,如果報告了fd后,沒有被處理,那么下次poll時會再次報告該fd。

epoll

epoll既然是對select和poll的改進,避免了上述的三個缺點。

epoll支持水平觸發和邊緣觸發,最大的特點在于邊緣觸發,它只告訴進程哪些fd剛剛變為就需態,并且只會通知一次。

在前面說到的復制問題上,epoll使用mmap減少復制開銷。

還有一個特點是,epoll使用“事件”的就緒通知方式,通過epoll_ctl注冊fd,一旦該fd就緒,內核就會采用類似callback的回調機制來激活該fd,epoll_wait便可以收到通知


區別:


Selectpollepoll
支持最大連接數1024(x86) or 2048(x64)無上限無上限
IO效率每次調用進行線性遍歷,時間復雜度為O(N)每次調用進行線性遍歷,時間復雜度為O(N)使用“事件”通知方式,每當fd就緒,系統注冊的回調函數就會被調用,將就緒fd放到rdllist里面,這樣epoll_wait返回的時候我們就拿到了就緒的fd。時間發復雜度O(1)
fd拷貝每次select都拷貝每次poll都拷貝調用epoll_ctl時拷貝進內核并由內核保存,之后每次epoll_wait不拷貝

總結:

(1)select,poll實現需要自己不斷輪詢所有fd集合,直到設備就緒,期間可能要睡眠和喚醒多次交替。而epoll其實也需要調用epoll_wait不斷輪詢就緒鏈表,期間也可能多次睡眠和喚醒交替,但是它是設備就緒時,調用回調函數,把就緒fd放入就緒鏈表中,并喚醒在epoll_wait中進入睡眠的進程。雖然都要睡眠和交替,但是select和poll在“醒著”的時候要遍歷整個fd集合,而epoll在“醒著”的時候只要判斷一下就緒鏈表是否為空就行了,這節省了大量的CPU時間。這就是回調機制帶來的性能提升。

(2)select,poll每次調用都要把fd集合從用戶態往內核態拷貝一次,并且要把current往設備等待隊列中掛一次,而epoll只要一次拷貝,而且把current往等待隊列上掛也只掛一次(在epoll_wait的開始,注意這里的等待隊列并不是設備等待隊列,只是一個epoll內部定義的等待隊列)。這也能節省不少的開銷。


向AI問一下細節

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

AI

阿坝县| 塔城市| 和田县| 垦利县| 甘谷县| 宁陕县| 玛多县| 高陵县| 读书| 清苑县| 定州市| 边坝县| 怀远县| 姜堰市| 兰州市| 新源县| 通城县| 专栏| 苍溪县| 嵊州市| 元谋县| 重庆市| 凌云县| 南丰县| 瓮安县| 北安市| 尤溪县| 额敏县| 新巴尔虎左旗| 乐安县| 政和县| 宜州市| 获嘉县| 勐海县| 新龙县| 桑植县| 宝丰县| 图们市| 霍邱县| 曲阳县| 和硕县|