阅读libevent代码版本为1.4.13 stable版本,阅读书籍参考张亮大神libevent源码深度剖析。
在此主要记录自己学习过程中的一些点点滴滴。

阅读之前需要先了解一下5中I/O模型的比较。

Reactor模式

Reactor(反应堆模式)是libevent的中心思想,常规的I/O多路复用中采用select和poll、epoll等来实现。而Reactor是将上述机制进一步封装,通俗的来讲,就是通过回调机制实现。我们只需将事件的接口注册到Reactor上,当事件发生之后,会回调注册的接口。

Reactor是一种事件驱动机制。和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的事件发生,Reactor将主动调用应用程序注册的接口,这些接口又称为“回调函数”。

Reactor模式结构

在Reactor模式中,有以下几个关键的参与者。
描述符(handle)由操作系统提供,用于识别每一个事件,如Socket描述符、文件描述符等。在Linux中,它用一个整数来表示。事件可以来自外部,如来自客户端的连接请求、数据等。事件也可以来自内部,如定时器事件。

同步事件分离器(demultiplexer)是一个函数,用来等待一个或多个事件的发生。调用者会被阻塞,直到分离器分离的描述符集上有事件发生。Linux的select函数是一个经常被使用的分离器。
事件处理器接口(event handler)是由一个或多个模板函数组成的接口。这些模板函数描述了和应用程序相关的对某个事件的操作。 具体的事件处理器:是事件处理器接口的实现。它实现了应用程序提供的某个服务。每个具体的事件处理器总和一个描述符相关。它使用描述符来识别事件、识别应用程序提供的服务。
Reactor 管理器(reactor):定义了一些接口,用于应用程序控制事件调度,以及应用程序注册、删除事件处理器和相关的描述符。它是事件处理器的调度核心。 Reactor管理器使用同步事件分离器来等待事件的发生。一旦事件发生,Reactor管理器先是分离每个事件,然后调度事件处理器,最后调用相关的模 板函数来处理这个事件。
通过上述分析,我们注意到,是Reactor管理器而不是应用程序负责等待事件、分离事件和调度事件。实际上,Reactor管理器并没有被具体的 事件处理器调用,而是管理器调度具体的事件处理器,由事件处理器对发生的事件做出处理。这就是类似Hollywood原则的“反向控制”。应用程序要做的 仅仅是实现一个具体的事件处理器,然后把它注册到Reactor管理器中。接下来的工作由管理器来完成。这些参与者的相互关系如下图所示。

Reactor 处理步骤

  1. 初始化一个Reactor管理器
  2. 初始化事件处理器,设置事件源及回调函数
  3. 将事件处理器注册到Reactor管理器上
  4. 注册该事件
  5. 进入循环等待事件发生并处理

优点

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

参考博客:
1.(二)什么是Reactor模式

(一)Reactor模式详解相关推荐

  1. libevent之Reactor模式详解

    转自:http://blog.csdn.net/sparkliang/article/details/4957667 前面讲到,整个libevent本身就是一个Reactor,因此本节将专门对Reac ...

  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. RDKit | 基于RDKit描述三维分子形状(3D描述符)
  2. 中招!330 万台老年机被植木马,背后黑幕细思极恐
  3. POJ 2976 01分数规划基础题目
  4. C# 遍历窗体控件顺序问题
  5. ASP.NET MVC:缓存功能的设计及问题
  6. Kubernetes包管理器Helm发布3.0版本
  7. 743. 网络延迟时间
  8. __attribute__((always_inline))
  9. 真5G尚需时日,滑稽的假5G营销已经上演
  10. caffe 安装(only cpu)
  11. python怎么引入os模块的函数_Python之OS模块函数
  12. java8配置环境变量_java8环境变量设置
  13. 神雕侠侣服务器维修时间,《神雕侠侣》2021年3月11日更新维护新服开启公告
  14. NOIP 2016 滚粗记
  15. js原生后代选择器_js 后代选择器
  16. OPPO Watch新品将于9月16日正式发布
  17. Windows目录下文件夹详解
  18. Windows运行加速
  19. Outlook可以收发Live Mail了
  20. 计算几何《简单》入土芝士

热门文章

  1. chrome版本更新后,chromedriver对应版本更新
  2. Nexus Windows中搭建Nexus仓库
  3. Jenkins发布api jobs,利用supervisor管理运行
  4. html怎么设置页面最小像素,html px像素单位
  5. 物联网开发笔记(62)- 使用Micropython开发ESP32开发板之控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程:环境搭建
  6. 使用Nodejs+Protractor搭建测试环境
  7. 机器学习之线性回归模型的代价函数是凸函数的证明
  8. Intouch学习笔记一
  9. 37岁京东程序员“被猝死”,当事人辟谣:已报警
  10. 从“零”开发一款知识图谱应用产品