epoll

windows走IOCP已經與我無緣了windows

Linux 則是epoll、select/poll函數

epoll_create建立一個epoll文件描述符,底層是一個紅黑樹和一個就緒鏈表索引

紅黑樹存儲文件描述符節點數據  就緒鏈表存儲就緒的文件描述符節點數據隊列

epoll_ctl添加新的描述符,先判斷紅黑樹有沒有這個文件描述符節點事件

有->返回回調函數

沒有->紅黑樹插入新節點,通知內核註冊回調函數it

當接收到某個文件描述符傳入數據,內核把該節點插入到就緒鏈表event

epoll_wait收到消息,數據拷貝到用戶空間,清空鏈表table

LT模式 電平模式效率

epoll_wait檢查到文件描述符其上有事件發生並通知應用程序後,應用程序能夠不馬上處理

這樣應用程序下一次調用epoll_wait的時候,epoll_wait還會通知應用程序,直到被處理

在清空就緒鏈表後檢查文件描述符是哪一種模式,若是是LT && 該節點有事件未處理

則把該節點從新放入就緒鏈表,epoll_wait返回

ET模式 邊沿觸發

epoll_wait檢查到文件描述符其上有事件發生並通知應用程序後,應用程序必須馬上處理

不檢查

ET很大程度上下降了同一個epoll事件被重複觸發的次數

 

select、poll、epoll區別

epoll檢測到就緒的文件描述符後,觸發回調函數,回調函數將該文件描述符上對應的時間插入內核就緒事件隊列,再把器內容拷貝到用戶空間

系統調用 select poll epoll
事件集合 經過3個參數分別傳入感興趣的可讀、可寫、異常等事件,內核經過對這些參數的在校修改反饋其中的就緒事件。每次調用selecet都要重置這3個參數 統一處理全部事件類型,只需傳入一個事件集合參數。再經過pollfd.events傳入感興趣事件,內核經過修改pollfd.revents反饋其中就緒事件 內核經過管理一個事件表直接管理用戶感興趣的全部事件。每次調用epoll_wait的時候無需反覆傳入用戶感興趣事件。epoll_wait系統調用參數events僅僅用來反饋就緒的事件
應用程序索引文件描述符時間複雜度 O(n) O(n) O(1)
最大支持文件描述符數 通常有最大限制值 65535 65535
工做模式 LT LT LT/ET
內核實現和工做效率 輪詢方式檢測就緒事件,O(n) 輪詢方式檢測就緒事件,O(n) 採用回調方式檢測就緒事件,O(1)
相關文章
相關標籤/搜索