12 高性能I/O框架库Libevent
这里不讲Libevent库的具体内容了,从宏观上对I/O库整体做个介绍
Linux服务器程序必须处理三类事件:I/O事件,信号和定时事件
- 统一事件源:统一处理这三类事件既能使代码简单易懂,又能避免一些潜在的逻辑错误。统一事件源的一般方法——利用I/O复用系统调用来管理所有事件
- 可移植性:不同操作系统具有不同的I/O复用方式
- 对并发编程的支持:支持多进程多线程
I/O框架库以库函数的形式,封装了较为底层的系统调用。各种I/O框架库实现原理基本相似,要么以Reactor模式实现,要么以Proactor模式实现,要么同时使用这两种模式。
举例来说,基于Reactor模式的I/O框架库包含如下几个组件:
句柄(Handle)、事件多路分发器(EventDemultiplexer)、事件处理器(EventHandler)、和具体事件处理器(ConcretrEventHandler)、Reactor。这些组件关系如下:

句柄:I/O框架库要处理的对象,即I/O事件,信号和定时事件,统一成为事件源。一个事件源通常和一个句柄绑定在一起。句柄的作用是,当内核检测到就绪事件,它将向句柄来通知这一事件。在Linux环境下,I/O事件对应的句柄是文件描述符,信号事件对应的句柄就是信号值
事件多路分发器:事件到来是随机的,异步的,我们无法预知程序合适收到一个客户的链接请求。所以程序需要循环地等待并处理事件,这就是事件循环。事件循环中,等待事件一般使用I/O复用技术实现。I/O框架库一般将系统支持的各种I/O复用系统调用封装成统一的接口,成为多路事件分发器。内部调用的是select、poll、epoll_wait函数
事件处理器和具体事件处理器:事件处理器执行事件对应的业务逻辑。他通常包含一个或多个handle_event回调函数。I/O框架库通常提供一个接口,用户需继承它实现在籍的事件处理器,即具体事件处理器。因此事件处理器中的回调函数一般被声明为虚函数,以支持用户扩展
Reactor:I/O框架库的核心提供几个主要方法是
- handle_events:该方法执行事件循环
- register_handler:注册事件
- remove_handler:删除事件

12 高性能I/O框架库Libevent的更多相关文章
- PHP之高性能I/O框架:Libevent(一)
Libevent 是一个用C语言编写的.轻量级的开源高性能I/O框架,支持多种 I/O 多路复用技术: epoll. poll. dev/poll. select 和 kqueue 等:支持 I/O, ...
- PHP之高性能I/O框架:Libevent(二)
Event扩展 Event可以认为是替代libevent最好的扩展,因为libevent已经很久不更新了,而Event一直在更新,而且Event支持更多特性,使用起来也比libevent简单. Eve ...
- PHP之高性能I/O框架:Libevent(三)
Swoole Swoole里也提供了一些直接操作底层epoll/kqueue事件循环的接口,可将其他扩展创建的socket.PHP代码中stream/socket扩展创建的socket等加入到Swoo ...
- 【STM32H7教程】第12章 STM32H7的HAL库框架设计学习
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第12章 STM32H7的HAL库框架设计学 ...
- [开源] gnet: 一个轻量级且高性能的 Golang 网络库
Github 主页 https://github.com/panjf2000/gnet 欢迎大家围观~~,目前还在持续更新,感兴趣的话可以 star 一下暗中观察哦. 简介 gnet 是一个基于 Ev ...
- 性能超四倍的高性能.NET二进制序列化库
二进制序列化在.NET中有很多使用场景,如我们使用分布式缓存时,通常将缓存对象序列化为二进制数据进行缓存,在ASP.NET中,很多中间件(如认证等)也都是用了二进制序列化. 在.NET中我们通常使用S ...
- 专注于HTTP的高性能高易用性网络库:Fslib.network库
博客列表页:http://blog.fishlee.net/tag/fslib-network/ 原创FSLib.Network库(目前专注于HTTP的高性能高易用性网络库) FSLib.Networ ...
- 高性能分布式执行框架——Ray
Ray是UC Berkeley AMP实验室新推出的高性能分布式执行框架,它使用了和传统分布式计算系统不一样的架构和对分布式计算的抽象方式,具有比Spark更优异的计算性能. Ray目前还处于实验室阶 ...
- 轻量级网络库libevent概况
Libevent is a library for writing fast portable nonblocking IO. libevent是一个为编写快速可移植的非阻塞IO程序而设计的. lib ...
随机推荐
- ok6410内存初始化
•DRAM:它的基本原件是小电容,电容可以在两个极板上保留电荷,但是需要定期的充电(刷新),否则数据会丢失.缺点:由于要定期刷新存储介质,存取速度较慢. •SRAM:它是一种具有静止存取功能的内存,不 ...
- JavaScriptMinifier C#压缩Javascript
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Te ...
- Python学习教程(learning Python)--2.3.1 Python传参函数设计
本节主要讨论设计传递多个参数子函数的设计方法. 在2.3节里我们讨论了如何自己设计一个带参数的子函数的设计方法,现在我们研究一下如何传递两个及以上参数的设计方法. 函数为何要带参数呢?其实原因很简单, ...
- [笔记]--Sublime Text 2使用技巧
Sublime个人喜好设置: 在打开个人设置页面Preferences >> Settings - User,加入以下内容: { , //TAB键,4个空格 "translate ...
- 浅议iOS网络数据解析
/*------------------------------------ 数据解析: 1.JSON数据 --------------------------------*/ 重点:1.什么是JSO ...
- c,c++函数返回多个值的方法
最近遇到一个问题,需要通过一个函数返回多个值.无奈C,C++不能返回多个值.所以就想有什么方法可以解决. 网上方法比较杂乱,一般有两种替代做法: 1. 利用函数的副作用, 返回值在函数外定义, 在函数 ...
- Python性能优化的20条建议 (转载)
优化算法时间复杂度 算法的时间复杂度对程序的执行效率影响最大,在Python中可以通过选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的时间复杂度分别是O(n)和O(1).不同的场 ...
- ED/EP系列3《基本指令》
Ø --APPLICATIONBLOCK(应用锁定): Ø --APPLICATION UNBLOCK(应用解锁): Ø --CARDBLOCK(卡片锁定): Ø --EXTERNAL AUTHENT ...
- Helloworld模块之内核makefile详解
Hello World 模块以及对应的内核makefile详解 hello.c: #include <linux/module.h> //所有模块都需要的头文件 #include < ...
- hdu 5280 Senior's Array
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5280 Senior's Array Description One day, Xuejiejie ge ...