epoll中et和lt的区别与实现原理:
epoll有2种工作方式:LT和ET。简单说:
水平触发:不断查询是否有可用的文件描述符,有的话,内核触发事件,如果数据没有处理完,内核接着触发事件(有数据就触发)
边缘触发:只有当I/O状态改变时,才触发事件,每次触发一次性把数据全部处理完,因为下一次处理要等I/O状态再次改变才可以(触发就全部处理完数据)
LT(leveltriggered)
缺省的工作方式,并且同时支持block和no-blocksocket.在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。
如果你不做任何操作,内核还是会继续通知你的,所以这种模式编程出错误可能性要小一点。传统的select/poll都是这种模型的代表.
ET(edge-triggered)
高速工作方式,只支持no-blocksocket。在这种模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知,直到你做了某些操作导致那个文件描述符不再为就绪状态了(比如,你在发送,接收或者接收请求,或者发送接收的数据少于一定量时导致了一个EWOULDBLOCK错误)。
但是请注意,如果一直不对这个fd作IO操作(从而导致它再次变成未就绪),内核不会发送更多的通知(onlyonce),不过在TCP协议中,ET模式的加速效用仍需要更多的benchmark确认。
epoll只有epoll_create,epoll_ctl,epoll_wait3个系统调用。
想要了解更多C++后端开发面试的小伙伴我推荐一个网站学术范(xueshufan.