使用epoll多路复用编程时,会用epoll_wait阻塞等待事件的发生,对应有边沿触发和水平触发两种工作模式。
一、水平触发(EPOLLLT)
水平触发:只要缓冲区有数据,epoll_wait就会一直被触发,直到缓冲区为空;
水平触发(EPOLLLT)是epoll默认的工作模式,其优缺点如下:
优点:保证了数据的完整输出;
缺点:当数据较大时,需要不断从用户态和内核态切换,消耗了大量的系统资源,影响服务器性能;
应用场景:应用较少,一般用于连接请求较少及客户端发送的数据量较少的服务器,可一次性接收所有数据。此时,若使用边沿触发,会多调用一次accept/read等来判断数据是否为空。
二、边沿触发(EPOLLET)
边沿触发:只有所监听的事件状态改变或者有事件发生时,epoll_wait才会被触发;
epoll边沿触发时,假设一个客户端发送100字节的数据,而服务器设定read每次读取20字节,那么一次触发只能读取20个字节,然后内核调用epoll_wait直到下一次事件发生,才会继续从剩下的80字节读取20个字节,由此可见,这种模式其工作效率非常低且无法保证数据的完整性,因此边沿触发不会单独使用。
边沿触发通常与非阻塞IO一起使用,其工作模式为:epoll_wait触发一次&#x