select poll epoll

一、使用方面:
  1 select函數通過三個fd_set結構體變量分別給內核傳遞用戶關注的所有可讀、可寫、異常事件,這使得select不能、
     處理更多的事件類型,並且內核也通過這三個結構體變量返回就緒的文件描述符,所以每次使用之前,都必須重新
     設置這三個結構體變量。

 2  poll函數將用戶關注的文件描述符以及其關注的事件、內核返回的文件描述符上發生的事件分離開表示,並且通過
     一個用戶數組將所有的文件描述符傳遞給內核。因此,poll函數能關注的事件類型更多,每次調用也不需要重新
     設置。

 3epoll是通過一組函數來完成的,epoll通過epoll_create創建一個內核事件表,通過epoll_ctl函數添加、刪除、
     修改事件。epoll_wait只需要從內核事件表中讀取用戶的註冊的事件。

二、使用限制:
  select所使用的fd_set結構實際上是一個整形數組,32bit系統上關注的文件描述符最多1024個,最大文件描述符
    數1023.
  poll和epoll分別用nfds和maxevents參數指定最多監聽多少個文件描述符,這兩個數值都能達到系統允許打開的
    最大文件描述符數。

三、使用效率:
   1、select、poll每次調用都需要將用戶空間的文件描述符拷貝到內核空間,epoll則只需要拷貝一次。效率更高。
   2、select、poll每次都將所有的文件描述符(就緒的和未就緒的)返回,所以應用程序檢索就緒文件描述符的時間
       複雜度爲O(n),epoll通過events參數返回所有就緒的文件描述符,應用程序檢索就緒文件描述符的時間複雜度爲
       O(1)。
   3、 select、poll只能工作在效率較低的LT模式,而epoll則能工作在ET高效模式,並且epoll還支持EPOLLONESHOT
	事件,從而進一步減少事件被觸發的次數。
四、內核效率:
    select和poll採用輪詢的方式:即每次都需要掃描整個註冊的文件描述符集合,並將其中就緒的文件描述符返回給
    用戶程序,因此,內核中檢測就緒文件描述符的算法時間複雜度爲O(n), epoll則採取回調的方式,內核檢測到就
    緒文件描述符,就觸發回調函數,將文件描述符及發生的事件插入內核就緒事件隊列,因此,epoll在內核中檢測就
    緒文件描述符的算法時間複雜度爲O(1)。但是,當鏈接的活動比較頻繁是,select和poll的效率比epoll要高,因爲
    epoll的回調函數調用過去頻繁,所以,epoll適用於鏈接較多,但是活動不頻繁的情況。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章