转自:http://blog.csdn.net/sparkliang/article/details/4957667

前面讲到,整个libevent本身就是一个Reactor,因此本节将专门对Reactor模式进行必要的介绍,并列出libevnet中的几个重要组件和Reactor的对应关系,在后面的章节中可能还会提到本节介绍的基本概念。

1 Reactor的事件处理机制

首先来回想一下普通函数调用的机制:程序调用某函数?函数执行,程序等待?函数将结果和控制权返回给程序?程序继续处理。
Reactor释义“反应堆”,是一种事件驱动机制。和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的时间发生,Reactor将主动调用应用程序注册的接口,这些接口又称为“回调函数”。使用Libevent也是想Libevent框架注册相应的事件和回调函数;当这些时间发声时,Libevent会调用这些回调函数处理相应的事件(I/O读写、定时和信号)。
    用“好莱坞原则”来形容Reactor再合适不过了:不要打电话给我们,我们会打电话通知你。
    举个例子:你去应聘某xx公司,面试结束后。
“普通函数调用机制”公司HR比较懒,不会记你的联系方式,那怎么办呢,你只能面试完后自己打电话去问结果;有没有被录取啊,还是被据了;

“Reactor”公司HR就记下了你的联系方式,结果出来后会主动打电话通知你:有没有被录取啊,还是被据了;你不用自己打电话去问结果,事实上也不能,你没有HR的留联系方式。

2 Reactor模式的优点

Reactor模式是编写高性能网络服务器的必备技术之一,它具有如下的优点:
    1)响应快,不必为单个同步时间所阻塞,虽然Reactor本身依然是同步的;
    2)编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程的切换开销;
    3)可扩展性,可以方便的通过增加Reactor实例个数来充分利用CPU资源;
    4)可复用性,reactor框架本身与具体事件处理逻辑无关,具有很高的复用性;

3 Reactor模式框架

使用Reactor模型,必备的几个组件:事件源、Reactor框架、多路复用机制和事件处理程序,先来看看Reactor模型的整体框架,接下来再对每个组件做逐一说明。
 

1) 事件源
Linux上是文件描述符,Windows上就是Socket或者Handle了,这里统一称为“句柄集”;程序在指定的句柄上注册关心的事件,比如I/O事件。

2) event demultiplexer——事件多路分发机制
由操作系统提供的I/O多路复用机制,比如select和epoll。
    程序首先将其关心的句柄(事件源)及其事件注册到event demultiplexer上;
当有事件到达时,event demultiplexer会发出通知“在已经注册的句柄集中,一个或多个句柄的事件已经就绪”;
    程序收到通知后,就可以在非阻塞的情况下对事件进行处理了。
对应到libevent中,依然是select、poll、epoll等,但是libevent使用结构体eventop进行了封装,以统一的接口来支持这些I/O多路复用机制,达到了对外隐藏底层系统机制的目的。

3) Reactor——反应器
    Reactor,是事件管理的接口,内部使用event demultiplexer注册、注销事件;并运行事件循环,当有事件进入“就绪”状态时,调用注册事件的回调函数处理事件。
对应到libevent中,就是event_base结构体。
一个典型的Reactor声明方式

[cpp] view plaincopy
  1. class Reactor
  2. {
  3. public:
  4. int register_handler(Event_Handler *pHandler, int event);
  5. int remove_handler(Event_Handler *pHandler, int event);
  6. void handle_events(timeval *ptv);
  7. // ...
  8. };

4) Event Handler——事件处理程序
    事件处理程序提供了一组接口,每个接口对应了一种类型的事件,供Reactor在相应的事件发生时调用,执行相应的事件处理。通常它会绑定一个有效的句柄。
对应到libevent中,就是event结构体。
下面是两种典型的Event Handler类声明方式,二者互有优缺点。

[cpp] view plaincopy
  1. class Event_Handler
  2. {
  3. public:
  4. virtual void handle_read() = 0;
  5. virtual void handle_write() = 0;
  6. virtual void handle_timeout() = 0;
  7. virtual void handle_close() = 0;
  8. virtual HANDLE get_handle() = 0;
  9. // ...
  10. };
  11. class Event_Handler
  12. {
  13. public:
  14. // events maybe read/write/timeout/close .etc
  15. virtual void handle_events(int events) = 0;
  16. virtual HANDLE get_handle() = 0;
  17. // ...
  18. };

4 Reactor事件处理流程

前面说过Reactor将事件流“逆置”了,那么使用Reactor模式后,事件控制流是什么样子呢?
可以参见下面的序列图。
 

5 小结

上面讲到了Reactor的基本概念、框架和处理流程,对Reactor有个基本清晰的了解后,再来对比看libevent就会更容易理解了,接下来就正式进入到libevent的代码世界了,加油!

libevent之Reactor模式详解相关推荐

  1. (一)Reactor模式详解

    阅读libevent代码版本为1.4.13 stable版本,阅读书籍参考张亮大神libevent源码深度剖析. 在此主要记录自己学习过程中的一些点点滴滴. 阅读之前需要先了解一下5中I/O模型的比较 ...

  2. Reactor模式详解(转)

    在学习netty源码以前,需要熟悉JDK 中的NIO,多线程:了解一些设计模式:例如工厂方法.抽象工厂.建造者.外观.代理等:还有NIO的Reactor和AIO的Proactor模式.下边我转了两篇关 ...

  3. Reactor模式详解及 三种模式演变

    无论是C++还是Java编写的网络框架,大多数都是基于Reactor模式进行设计和开发,Reactor模式基于事件驱动,特别适合处理海量的I/O事件. 什么是Reactor模式 要回答这个问题,首先当 ...

  4. Reactor模式详解

      本文翻译至某大神的论文,论文名字叫就叫reactor.   reactor设计模式用于需要并发处理多个客户端的服务器. 1. 举个例子吧   假设我们需要建立一个提供分布式日志服务的事件驱动服务器 ...

  5. Linux后端服务器网络编程之线程模型丨reactor模型详解

    前言   上一篇文章<后端服务器网络编程之 IO 模型>中讲到服务器端高性能网络编程的核心在于架构,而架构的核心在于进程/线程模型的选择.本文将主要介绍传统的和目前流行的进程/线程模型,在 ...

  6. 【后端开发】Reactor 模型详解

    研究背景 其实我们在研究netty的时候我们必定绕不过NIO的,也必定必须研究一下这个Reactor模型的,如果不进行这个Reactor模型和NIO知识点的研究,那么我们必定掌握不了Netty的精髓, ...

  7. getinstance方法详解_二、设计模式总览及工厂模式详解

    二.架构师内功心法之设计模式 2.架构师内功心法之设计模式 2.1.课程目标 1.通过对本章内容的学习,了解设计模式的由来. 2.介绍设计模式能帮我们解决哪些问题. 3.剖析工厂模式的历史由来及应用场 ...

  8. Spotify敏捷模式详解三部曲第二篇:研发过程

    本文转自:Scrum 中文网 引言 在本系列文章的第一篇,我们介绍了Spotify的敏捷研发团队,以及它独特的组织架构.Spotify的研发团队采用的是一种非常独特的组织架构,如下图所示: 整个研发组 ...

  9. Spotify敏捷模式详解三部曲第一篇:研发团队

    本文转自:Scrum中文网 引言 2018年4月,来自北欧瑞典的音乐流媒体公司.百亿美元独角兽Spotify创造了历史,它成为了当代上市公司当中,第一家通过"直接上市"的方式在美国 ...

最新文章

  1. 通过CH340G驱动的Nano ATMEAG328P驱动板初步测试
  2. 限制用户对页的访问php,如何限制对Django中管理页的访问?
  3. 基于java的社交网站毕业设计_软件工程毕业设计_社交网站.pdf
  4. QTP的Action之间传递参数
  5. rx.observable_在Spring MVC流中使用rx-java Observable
  6. ad域需要自建dns服务器吗,创建AD DS域服务(图文详解)
  7. 2001~2020大数据行业怎么样?面临哪些挑战?解决了什么问题?
  8. 编写vbs脚本发送邮件
  9. python函数定义时参数相当于占位符_python中函数的参数
  10. SSL常用专业缩略语汇总
  11. 《WinForm开发系列之控件篇》Item16 ErrorProvider
  12. 索引导致大量写入数据时效率低下
  13. 无线键鼠接收器配对怎么就那么难?简直就是浪费
  14. android 壁纸制作教程,教你如何自己制作安卓手机壁纸的方法教程
  15. 企业数智化升级的四个“拦路虎”
  16. C++ tbb 并发容器适用场景 concurrent_set concurrent_map concurrent_queue
  17. 4G图传移动视频取证-可视安全生产监管-常见问题解答FAQ
  18. 监控文件变化 (Python—看门狗)
  19. 网易云音乐你喜欢吗?你自己也可以做一个
  20. 微服务的精髓,Spring Cloud 到底该学到什么程度才算精通?

热门文章

  1. 攻防世界php2_攻防世界-web2
  2. php excel cpu高,phpexcel读文件的时候cpu99%
  3. 数据结构实验之二叉树五:层序遍历(STL和模拟队列两种方法)
  4. Java 面试知识点解析(二)——高并发编程篇
  5. Spring事务传递性探讨
  6. echarts散点图使用
  7. 如何管理并设计你的口令
  8. 如何读懂并写出装逼的函数式代码
  9. mysql dba系统学习(18)mysql主从复制的实现 mysql dba系统学习(19)配置mysql+lvs+keeplived实现Mysql读操作的负载均衡
  10. Python list 数据类型:列表