libevent库的外部和内部实现

一、从大的方面来讲libevent的实现就是:

1、往libevent库里注册事件(I/O事件、signal事件、定时器事件)

2、启动事件循环

3、通过I/O复用(select/poll/epoll)来将有就绪事件通知给系统

4、根据相应事件调用相应的函数

二、从细节方面来讲它就是(内部实现):

1、首先应用程序准备并初始化event,设置好事件类型和回调函数;

2、向libevent添加事件event。对于定时事件,libevent使用一个小根堆管理,对于Signal和I/O事件,libevent将其放入到等待链表中,这是一个双向链表结构

3、程序调用event_base_dispatch()系列函数进入无限循环,等待事件,以select()函数为例;每次循环前libevent会检查定时事件的最小超时时间tv,根据tv设置select()的最大等待时间,以便于后面及时处理超时事件;当select()返回后,首先检查超时事件,然后检查I/O事件,Libevent将所有的就绪事件放入到激活链表中;然后对链表中的事件调用事件的回调函数执行事件处理;

通俗一点讲就是,当事件进入libevent库之后她们会在自己的队列中排着,每次当有事件event转变为就绪状态时,libevent就会把它移入到active event list[priority]中,其中priority是event的优先级,接着,libevent会根据自己的调度策略选择就绪事件,调用其cb_callback()函数执行处理;并根据就绪事件的句柄和事件类型填充cb_callback函数的参数。直到这三个队列上都没有事件之后libevent就退出了,这是libevent退出的其中一种情况,另外一种就是调用函数让libevent退出

三、考点:epoll_wait利用超时时间做定时器的原理

假设我们定的超时时间是5分钟,那么epoll_waiit在5分钟的时候肯定会返回一次,如果提前返回也没有关系,提前返回肯定是I/O上有事件发生了,那就调用I/O去处理,下一次调用epoll_wait的时候还要检查计算时间,返回的时间和超时时间做一次差值计算,然后让它阻塞这个差值时间这么久再返回,返回的时候再次去查看时间,如果正好是这个超时时间的时间点就调用timer函数,返回超时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值