epoll和libevent

epoll

epoll是Linux內核爲處理大批量文件描述符而作了改進的poll,是Linux下多路複用IO接口select/poll的增強版本,它能顯著提高程序在大量併發連接中只有少量活躍的情況下的系統CPU利用率。另一點原因就是獲取事件的時候,它無須遍歷整個被偵聽的描述符集,只要遍歷那些被內核IO事件異步喚醒而加入Ready隊列的描述符集合就行了。epoll既可以採用水平觸發,也可以採用邊緣觸發,這就使得用戶空間程序有可能緩存IO狀態,減少epoll_wait/epoll_pwait的調用,提高應用程序效率。

文件描述符:非負整數,用於內核訪問文件。打開或新建文件,內核會返回一個文件描述符,用於讀寫文件。它相當於一個索引值,標準輸入(standard input)的文件描述符是 0,標準輸出(standard output)是 1,標準錯誤(standard error)是 2,POSIX 定義了 STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO 來代替 0、1、2。這三個符號常量的定義位於頭文件 unistd.h。文件描述符只適用於UNIX、Linux這樣的操作系統。在Windows操作系統上,文件描述符被稱作文件句柄。在Windows2000服務器上,打開文件的句柄極限設置爲16,384。

poll:Linux中的字符設備驅動中的一個函數。Linux 2.5.44版本後,poll被epoll取代。和select實現的功能差不多,poll的作用是把當前的文件指針掛到等待隊列。

select:一個計算機函數,位於頭文件#include <sys/select.h> 。該函數用於監視文件描述符的變化情況——讀寫或是異常。

水平觸發:如果文件描述符已經就緒可以非阻塞的執行IO操作了,此時會觸發通知。允許在任意時刻重複檢測IO的狀態,沒有必要每次描述符就緒後儘可能多的執行IO。select,poll就屬於水平觸發。

邊緣觸發:如果文件描述符自上次狀態改變後有新的IO活動到來,此時會觸發通知。在收到一個IO事件通知後要儘可能多的執行IO操作,因爲如果在一次通知中沒有執行完IO那麼就需要等到下一次新的IO活動到來才能獲取到就緒的描述符。信號驅動式IO就屬於邊緣觸發。

libevent

用C語言編寫的、輕量級的開源高性能事件通知庫,適用於windows、linux、bsd等多種平臺,內部使用select、epoll、kqueue、IOCP等系統調用管理事件機制。

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