select,poll和epoll的區別

Select就是通過監聽事件寫入到一個32個元素 累計1024位的long數組中(就是fed_sets結構體的內容),用戶加入監聽位,如果有監聽事件發生就會改變位的標誌。但這樣會有兩個缺點,一是監聽的數量被限制在了1024(三種事件:可讀,可寫,異常),而且複雜的位操作,即使提供了多個操作宏,仍會感到編程的繁瑣,還有每次調用select(是每次,進入循環後每次使用select前都要做得事)要重新把監聽的描述符重新加入到相應的監聽方式結構體fed_sets,最多要傳入三種監聽方式的fed_sets。而且如果要加入新的描述符後監聽還要判斷加入的新描述符是否大於nfds,更新nfds。因此是非常複雜的。

poll就是爲了解決select這種不人性化的使用過程。

Poll則是使用了pollfd的結構體,裏面設置爲關注的描述符fd,事件類型events,和關注描述符的事件反饋revents

Event也用按位的標誌來表示事件類型。初始設置好pollfd後,每次調用poll前也不用重新設置監聽的描述符。可以是升級版的poll了。

但是pollselect總體來說都是輪詢式的,也就是說每次調用完pollselect函數後我都要遍歷整個監聽隊列,去尋找監聽事件發生的描述符,這種複雜度是較高的。相當於0(n)

epoll則是回調試的,epoll_event 結構體裏的events成員是事件,data成員下的fd成員爲關注的描述符,一開始先設置一個epoll_event revent[N]的數組,這個數組將來會作爲epoll_wait的參數,接受發生的事件。

epoll的使用,一開始創建一個監聽隊列,epoll_create();

然後將感興趣的事件通過epoll_ctl()加入到監聽隊列。最後通過epoll_wait,得到發生的事件的更新過後的revent,並且epoll_wait返回的值是事件發生的數量,而全部發生的事件又保存在revents中,可以說是epoll的使用複雜度就是0(1),即只處理感興趣的事件,其他的事件直接忽略。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章