[What]Linux 中使用 libevent

Linux 服务器程序必须处理 I/O 事件、信号、定时这 3 类事件,在处理时需要考虑如下 3 个问题:

  • 统一事件源:尽量统一的处理这 3 类事件,既能使得代码简单易懂,也能避免逻辑错误。
    • 前面使用 I/O 复用函数来同时处理这 3 类事件,但代码看起来不太优雅
  • 可移植性:尽量让同一份服务端代码可以应用在多种系统中
  • 对并发编程的支持:在多进程和多线程环境下,需要考虑各执行实体如何协同处理且避免竞态。

轻量级的libevent便可以很好的解决以上问题。

I/O 框架库概述

虽然 I/O 框架库很多,但总体上来讲要么以 Reactor 模式实现,要么以 Proactor 模式实现,要么同时使用两种模式实现。

iolib_reactor.jpg

上图是基于 Reactor 模式的实现,包含如下几个组件:

  • 句柄(Handle):一个事件源(I/O,信号,定时器)通常和一个句柄绑定在一起,让事件产生时内核通过这个句柄来通知应用程序。
    • 在 Linux 中 I/O 事件对应的句柄是文件描述符,信号事件对应的句柄就是信号值。
  • 事件多路分发器(EventDemultiplexer):通过底层调用 I/O 复用监听事件,事件发生后分发给对应处理器
  • 事件处理器(EventHandler):对应具体的业务逻辑,用户继承这些回调函数实现自己的处理逻辑
  • 具体的事件处理器(ConcreteEventHandler):返回与事件处理器相关联的句柄,以对应事件与处理器的对应关系

上图中,Reactor 类是 I/O 框架库的核心,其提供的主要方法是:

  • handle_events():等待事件发生,依次处理所有就绪事件对应的事件处理器
  • register_handler():调用 register_event() 方法向事件多路分发器注册一个事件
  • remove_handler():调用 remove_event() 方法向事件多路分发器删除一个事件

Libevent 体验

此处先留坑,待后期真正使用它时再来折腾。

Last Updated 2019-12-29 日 22:59.
Render by hexo-renderer-org with Emacs 26.3 (Org mode 9.1.14)