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