文档章节

libevent解析(一)

Fire_thief
 Fire_thief
发布于 2014/06/13 11:13
字数 1211
阅读 148
收藏 4
点赞 0
评论 0

    在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
苏州
高级程序员
libevent 介绍

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

mjrao ⋅ 2016/04/19 ⋅ 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

整合 Google 开源 C++ 代码

Google 开源了很多优秀的 C++ 程序库,本文介绍如何将其中几个整合到一起。 本文涉及的 Google 库有: gflags - 命令行参数解析。可以完全用命令行来配置应用程序,省去配置文件。 gtest - ...

红薯 ⋅ 2010/04/21 ⋅ 0

使用Libevent编写高并发Http Server

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

满小茂 ⋅ 2016/11/19 ⋅ 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

服务器高并发网络设计模型

Nginx网络模型 一、进程模型 Nginx之所以为广大码农喜爱,除了其高性能外,还有其优雅的系统架构。与Memcached的经典多线程模型相比,Nginx是经典的多进程模型。Nginx启动后以daemon的方式在...

满小茂 ⋅ 2016/08/28 ⋅ 0

Ubuntu 安装gevent

Gevent是一个基于greenlet的Python的并发框架,以赖于greenlet和libevent库,因此安装Gevent前,首先需要安装greenlet和libevent。 libevent的安装,这里就不介绍了,网上的安装教程一大箩,...

jackliu8722 ⋅ 2012/07/16 ⋅ 0

开源免费的C/C++网络库(c/c++ sockets library)

(1)ACE 庞大、复杂,适合大型项目。开源、免费,不依赖第三方库,支持跨平台。 http://www.cs.wustl.edu/~schmidt/ACE.html (2)Asio Asio基于Boost开发的异步IO库,封装了Socket,简化基于s...

JORDANSG ⋅ 2013/05/13 ⋅ 1

dns解析返回多个ip地址,如何处理?

libevent异步dns解析,如果得到多个ip地址,如何处理?轮询还是只取第一个就够了?望熟悉的指点一下。。。

Yu_Yang ⋅ 2013/04/15 ⋅ 1

libevent源码深度剖析

作者:http://blog.csdn.net/sparkliang/article/category/660506 libevent源码深度剖析十三——libevent信号处理注意点 2010-02-11 20:00阅读(1669)评论(6) libevent源码深度剖析PDF 2010-...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout基于内存的DataMode 推荐引擎Demo2

Mahout基于内存的DataMode 推荐引擎Demo2 //注释的部分是基于文件也可以理解为基于日志文件的, //DataModel 可以有很多种,实现abstractDataMode的子类,原则上都可以作为数据源,个人觉得,...

xiaomin0322 ⋅ 20分钟前 ⋅ 0

Docker部署Tomcat及Web应用

一、在线下载docker yum install -y epel-releaseyum install docker-io # 安装dockerchkconfig docker on # 加入开机启动service docker start # 启动docker服务 1 ...

Jeam_ ⋅ 21分钟前 ⋅ 0

研发运营一体化能力成熟度模型

研发运营一体化是指在 IT 软件及相关服务的研发及交付过程中,将应用的需求、开发、测试、部 署和运营统一起来,基于整个组织的协作和应用架构的优化,实现敏捷开发、持续交付和应用运营的无...

stars永恒 ⋅ 26分钟前 ⋅ 0

jQuery缩小放大触发事件

jquery的resize()方法使用 <html> <head> <script type="text/javascript" src="/jquery/jquery.js"></script> <script type="text/javascript"> var i = 0; $(document).ready(function(){ ......

RobertZou ⋅ 26分钟前 ⋅ 0

eclipse python 搭建

https://jingyan.baidu.com/article/9113f81b68ebce2b3214c7e0.html https://www.cnblogs.com/ZhangRuoXu/p/6397756.html https://blog.csdn.net/zhangphil/article/details/78962159 字符集......

之渊 ⋅ 27分钟前 ⋅ 0

weex,react native,flutter

weex: 一次编写,处处运行 RN: 学一次,到处写(针对安卓,IOS平台特性 各自写,会有很大一部分是一样的代码) 这些方案是否真正的解决了跨平台问题呢?从目前的状况来看,很显然是没有的,因...

东东笔记 ⋅ 33分钟前 ⋅ 0

Spring Cloud微服务分布式云架构-集成项目

Spring Cloud集成项目有很多,下面我们列举一下和Spring Cloud相关的优秀项目,我们的企业架构中用到了很多的优秀项目,说白了,也是站在巨人的肩膀上去整合的。在学习Spring Cloud之前大家必...

明理萝 ⋅ 38分钟前 ⋅ 1

SpringMVC图片上传问题解决

当我们上传图片时一直发现: MultipartFile file = null; if (request instanceof MultipartHttpServletRequest) 匹配不上, 解决方案: 在前端xml加入如下配置代码即可 <!-- 图片上传bean --...

泉天下 ⋅ 40分钟前 ⋅ 0

Spring表达式语言(SpEL)

1、SpEL引用 Spring EL在bean创建时执行其中的表达式。此外,所有的Spring表达式都可以通过XML或注解的方式实现。下面将使用Spring表达式语言(SpEL),注入字符串,整数,Bean到属性。 SpEL的...

霍淇滨 ⋅ 56分钟前 ⋅ 0

Gradle使用阿里云镜像

gradle 生命周期中有一个初始化( Initialization )的过程,这个过程运行在 build script 之前,我们可以在这个地方做一点系统全局的设置,如配置仓库地址。 你可以在以下几个位置实现仓库地址...

明MikeWoo ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部