Libevent的理解和总结

版本:1.4.13
libevent是什么???

首先,从是什么入手,libevent是异步事件库,一个支持linux,windows,跨平台的事件库
运用了经典的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还对小根堆的堆调整做了小小的优化,就是拿到新的定时事件之后,并不是直接将数字插进去,而是先扩容,那待排序数字和双亲节点比较,而置换的操作只留一个空洞,最后一步再将值赋值进去,看图更加直观:
Libevent的理解和总结_第1张图片


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,






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

你可能感兴趣的:(网络库总结)