这里不讲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. 了解Unix进程(2)

    1. 每个进程都有一个名字,crusher 可以得到: # process name puts $PROGRAM_NAME 10.downto(1) do | num | $PROGRAM_NAME ...

  2. 光迁PING值延迟计算!以及到中国最快的美国机房是哪个机房?

    美国圣安娜KT机房/美国KT机房/美国KT服务器 KT机房是美国直达大陆最快的机房,ping值一般为195MS,是做web服务器的首选机房,深受中小站长的欢迎! 我们平时测试美国服务器的速度,都是通过 ...

  3. 第一章 管理程序流(In .net4.5) 之 实现多线程和异步处理

    1. 概述 本章主要讲解.net4.5如何实现多线程和异步处理的相关内容. 2. 主要内容 2.1 理解线程 ① 使用Thread类   public static class Program   { ...

  4. 19.python的编码问题

    在正式说明之前,先给大家一个参考资料:戳这里 文章的内容参考了这篇资料,并加以总结,为了避免我总结的不够完善,或者说出现什么错误的地方,有疑问的地方大家可以看看上面那篇文章. 以下说明是针对于pyth ...

  5. DB2执行脚本

    经常会遇到数据库脚本放在.sql文件中,那么怎么去执行这个脚本,而不需要将脚本中的东西粘贴出来再数据库链接工具中执行呢? 下面是DB2数据库脚本执行的办法 环境介绍: 脚本文件名:Script.sql ...

  6. Oracle DBLINK 抽数以及DDL、DML操作

    DB :  11.2.0.3.0 原库实例orcl:SQL> select instance_name from v$instance; INSTANCE_NAME--------------- ...

  7. oracle11g 新特性 - rman自动备份控制文件延迟

    OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 -6 ...

  8. 安装MySQL的心得

    1.去官网上下载适合自己电脑的安装包,最好在网上查查教程起码知道自己应该怎么下载,下载哪一个. 2.我遇到的问题不多:<1>.没在bin目录下安装,启动数据库时出现错误2:<2> ...

  9. 面向对象原生js幻灯片代淡出效果

    面向对象原生js幻灯片代淡出效果 下面是代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" & ...

  10. 一些Iphone sqlite 的包装类

    相信很多人用iphone的Sqlite不会直接用C的方法,要么自己包装一层Object c的访问方法,要么用CoreData,下面我整理些目前所了结的一些Sqlite 包装类.  1.CoreData ...