epoll 事件处理的细节分析2

本文深入解析epoll的工作原理,特别是其在Linux系统中如何统一处理文件、socket、pipe等IO事件。通过对比ET(边沿触发)和LT(水平触发)两种模式的特点,帮助读者理解在不同场景下如何合理选择事件触发模式。

准确的说epoll事件就是IO事件,包括文件、socket、pipe等,linux把他们统称为文件,统一的接口调用,驱动层不同实现。

这里分成四类:

监听套餐接字,链接套接字,文件,pipe,相应的触发条件

1.监听套接字:

有新链接连上临听套接字,并三次握手成功时

2.链接套接字

有IO读写,且传输层接收/发送完毕

3.普通文件

有IO读写

4.pipe

有IO读写,且有锁保护。


虽然有统一接口,但还是有区分的,先看epoll 源码:

if (epi->event.events & EPOLLONESHOT)
         epi->event.events &= EP_PRIVATE_BITS;
else if (!(epi->event.events & EPOLLET)) {
       list_add_tail(&epi->rdllink, &ep->rdllist);
 }


可以看到 当事件类型不是 EPOLLET时,会反复触发。

因此对于以上四种类型,1,3,4应该不加 EPOLLET,而第2种一定要加上 EPOLLET,否则当一个链接由客

户端挂掉的时候,服务器会不停的收到事件。


ET/LT实际上是电力上的概念,有两种电路,一种里面有高电阻,另外一个是有电容。

第一种情况,只有电压达到一定的值的情况下才能导通,称为水平触发  eage triggered。

第二种情况,只有电压发生变化的情况下才能导通, 称为边沿触发,level triggered。


epoll 按照这个意思,对于LT,当有事件时,当有IO时就会一直触 发,直到IO被完全传送。

对于ET,有IO时触发一次,IO消失时触发一次,即上升沿下降沿。

这样如果对监听链接用ET的话,可能就会丢掉很多链接,而如对普通链接用LT的话就会做无用功。

这样是不是更形象了?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值