1. 程式人生 > >為什麼epoll比select和poll更高效

為什麼epoll比select和poll更高效

執行epoll_create()函式會在核心建立一顆紅黑樹rb_node以及就緒連結串列rdllist(存放已經就緒的檔案描述符),監聽的檔案描述符數為系統可以開啟的最大檔案描述符數(65535)。接著使用者執行的epoll_ctl()函式將epoll_event結構體拷貝傳入核心,核心會在紅黑樹上新增相應的結點,並註冊回撥函式ep_poll_callback(),核心在檢測到某檔案描述符可讀/可寫時就呼叫回撥函式callback,該回調函式將檔案描述符放入就緒連結串列rdllist中。epoll_wait()函式只需要觀察rdllist中有無就緒的檔案描述符即可,核心將就緒的檔案描述符事件複製到傳入的poll_event結構體陣列中返回給使用者空間,所以使用者只用遍歷依次處理即可,即應用程式索引就緒檔案描述符的時間複雜度是O(1)。這裡返回的檔案描述符是通過mmap讓核心和使用者空間共享同一塊記憶體傳遞的,減少了不必要的拷貝。再次呼叫epoll系統呼叫,不用重建紅黑樹,直接沿用已經存在的即可。epoll支援ET模式,當核心將該事件通知給使用者後,使用者必須立即處理,這樣就減少了可讀、可寫和異常事件被觸發的次數。