这里不讲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的更多相关文章

  1. PHP之高性能I/O框架:Libevent(一)

    Libevent 是一个用C语言编写的.轻量级的开源高性能I/O框架,支持多种 I/O 多路复用技术: epoll. poll. dev/poll. select 和 kqueue 等:支持 I/O, ...

  2. PHP之高性能I/O框架:Libevent(二)

    Event扩展 Event可以认为是替代libevent最好的扩展,因为libevent已经很久不更新了,而Event一直在更新,而且Event支持更多特性,使用起来也比libevent简单. Eve ...

  3. PHP之高性能I/O框架:Libevent(三)

    Swoole Swoole里也提供了一些直接操作底层epoll/kqueue事件循环的接口,可将其他扩展创建的socket.PHP代码中stream/socket扩展创建的socket等加入到Swoo ...

  4. 【STM32H7教程】第12章 STM32H7的HAL库框架设计学习

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第12章       STM32H7的HAL库框架设计学 ...

  5. [开源] gnet: 一个轻量级且高性能的 Golang 网络库

    Github 主页 https://github.com/panjf2000/gnet 欢迎大家围观~~,目前还在持续更新,感兴趣的话可以 star 一下暗中观察哦. 简介 gnet 是一个基于 Ev ...

  6. 性能超四倍的高性能.NET二进制序列化库

    二进制序列化在.NET中有很多使用场景,如我们使用分布式缓存时,通常将缓存对象序列化为二进制数据进行缓存,在ASP.NET中,很多中间件(如认证等)也都是用了二进制序列化. 在.NET中我们通常使用S ...

  7. 专注于HTTP的高性能高易用性网络库:Fslib.network库

    博客列表页:http://blog.fishlee.net/tag/fslib-network/ 原创FSLib.Network库(目前专注于HTTP的高性能高易用性网络库) FSLib.Networ ...

  8. 高性能分布式执行框架——Ray

    Ray是UC Berkeley AMP实验室新推出的高性能分布式执行框架,它使用了和传统分布式计算系统不一样的架构和对分布式计算的抽象方式,具有比Spark更优异的计算性能. Ray目前还处于实验室阶 ...

  9. 轻量级网络库libevent概况

    Libevent is a library for writing fast portable nonblocking IO. libevent是一个为编写快速可移植的非阻塞IO程序而设计的. lib ...

随机推荐

  1. STM32F4_引领入门

    Ⅰ.概述 该文写给那些想学ST芯片开发(或初级学习)的朋友,文章着重细节,或许有点简单. 笔者想告诉那些刚开始学习ST的朋友,不管你使用哪一个系列(F0.F1.F2),哪一种型号芯片,其实学习的方法和 ...

  2. 关于垃圾回收(GC和Marshal)有感

    最近做一个挂机软件.要求是挂个三四天没事,不会报错.开始的时候都是顺利的,所有步骤都是可以ok.但是当测试运行的是就出现问题了,内存居然会在一个Task跑完之后暴涨几M的内存.开了一台测试机测试了一天 ...

  3. linux的一点小随笔

    随意写的一些东西,也就为以后自己可能看看... 1.vim安装,sudo apt-get install vim-gtk,于是vim就安装好了.当然在我电脑上还出现了gvim,简单的vim配置(etc ...

  4. JS实现浏览器的title闪烁

    经常可以看见的title里面的消息提示,下面是JS的一种实现方法:主要是通过setTimeout方法设置一个定时器,切换消息提示,从而达title到消息提示的闪烁. <html> < ...

  5. kettle报错 ../deploy does not exist, please create it.

    具体错误如下: Xlib: extension "RANDR" missing on display "localhost:10.0". ::, INFO [K ...

  6. Java实现多线程邮件发送

    利用java多线程技术配合线程池实现多任务邮件发送. 1.基本邮件发送MailSender package hk.buttonwood.ops.email; import java.io.File; ...

  7. 图片模糊度判断程序(C++、opencv)

    //#include<opencv2\opencv.hpp> //using namespace cv; #include <opencv2/core/core.hpp> #i ...

  8. 六大Nagios常见问题解决办法

    Nagios常见问题1: It appears as though you do not have permission to view information for any of the host ...

  9. Objective-C 编码规范

    Objective-C 编码规范,内容来自苹果.谷歌的文档翻译,自己的编码经验和对其它资料的总结. 概要 Objective-C 是一门面向对象的动态编程语言,主要用于编写 iOS 和 Mac 应用程 ...

  10. NSString+NSStringForJava.m

    // // NSString+NSStringForJava.m // NSStringCategory // // Created by Ryan Tang on 12-10-17. // Copy ...