一、epoll、poll、select的區別
1、內核支持
select是最古老的多路復用機制,它早于Linux的內核版本2.0,已經成為了Unix網絡編程中經典的多路復用機制。poll是在Linux內核2.1.15中引入的一種多路復用機制,它比select更加高效。而epoll是在Linux內核2.5.44中引入的一種更加高效的多路復用機制,它是目前最常用的多路復用機制之一。
2、系統調用數量
select和poll在使用時,每次都需要將所有待監視的文件描述符從用戶空間復制到內核空間,而epoll使用了事件驅動的方式,將只有活躍的文件描述符加入到內核事件表中。因此,在處理大量文件描述符時,epoll比select和poll更快,能夠提供更高的并發性和更好的性能。
3、文件描述符數量
select和poll在處理大量的文件描述符時,隨著文件描述符數量的增加,性能會呈現出線性下降的趨勢。而epoll能夠高效地處理大量的文件描述符,并且在文件描述符數量很大時,性能損失很小。
4、數據結構
select和poll將所有待監視的文件描述符保存在一個數據結構中,而epoll將文件描述符分散到不同的事件集合中。因此,在處理大量文件描述符時,epoll的效率比select和poll更高。
5、觸發模式
select和poll是水平觸發(level-triggered)模式,即當文件描述符可讀可寫時,每次調用select或poll都會通知應用程序。而epoll支持水平觸發和邊緣觸發(edge-triggered)兩種模式,邊緣觸發只會通知應用程序一次,直到下一次事件發生時才會再次通知。邊緣觸發模式在處理大量的文件描述符時,能夠提高效率。