1、select poll 每次循环都需要从用户空间向内核中传递数据
epoll 直接在内核空间创建 事件表,每个描述符仅需要传递一次
2、select poll 在内核中以轮询的方式检测有就绪事件的描述符O(n)
epoll 在每个描述符上注册回调函数,事件就绪后,执行回调函数将描述符添加到就绪队列了O(1)
3、select poll 返回后,需要遍历所有文件描述符,才能找到就绪的,O(n)
epoll 返回后,直接得到就绪描述符,不需要遍历所有描述符O(1)
https://blog.youkuaiyun.com/davidsguo008/article/details/73556811
https://www.cnblogs.com/zhaodahai/p/6831456.html
epoll有EPOLLLT和EPOLLET两种触发模式,LT是默认的模式,ET是“高速”模式。LT模式下,只要这个fd还有数据可读,每次 epoll_wait都会返回它的事件,提醒用户程序去操作,而在ET(边缘触发)模式中,它只会提示一次,直到下次再有数据流入之前都不会再提示了,无 论fd中是否还有数据可读。所以在ET模式下,read一个fd的时候一定要把它的buffer读光,也就是说一直读到read的返回值小于请求值,或者 遇到EAGAIN错误。还有一个特点是,epoll使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知。
epoll LT ET区别?
LT模式:描述符事件就绪后,如果用户没有处理完数据,epoll会继续提醒,直到处理完。
ET模式(高校模式):描述符上时间就绪后,无论用户有没有处理完数据,epoll都只提醒一次。
ET模式下,描述符必须使用非阻塞模式。
Fcntl()可以设置非阻塞。