libevent源码分析--如何将定时器和信号事件都集合到I/O复用中

本文详细分析了libevent如何将I/O复用(以epoll为例)、定时器和信号事件整合在一起。通过调整epoll_wait的超时时间来处理定时事件,利用信号触发套接字读写来处理信号事件。libevent通过事件激活队列统一处理这三类事件,保证了架构的统一和方便性。
摘要由CSDN通过智能技术生成

我的理解:

       在I/O多路复用机制用(这里使用epoll作为例子),epoll_wait在一定的时间内监听需要受到关注的套接字,如果只是关注I/O事件,这样就会很简单,在设置时间的时候没有任何限制,此函数返回后,得到的有事件的套接字的个数,在libevent中使用的event_base_loop这个函数打到这个目的的,里面的evse->dispatch()这个函数就是epoll_wait的包装,这个函数返回的有I/O事件的套接字的数目。

      返回以后,再次进入event_base_loop这个函数,在这个函数中调用event_process_active这个函数调用相应套接字的回调函数,做相应的工作,那么在这两者(返回的是个数,操作却能够完成这么多个数的套接字的事件处理)是怎么沟通的呢?其实在evsel->dispatch()这个函数中,在epoll_wait返回以后,还将有事件的套接字添加到了一个队列中,将套接字添加到队列中的函数是event_active。在处理这些I/O时,只需将激活队列中的所用事件都处理即可。当然这只是考虑libevent只处理I/O事件的过程。

     如何将定时器也添加到I/O多路复用这个机制中呢?

     定时器事件需要一个时间的限制,在这里很容易添加进去,只要在epoll_wait这个函数等待的事件是所有定时事件中时间最小的那个时间即可,在event_base_loop函数中,timeout_next函数就是为了在最小堆中找出最小时间,以这个时间在epoll_wait中,在evsel->dispatch返回后,timeout_process()函数将需要处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值