event的本质

libevent2中的event的本质是什么?只要是非同步阻塞的运行方式,肯定遵循事件的订阅-发布模型。通过event_new的函数原型可以理解,一个event即代表一次订阅,建立起了fd变化的事件与callback响应函数之间的一个关联。

订阅-发布模型有四个方面,事件定义、事件订阅、事件触发、事件响应。libevent2与之的对应关系如下:

* 事件定义:由系统定义,比如IO相关的源(如socket)有read/write事件。libevent2定义了4个类型的事件:EV_TIMEOUT、EV_READ、EV_WRITE、EV_SIGNAL

* 事件订阅:由用户在代码中完成订阅,通过新建event对象并调用event_add实现事件的订阅。新建的event对象中就包含了关注的源是哪个fd, 关注的事件是四个事件中的哪些(一般只关注一个事件),关联的回调函数是什么。通过event_add将event添加到事件监听队列中。

* 事件触发:由libevent2底层负责,底层实现有多种方式,select为其中的一种。对于select方式,调用select()返回的可读列表即触发EV_READ事件,返回的可写列表即触发EV_WRITE事件。那么由谁来发起调用select()函数呢?通过调用event_base_dispatch()来发起调用。由此也可以看到event_base的作用。一旦事件被触发,就会将与该fd关联的事件监听队列中的所有的event添加就绪队列中。

* 事件响应:由libevent的event_base负责,处理就绪队列,对于队列中的每个event, 调用它的回调函数。

使用libevent2的流程

  1. 调用event_base_new()创建一个event_ base对象。
  2. 调用event_new(base, fd, flag, callback, args)创建一个event对象
  3. 调用event_add(event, NULL)添加event,即添加对fd通知事件的响应
  4. 调用event_base_dispatch(base)开始事件轮询。

下一篇将按照这个流程分析libevent2的源代码。

05-26 01:42