改變事件flag(比如從READ到WRITE)需要一個epoll_ctl系統(tǒng)調(diào)用棘劣,如果使用poll,只需在用戶空間的一個簡單的bitmask操作赃梧。epoll將5000個socket從讀切換到寫則需要5000個系統(tǒng)調(diào)用和上下文切換(直到2014年,epoll_ctl還沒辦法做到批處理,每個描述符需要單個切換)鳖链。但是poll只需要在一個pollfd結(jié)構(gòu)中進行循環(huán)
當一個accepted socket需要被加到set中,epoll同樣需要一個epoll_ctl,這就意味著每個新的連接socket都需要兩次系統(tǒng)調(diào)用(poll是一次)。如果我們的服務(wù)有很多短期的連接境蔼,并且只有很少的數(shù)據(jù)傳輸,epoll很可能可能需要更多時間進行響應(yīng)
epoll是Linux專有伺通,其他平臺有相似機制箍土,但是也不盡相同。比如邊沿觸發(fā)機制
高性能的處理邏輯更為復(fù)雜罐监,而且更難調(diào)試吴藻,尤其是邊沿觸發(fā)更容易出現(xiàn)死鎖