libevent开源高性能网络库

1 前言与简介

libevent是一个轻量级的开源高性能网络库。
优点:
事件驱动(event-driven),高性能;
轻量级,专注于网络,不如ACE那么臃肿庞大
源码相当精炼,易读。
跨平台,支持windows、linux、*bsd和mac os
支持多路I/O多路复用技术,epoll、poll、dev/poll、select、kqueue
支持I/O、定时器和信号等事件
注册事件优先级。

实际上libevent是一个典型的reactor模型。

2 reactor的事件处理机制

2.1 处理原理

普通函数的调用机制:
程序调用函数->函数执行/程序等待->函数结果和控制权返回给程序->函数继续处理
reactor释义“反应堆”,是一种事件驱动机制。不同于普通函数:应用程序不是主动调用某个API完成处理,而是相反,reactor逆置了事件的处理流程,应用程序提供相应的借口并注册到reactor上,如果相应事件发生,reactor将主动调用应用程序注册的接口,这些函数又称之为“回调函数”。
使用libevent也是想libevent框架注册相应的事件和回调函数;当这些事件发生时,libevent会调用这些回调函数处理相应事件(I/O读写、定时和信号)

2.2 优点

reactor模式是编写高性能网络服务器的必备技术之一
1)相应快,不必为单个同步时间所堵塞,虽然reactor本身是同步的;
2)编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并避免了多线程、进程的切换开销;
3)可拓展性,可以方便的通过增加reactor实例个数来充分利用cpu资源;
4)可复用性。reactor框架本身与具体事件处理逻辑无关,具有很高的复用性

2.3 reactor框架

reactor模型,必要组成:事件源、reactor框架,多路复用和事件处理。
备注:类图等UML图,可自行学习。
学习网站:
[https://blog.csdn.net/qq_27175513/article/details/79744694]
[https://javazhiyin.blog.csdn.net/article/details/106088685]
libevent开源高性能网络库_第1张图片
1)事件源
Linux上是文件描述符,window上就是socket 或者handle了,统称为句柄集;程序上指定的句柄上注册关心的事件,比如I/O事件

2)event demultiplexer – 事件多路分发机制``
由操作系统提供I/O多路复用机制,比如select和epoll.
程序首先将关心的句柄(事件源)以及时间注册到ievent demultiplexer上;当有事件到达时,event demultiplexer会发出通知”在已注册的句柄集中,一个或多个句柄时间已经就绪“
程序收到通知后,就可以在非堵塞的情况下对事件处理了,但是libevent使用结构体eventop进行了封装,以统一的接口来支持这些I/O多路复用机制,达到了对外隐藏底层系统机制的目的

reactor – 反应器
reactor,是事件管理的接口,内部使用event demultiplexer注册、注销事件;并循环事件循环,当有事件进入就绪状态时,调用注册事件的回调函数处理事件
一个典型的reactor声明方式

class Reactor
{
public:
	int register_handler(Event_Handler *pHandler, int event);
	int remove_handler(Event_Handler *pHandler, int event);
	void handle_event(timeval *ptv)
};

Event Handler --事件处理程序
事件处理程序提供了一组接口,每个接口对应一种类型的事件。提供了Reactor在相应的事件发生时候调用,执行相应的时间处理,通常会绑定一个有效句柄。
对应于libevent中就是event结构体。
下面是是两种典型的Event Handler类声明的方式。

第一种:

class Enent_Handler
{
public:
	virtual void handle_read() = 0;
	virtual void handle_write() = 0;
	virtual void handle_timeout() = 0;
	virtual void handle_close() = 0;
	virtual HANDLE get_handle() = 0;
	// ...
}

第二种:

class Event_Handler
{
public:
	//events maybe read/write/timeout/close .etc
	virtual void handle_event(int events) = 0;
	virtual HANDLE get_handle() = 0
}

2.4 Reactor事件处理框架

事件序列图

libevent开源高性能网络库_第2张图片

3 基本使用场景

3.1 基本应用场景

基本应用场景夜市使用libevent的基本流程,使用libevent设置定时器,应用程序只需要执行下面步骤即可。

  1. 首先初始化libevent库,并保存返回指针
struct event_base *base = event_init();
//等价于初始化一个Reactor实例;在初始化libevent之后就可以注册事件了
  1. 初始化事件event,设置回调函数和关注的事件
evtimer_set(&ev, timer_cb, NULL);
//等价于event_set(&ev, -1, 0, timer_cb, NULL);
//其中event_set的函数原型是:
//void event_set(struct event *ev, int fd, short event, void (*cb)(int, short, void *), void *arg)
//*
param[ev]:执行初始化event对象
param[fd]:event绑定的句柄,可以是EV_READ, EV_WRITE, EVENT_SIGNAL
param[cb]:函数指针,当fd上边的事件发生时,调用该函数进行处理,他有三个参数,
		  调用时通过event_base传入,实际上就是event_set时的fd, event, arg;
param[arg]:传递给cb函数指针的参数
*//
  1. 设置event从属的event_base(指明event要注册到那个event_base实力上)
  2. 添加事件
  3. 程序进行无限循环,等待就绪事件并执行事件处理

你可能感兴趣的:(编程,开源,c++)