基于Reactor模式的libevent网络库之浅析与使用

时间:2021-09-30 00:13:40

Libevent特点:

  • 跨平台支持。支持linux,unix,和windows.
  • 统一事件源:对I/O事件,信号和定时事件提供统一的处理。
  • 线程安全。使用libevent_pthreads库来提供线程安全支持。
  • 基于Reactor模式的实现。

Reactor事件处理机制:

Reactor是一种事件驱动机制,有一个或多个并发的输入源(事件),有一个service handler, 有多个event handler. 具体过程就是应用程序需要提供相应的接口并注册到Reactor上,如果相应的事件发生,Reactor将主动调用应用程序注册的接口(回调函数)。

感性认识如下:

基于Reactor模式的libevent网络库之浅析与使用


Reactor模式框架

基于Reactor模式的libevent网络库之浅析与使用

基于Reactor模式的IO框架一般包含如下几个组件:

  • 句柄(事件源):IO框架库要处理的对象,即IO事件,信号和定时事件。句柄的作用是,当内核检测到就绪事件时,它通过句柄来通知应用程序这一事件。Linux下IO事件对应文件描述符,信号事件则为相应的信号值。
  • 事件多路分发器:由操作系统提供的I/O多路复用机制,如select和epoll。程序首先将其关心的句柄(事件源)及其事件注册到event demultiplexer上,当有事件到达时,event demultiplexer会发出通知“在已经注册的句柄集上,有一个或多个句柄的时事件已经就绪”,程序收到通知后,可以在非阻塞的情况下对事件进行处理。libevent使用结构体eventop对IO复用select,poll,epoll等进行封装,以统一接口来支持这些I/O多路复用机制,达到了对外隐藏底层系统机制的目的。
  • Reactor:事件管理的接口,内部使用event demultiplexer注册,注销事件,并运行事件循环,当有事件进入“就绪”状态时,调用注册事件的回调函数处理事件。对于libevent的event_base结构体。
  • Event Handler :对应于libevent的event结构体。提供了一组接口,每个接口对应一种类型事件,供Reactor在相应事件发生时调用,执行相应的事件处理。

使用libevent实例

#include <sys/signal.h>
#include <event2/event.h>

void signal_cb(int fd,short event,void *arg)
{
    //do something
}
void event_cb(int fd,short event,void *arg)
{
    //do something
}
int main()
{
    struct event_base* base=event_new();
    struct event* signal_event=evsignal_new(base,SIGINT,signal_cb,base);//信号
    struct event* IO_event=event_new(base,fd,EV_READ,event_cb,base);//I/O事件
    event_add(signal_event,NULL);
    event_add(IO_event,NULL);
    event_base_dispatch(base);

    event_free(signal_event);
    event_free(IO_event);
    event_base_free(base);
}

步骤总结如下:

  1. 调用event_new() 初始化一个event_base实例(Reactor)
  2. 初始化事件event,设置回调函数和关注的事件。
  3. 调用event_add()注册关注的事件
  4. 程序调用event_base_dispatch()进入event_loop.

注册事件后,libevent内部的时间处理流程:

基于Reactor模式的libevent网络库之浅析与使用