浅谈epoll的边沿触发与水平触发

本文探讨了epoll的边沿触发(EPOLLET)和水平触发(EPOLLLT)两种模式。水平触发保证数据完整但可能导致频繁的系统资源消耗,适合连接请求少、数据量小的场景。边沿触发配合非阻塞IO提高效率,适用于大多数情况,即使是数据量小的场景。水平触发同样需要非阻塞IO避免死锁。在实际项目中,边沿触发未循环遍历导致连接处理效率低下,通过循环遍历优化后显著提高了性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值