三種I/O複用的比較

相同點:

1.select、poll、epoll這三組I/O複用系統調用都能同時監聽多個文件描述符,
2。他們都通過timeout參數指定要等待的時間。直到事件就緒時返回
3.返回值就是就緒的文件描述符的數量。

不同點:

epoll高效的原因:

1>、底層採用回調機制激活某個節點,將已經就緒的文件描述符添加到就緒隊列中去;

2>、當有新的事件發生的時候,該結點會被插入到epoll模型中的紅黑樹中去,紅黑樹增刪查改效率比較高,它的時間複雜度爲O(N*lgN);

3>、epoll_wait獲得就緒的文件描述符是從就緒隊列中獲得的,它的時間複雜度爲O(1),這也是epoll的時間複雜度同時也是epoll高效的原因;

4>、epoll所關心的文件描述符是無上限的;

5>、將就緒隊列中的數據結點映射到epoll_wait的events結構體中,節省了一次內核態至用戶態的拷貝,這是mmap技術(內存映射技術);

6>、就緒事件的陳列方式不同,epoll訪問的是就緒隊列避免了訪問無價值的數據,而select是訪問的是一個數組;

7>.epoll有兩種工作模式:ET和LT模式,可以避免阻塞帶來的性能影響

另外:

select的參數沒有將文件描述符和事件綁定,他僅僅是一個文件描述符的集合(表示是否),所以select需要分別用三個參數來區分傳入的可讀,可寫及異常事件,這不僅限制了select只能處理這三種事件,另外由於內核對fd_set集合的在線修改,所以下次再調用select之前還需要重置這3個文件描述符集合。

poll將文件描述符和事件都定義在pollfd結構體中,使得任何事件都能被統一處理,而且pollfd將監測事件和就緒事件分開了,保證events不被改變,因此pollfd不需要重置pllfd結構中的events成員。但是因爲select和poll返回的都是整個事件集合,所以他們查找就緒事件的文件描述符的效率都是O(n)。

epoll在內核中維護了一個事件表,而且還提供一個函數epoll_ctl來向事件表中添加、刪除、修改事件,所以它無須每次都重置事件。因爲epoll返回的都是就緒事件,所以epoll查找就緒事件的文件描述符的時間複雜度都是O(1)。

與多進程/多線程服務器進行對比 它的優點在於:
1)不需要建立多個線程、進程就可以實現一對多的通信。
2)可以同時等待多個文件描述符,效率比起多進程多線程來說要高很多。
3)select()的可移植性更好,在某些Unix系統上不支持poll()
4)select() 對於超時值提供了更好的精度:微秒,而poll是毫秒

與多進程/多線程服務器進行對比 它的缺點在於:

1)每次調用select,都需要把fd集合從用戶態拷貝到內核態,這個開銷在fd很多時會很大 ,循環次數有點多;
2)同時每次調用select都需要在內核遍歷傳遞進來的所有fd,這個開銷在fd很多時也很大 。
3)select支持的文件描述符數量太小了,默認是1024;

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