Libevent学习笔记-Reactor 模式

Libevent 是一个轻量级的开源高性能网络库,由c语言编写。
跨平台,支持Windows 、Linux 、*BSD 和Mac Os;
支持多种I/O 多路复用技术, epoll、poll 、dev/poll 、select 和kqueue 等;
支持I/O ,定时器和信号等事件;
注册事件优先级;
理解Reactor 模式是理解libevent的基石

Reactor 模式

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

Reactor 模式框架

使用Reactor 模型,必备的几个组件:事件源、Reactor 框架、多路复用机制和事件处理程序
1) handle——事件源
Linux 上是文件描述符, Windows 上就是Socket 或者Handle 了,这里统一称为“句柄集”;程序在指定的句柄上注册关心的事件,比如I/O 事件。
2) event demultiplexer ——事件多路分发机制
由操作系统提供的I/O 多路复用机制,比如select 和epoll 。
程序首先将其关心的句柄(事件源)及其事件注册到event demultiplexer 上;
当有事件到达时, event demultiplexer 会发出通知“在已经注册的句柄集中,一个或多个句柄的事件已经就绪” ;
程序收到通知后,就可以在非阻塞的情况下对事件进行处理了。
对应到libevent 中,依然是select、poll 、epoll 等,但是libevent 使用结构体eventop 进行了封装,以统一的接口来支持这些I/O 多路复用机制,达到了对外隐藏底层系统机制的目的。
3) Reactor——反应器
Reactor,是事件管理的接口,内部使用event demultiplexer 注册、注销事件;并运行事件循环,当有事件进入“就绪”状态时,调用注册事件的回调函数处理事件。对应到libevent 中,就是event_base结构体。一个典型的Reactor声明方式
class Reactor
{
public :
int register_handler(Event_Handler *pHandler, int event );
int remove_handler(Event_Handler *pHandler, int event );
void handle_events(timeval *ptv);
// …
};
4) Event Handler ——事件处理程序
事件处理程序提供了一组接口,每个接口对应了一种类型的事件,供Reactor 在相应的事件发生时调用,执行相应的事件处理。通常它会绑定一个有效的句柄。对应到libevent 中,就是event 结构体。
下面是两种典型的Event Handler 类声明方式, 二者互有优缺点。
class Event_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;
// …
};
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值