libevent框架初步学习

libevent是一种开源的轻量级的优秀I/O框架库,它可以跨平台,可以统一处理I/O、信号和定时事件,可以使用不同的I/O复用方式,较新版本使用libevent_pthreads库对并发编程提供支持。高性能分布式内存对象缓存软件memcached就使用了该IO库。这些天通过《Linux高性能服务器编程》和《libevent源码深度剖析》学习了libevent的一些基本概念和原理。

libevent是Reactor模式实现的。这种模式一般包含下面几个组件:句柄(handle),事件多路分发器、事件处理器、具体的事件处理器、Reactor。事件一般和句柄绑定在一起,句柄的作用是当事件发生时,内核通过句柄通知应用程序这一事件。Linux下,I/O事件对应的句柄是文件描述符,信号事件对应的是信号值。

程序需要循环等待处理事件,等待事件一般是利用IO复用技术,这些IO复用技术被封装为统一接口称为事件多路分发器。

事件处理器执行事件对应的业务逻辑,一般包含一个或多个回调函数,在事件循环中被执行。事件处理器通常是个接口,由具体事件处理器来实现。事件处理器必须和句柄绑定,因为事件是由句柄通知,由句柄才能找到对应的事件处理器。

Reactor是框架库的核心,主要包含三部分,一是事件循环,处理就绪事件的事件处理器;调用事件多路分发器的注册事件函数向事件多路分发器注册事件;调用事件多路分发器的删除事件函数删除事件。

libevent中几个重要的数据结构,event事件处理器,event_base相当于Reactor,eventops多路分发器。各event_base中有事件队列,活动事件队列,定时器队列用于管理事件处理器event。处理事件就是执行事件对应的事件处理器中的回调函数。

event结构体封装了句柄、事件类型、回调函数等信息。所有事件处理器串成一个队列也就是注册事件队列。所有被激活的事件处理器也串成一个队列也就是活动事件队列。活动事件队列不只一个,不同优先级的事件在不同队列中,Reactor会按优先级处理各事件处理器。fd相同的IO事件处理器也串成一个IO事件队列,相同信号值的信号事件处理器串成一个信号队列。事件处理器需要注册到事件队列中,同时还需要让分发器监听该事件,同时建立fd与事件处理器的对应关系。

eventops为IO复用技术提供统一的接口。选用哪种复用技术在编译时由编译宏确定,Linux默认epoll。

事件循环是框架的运行动力。

这里想单独说一下信号事件的处理是如何统一到该框架中的。信号发生后如何通知系统IO机制返回?其实也是利用IO事件实现的。Libevent创建一对socket pair,然后为其读socket在event_base上注册一个persist的读事件。信号的处理函数中向socket pair的写socket中写入数据,用于触发IO事件,同时将信号发生的标志置true。读socket上面会有事件,IO机制就返回,然后处理事件时判断发生了信号,信号事件就被处理了。

对于这两份资料还需要进一步研究,若要理解还需要进一步分析源码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值