必威体育Betway必威体育官网
当前位置:首页 > IT技术

Libevent的理解和总结

时间:2019-08-20 11:12:15来源:IT技术作者:seo实验室小编阅读:89次「手机版」
 

libevent

版本:1.4.13

libevent是什么???

首先,从是什么入手,libevent是异步事件库,一个支持linuxwindows,跨平台的事件库

运用了经典的reactor模式,即事件驱动模式。

支持多种I/O复用技术:epoll,select,poll,dev,kqueue

支持I/O事件,定时事件和信号事件

为什么要用Reactor的模式???

先说说场景吧,libevent作为轻量级的网络库,势必要处理多个事件的请求,若只有几个事件的发生,简单的多线程就可以实现。

那么,在作为高性能的网络库的前提下再去讨论他的优势。就能知道为什么要去选择Reactor了。

第一点:因为Reactor模式不会被单个事件阻塞,若不用Reactor的模式,势必要开多线程去及时的响应事件的发生。然而一味地增加线程数量,进程调度又会影响其性能。

第二点:Reactor框架本身与事件的逻辑处理无关,有着很高的可复用性。

libevent的流程

1.初始化libevent,相当于一个Reactor的实例

2.初始化事件event,设置回调函数和相关事件

3.设置从属的event_base

4.添加事件

5.无限循环,等待就绪事件

libevent的一些细节(框架和处理方式)

1.libevent对事件event的管理方法是用了3个双向链表和一个小根堆

双向链表:

a.I/O/signal event_list ,Linked by ev_next(是event结构里的一个成员)

b.Signal[no sig] event_list ,Linked by ev_signal_next

c.active event_list[priortiy] ,Linked by ev_active_next

小根堆:

Timer Mini_heap ,Linked by min_heap_idx

libevent还对小根堆的堆调整做了小小的优化,就是拿到新的定时事件之后,并不是直接将数字插进去,而是先扩容,那待排序数字和双亲节点比较,而置换的操作只留一个空洞,最后一步再将值赋值进去,看图更加直观:

堆调整优化

2.libevent将系统提供的I/O demultiplex机制统一封装成了eventop结构;因此eventops[]包含了select、poll、kequeue和epoll等等其中的若干个全局实例对象。

eventop结构体有五个函数指针,分别可以指向epoll的不同的对应的函数,如有:初始化,注册事件,删除事件,事件分发,注销释放资源

Libevent把所有支持的I/O demultiplex机制存储在一个全局静态数组eventops中,并在初始化时选择使用何种机制,数组内容根据优先级顺序声明如下:

static const structeventop *eventops[] = { #ifdefHAVE_EVENT_PORTS  &evportops, 
#endif 
#ifdefHAVE_WORKING_KQUEUE 
#ifdefHAVE_EPOLL 
&epollops,
#endif 
#ifdefHAVE_DEVPOLL 
&devpollops,
#endif 
#ifdefHAVE_POLL 
 &pollops, 
 #endif 
 #ifdefHAVE_SELECT 
  &selectops, 
  #endif 
  #ifdefWIN32 
  &win32ops, 
  #endif 
  NULL 
  };

3.前面说到libevent支持三种事件,下面讲讲如何将三种事件结合到一起:

a.I/O事件和定时事件结合的方法

那Linux的多路复用技术为例,无论是select、poll还是epoll都设置了一个最大超时时间,保证即使没用事件触发,函数也能够返回,那么只要将timer事件的最小时间设置成系统I/O的timeout时间就行了。

b.I/O事件和信号事件结合的方法

由于signal事件的触发是随机的,就不能像处理timer事件那样简单,libevent的处理方法就是将signal事件通过某种方式通知系统的I/O事件,简而言之就是讲signal和I/O事件用同一种机制处理就行,这里就用到了socketpair,


暂时整理到这里,有新的理解会进一步修改

相关阅读

分享到:

栏目导航

推荐阅读

热门阅读