文档章节

libevent解析(一)

Fire_thief
 Fire_thief
发布于 2014/06/13 11:13
字数 1211
阅读 155
收藏 4

    在linux下开发网络服务程序一直在用libevent,对于我来说如果不把一个库的源代码看得八九不离十,我很难说服自己肆无忌惮地使用它。可能这是技术强迫症患者典型的症状。到今天我还是不敢说对libevent熟悉得滚瓜烂熟,即使它的代码精炼易读。但是每次回过头来重新梳理这些源代码时总会有新的收获。所以,把对libevent的使用或者分析心得记录下来,是一件很有必要的事。

    libevent是一个基于事件驱动的网络库模型,支持多种I/O多路复用:epoll,poll,select,kqueue等等。libevent由于是基于事件驱动的,所以在代码中看见大量的函数指针就很理所当然了。由于其的轻量级和高性能,就有相当部分的项目使用它:memcached, NetChat等等,其中典型的当属memcached,我很早就分析过它的网络实现部分,是很经典的libevent的用法,以至于我以后使用libevent的时候不自觉的参照memcached,并乐此不疲。libevent的轻量级不只是体现在它是C语言实现的,还体现在它专注于网络方面,不像ACE那样臃肿。而封装后既不失使用的方便性又不失使用的灵活性。

    由于使用libevent已有一段时间,就不以一个初学者的眼光通过简单的实例一步步深入分析,而是以一个过看来人的眼光从整个框架到细节来逐层分析。我也希望通过这次分析加深对其的认识,吸收精华为其所用。

    libevent使用的是Reactor模型,这是典型的时间驱动模型。下面是网上搜到的一段对Reactor的解释:

Reactor模型有几个基本组成:事件源,多路复用机制, 事件触发的处理程序, Reactor框架。

事件源:在linux上文件描述符,在windows上是Handle或者Socket。

多路复用机制(event demultiplexer):一般指I/O多路复用机制,有系统特性提供,比如epoll,select,poll,kqueue等等。

Reactor框架:对事件操作的接口,操作包括将事件注册,注销到I/O多路复用中。并在I/O多路复用器上阻塞等待事件发生,在调用相应的回调函数处理。这里的事件对应事件源中的可读可写事件。

事件触发的处理程序:当事件发生后需要处理的回调函数。

在libevent中需要关心的事件有三种:I/O读写,定时器,信号。

I/O读写只需将读写对应的文件描述的可读或可写事件注册到I/O多路复用中就可以实现对其监控。

定时器有两种方法,第一种就是和Muduo一样利用新版linux提供的timerfd_create()函数创建了一个文件描述符用于描述定时器,并将文件描述符的可读事件注册到I/O多路复用器中,但是考虑到兼容性,libevent肯定不会考虑。第二种方法根据I/O多路复用器在指定时间到达时可以超时返回的特性来实现

信号在libevent中实现得比较复杂,而且网上介绍得也比较少。首先信号肯定不能像定时器那样通过复用器的超时返回实现,因为系统没提供相应接口,其次系统也没有提供相应api来创建文件描述符来描述信号。但是总得有事件源来描述一下信号才能将其事件注册到I/O多路复用器中。万变不离其宗,现在还是要回到文件描述符上,如果现在能有一个文件描述符在指定信号发生时会有可读可写事件就行了,所以很容易想到pipe或者socketpair。用socketpair创建一对未命名的、相互连接的UNIX域套接字。这对套接字中的一个作为事件源将其可读事件注册到I/O多路复用器中,而另一个则在自定义的信号处理函数中被写入数据。这样当信号发生时套接字被写入数据而注册到I/O多路复用器中的一个套接字就会触发可读事件,这样就比较完美地实现了io,定时器,信号的统一。当然对于信号的处理需要注意很多你需要关注的不仅要区分信号还要对信号的发生次数有一个记录,不能遗漏。


© 著作权归作者所有

共有 人打赏支持
Fire_thief
粉丝 1
博文 6
码字总数 7916
作品 0
苏州
高级程序员
私信 提问
php安装libevent扩展

原本想尝试一下PHP编写高性能网络服务,需要安装libevent扩展,没想到让人很费了点脑袋 先下载libevent扩展: http://pecl.php.net/package/libevent/0.0.5 解压后,开始编译 1 2 3 $ cd lib...

贪睡猫仙mosen
2014/06/08
0
0
libevent 介绍

 libevent 2.0 介绍 libevent是一个用于开发可扩展性网络服务器的基于事件驱动模型的网络库.libevent具有几个显著亮点: 事件驱动,高性能 轻量级,专注于网络 跨平台,支持Windows, Lin...

mjrao
2016/04/19
152
0
NoSQL介绍、 memrcached介绍、安装memcached、查看memcachedq状态

一、nosql介绍 关系型数据:量级很大的时候,很浪费资源 非关系型数据库:相比而言比较简单(主要做一些能够满足需求的的应用) 二、memrcached介绍 memrcached:缓存,存储论坛的帖子,数字...

Zhouliang6
08/14
0
0
使用Libevent编写高并发Http Server

libevent库使得高并发响应HTTP Server的编写变得很容易。整个过程包括如下几部:初始化,创建HTTP Server, 指定callback, 进入事件循环。另外在回调函数中,可以获取客户端请求(request的HTT...

满小茂
2016/11/19
126
0
hy0kl/event-json-rpc

event-json-rpc 基于 libevent,以二进制头+json为协议来实现的 rpc 框架. 参考和依赖 libeventcJSONzloglibzdb 以此为基础 https://github.com/jasonish/libevent-examples json c 解析器 ht......

hy0kl
2017/09/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

etcd集群备份和数据恢复

etcd是一个分布式k-v数据库,在kubernetes中使用其管理集群的元数据。这里介绍etcd集群数据的备份和数据恢复的方法和步骤。 本文来自于:https://www.maideliang.com/index.php/archives/25/...

openthings
13分钟前
0
0
「阿里面试系列」面试加分项,从JVM层面了解线程的启动和停止

文章简介 这一篇主要围绕线程状态控制相关的操作分析线程的原理,比如线程的中断,线程的通信等,内容比较多,可能会分两篇文章 阿里面试系列导读:关注我的技术公众号【架构师修炼宝典】一周...

Java架构资源分享
21分钟前
2
0
centos安装confluence全攻略

https://blog.csdn.net/qwer026/article/details/51439076

happyeveryday32
34分钟前
3
0
30 行 Javascript 代码搞定智能家居系统

本文首发于『阿里云 IoT 开发者社区』,更多精彩物联网内容欢迎前往浏览。 智能家居可谓是今年物联网的热门领域,通过智能单品和智能音箱,人们已然把『智能』两个字变成了生活的理所应当。搭...

阿里云官方博客
37分钟前
4
0
sed插入和附加文本基础使用

对于编辑器来说,在数据中增加行算是很基本的操作吧,sed有以下两个操作: 插入(insert)命令(i)会在指定行前增加一个新行 附加(append)命令(a)会在指定行后增加一个新行 还是用下面的文本来测...

woshixin
45分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部