select 和poll的區別:
select:
select的觸發方式是水平觸發(lt),應用程式如果沒有完成對乙個已經就緒的檔案描述符進行io操作,那麼之後每次select呼叫還是會將這些檔案描述符通知程序。
建立陣列,儲存描述符
(一次while
要做的事:)
清空集合fd_zero
遍歷陣列,將fd寫入fdset集合中(由於核心對fd_set的修改,應用程式下次呼叫select前需要重置fd_set集合。),迴圈次數由描述符個數決定
將fdset集合傳給select(系統呼叫)---->從使用者空間向核心空間拷貝(select需要複製大量的控制代碼資料結構,產生巨大的開銷);
核心實現是輪詢方式(乙個乙個檢查,檢測那些事件就緒),將其中就緒的描述符返回給應用程式,檢測就緒事件的演算法的時間複雜度為o(n),描述符越多,耗時越長,效能越差
select返回後,需遍歷所有描述符,找到就緒的描述符(fd_isset)
相比select模型,poll使用鍊錶儲存檔案描述符,因此沒有了監視檔案數量的限制
poll:
poll通過把檔案描述符和事件定義在pollfd中,任何事件都被統一處理,從而使得程式設計介面簡潔許多。並且核心每次修改的是pollfd結構體的revents成員,而events成員保持不變,因此下次呼叫poll時無須重置pollfd結構體型別的事件集引數。
不需要每次清空陣列,只要需要動態維護住即可
將陣列傳給poll(系統呼叫)---->從使用者空間向核心空間拷貝
核心實現是輪詢方式(乙個乙個檢查),將其中就緒的描述符返回給應用程式,檢測就緒事件的演算法的時間複雜度為o(n),描述符越長,耗時越長
poll返回後,需遍歷所有描述符,找到就緒的fd
selec
和poll
都只能在相對低效的
lt模式,而
epoll
可以工作在
et高校模式
select和poll都沒有從本質上解決,當描述符數量過多時,效率越低的情況
epoll:
建立乙個核心事件表, 把使用者關心的檔案描述符上的事件都放在核心裡的事件表中,從而無須像select,poll那樣每次呼叫都要重複傳入檔案描述或事件集,但epoll需要使用乙個額外的檔案描述符,來唯一標識核心中建立的這個核心事件表。
select、poll、epoll區別:
I O復用和I O模型
由 unix網路程式設計卷1 總結而來。同時監視多個i o條件,在其中任意乙個就緒時通知程序,這樣的能力稱為i o復用。由select和poll函式支援,較新的還有posix中的pselect函式。linux中還有epoll i o復用應用場合 1 客戶同時處理多個描述符時,必須使用i o復用。2 ...
IO模型 IO多路復用
用socket 一定會用到accept recv recvfrom這些方法 正常情況下 accept recv recvfrom都是阻塞的 如果setblocking false 整個程式就變成乙個非阻塞的程式了非阻塞的特點 沒有併發程式設計的機制 是乙個同步的程式 程式不會在某乙個連線的recv或...
I O多路復用
一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...