Reactor模式也叫做反应堆. 其中心思想 : 将要处理的IO事件注册到一个中心处理接口的IO多路复用上, 由回调函数处理事件. 其实就是将select, poll, epoll等使用统一接口进行封装, 注册其回调函数, 等待事件到来时直接调用回调函数.

(图片来源)

处理机制

  1. 普通函数调用机制

    普通函数的调用机制其实就是函数被调用, 将参数封装成栈帧压栈 -> 函数调用 -> 结果压栈 -> 函数返回, 将控制权交给主程序.

  2. Reactor模式调用机制

    处理函数被注册 -> 事件发生后 -> 主动调用注册的处理函数(从Reactor中调用).

Reactor模式主要的不同就在于事件注册后不再由主程序直接调用, 而事件来的时候才主动有Reactor调用.

举个栗子 : 平时写作业, 你可能想要抄别人的答案, 你并不知道对方什么时候写完所以你打算每隔一小时问一次“你写完没有”, 这样对方可能4,5小时后才写完, 而你就要问4-5次“你写完没有”. 而Reactor模式就像你告诉对方你写完通知我一声(其实就是函数注册), 几小时后对方写完了通知你, 你就知道对方写完了(回调).

Reactor组成

  1. eventdemultiplexer : 事件多路分发器

    一个函数用来等待一个或者多个事件的到来, 这个过程中函数会被阻塞知道分发器上有事件到来. 其实就是IO多路复用机制, libevent就是将select, epoll等函数进行封装. libevent中就是event_base接口来管理的.

    struct event_base {const struct eventop *evsel;    // 对应io的事件多路分发器(如epoll)const struct eventop *evsigsel; // 对应信号的事件多路分发器 evsigops
    };
    
  2. handle : 事件源

    识别事件的类型. Linux上是文件描述符, Windows上就是Socket或者Handle(句柄), 还有信号. 在libevent中由event管理

    struct event {evutil_socket_t ev_fd; // 对应的事件
    };
    
  3. event handle : 事件处理器

    每个接口对应一种处理的类型事件. 只有识别了事件源的类型才能调用响应的处理函数, 套接字就由套接字函数处理, 信号就由信号函数处理. 其实就是调用事件处理的回调函数

    struct event {void (*ev_callback)(evutil_socket_t, short, void *arg); // 事件处理程序void *arg; // 参数
    };
    
  4. ConcreteEvent Handler : 具体的事件处理器

    这是event handle接口的具体实现, 实际上就是真正完成事件处理功能的部分. 而每个事件对应于一个描述符.

  5. reactor : 反应器

    Reactor事件管理的接口, 将就绪的事件注册到事件多路分发器上, 或者就事件删除等操作. libevent中就是event_base接口来管理的.

参考

Reactor的事件处理机制

Reactor 反应堆相关推荐

  1. 设计模式之Reactor反应堆

    Reactor反应堆设计模式是高效的I/O设计中常用的模式之一,它是以同步I/O方式来处理I/O事件的.目前常见的开源网络事件库libevent.libev.libuv.muduo都用到了Reacto ...

  2. java 反应堆模式_Netty中的三种Reactor(反应堆)

    目录: Reactor(反应堆)和Proactor(前摄器) <Java NIO系列教程(八)JDK AIO编程>-- java AIO的proactor模式 Netty的I/O线程Nio ...

  3. curl 请求没反应_理解Redis的反应堆模式

    本文首发于: 理解Redis的反应堆模式​mp.weixin.qq.com 微信公众号:后端技术指南针 欢迎关注 接收最新文章! 1. Redis的网络模型 Redis基于Reactor模式(反应堆模 ...

  4. (一)Reactor模式详解

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

  5. 基于Epoll的Reactor模式

    Reactor模式 Reactor模式的定义 Reactor模式中的主要角色 Epoll (ET)服务器 EventItem类的设计 Reactor类的设计 回调函数 套接字相关 引入线程池 Reac ...

  6. 网络编程:C10K问题而引出的reactor模型

    C10问题 随着互联网的蓬勃发展,一个非常重要的问题摆在计算机工业界面前.这个问题就是如何使用最低的成本满足高性能和高并发的需求.这个问题在过去可能不是一个严重的问题,但是在2000年前后,互联网用户 ...

  7. epoll服务器反应堆模型

    常规的epoll处理 epoll是io多路复用的一种实现方式,最开始我们使用epoll是对多个fd进行管理,当epoll_wait从内核的rdllist就绪链表中取出一定数量的poll_event时, ...

  8. epoll的反应堆实现模式

    这里有个epoll的反应堆模式实现,在这段代码之前,不知道什么是reactor反应堆,赶紧去补了一下Reator模式 论文阅读整理,这个论文是以面向对象的思想来介绍反应堆的实现的. 对比这个epoll ...

  9. 基础服务器 IO 模型 Proactor 模型 Reactor 模型 IO 多路复用 异步 IO 模型 Linux 服务器开发 网络编程服务器模型

    本文主要记录服务器的 IO 模型的类型(从多路复用,异步 IO 讲到 Proactor Reactor 模型),包括 Real World nginx 和 apache ,kafka 等分析,配备自洽 ...

  10. Reactor设计模式 -- 基于EpollET模式

    TOC epoll的工作方式 epoll有2种工作方式-水平触发(LT)和边缘触发(ET) ; epoll默认状态下就是LT工作模式 ,select和poll其实也是工作在LT模式下,epoll既可以 ...

最新文章

  1. 精灵动画Animation对话框组成Idle动画的各精灵
  2. Matlab符号运算 - 解微分方程
  3. 模拟操作系统动态内存管理(c实现)
  4. jvm 参数_6个重要的JVM性能参数
  5. 微软发布 Visual Studio 2019年第二季度路线图
  6. jboss与nginx_JBoss BRMS与JasperReports进行报告
  7. 数据库备份策略 分布式_管理优秀的分布式数据团队的4种基本策略
  8. ublox Android 定位超时,[RK3288] [Android 7.1] u-blox GPS调试
  9. Oracle数据库分页查询的几种实现方法
  10. phpredis报错信息:protocol error, got ‘o‘ as reply type byte解决方案
  11. android 引入 .so,android studio导入so文件,并调用其中的方法
  12. c/c++_消除非标准警告
  13. vba 循环读取单元格_VBA入门直播课程大纲!
  14. 行为识别---不同模型的帧采样策略
  15. 搭建安装kubesphere平台——在 Linux 上以 All-in-One 模式,附安装步骤—{全篇踩坑排坑记} kubernetes:k8s
  16. pycharm的安装,简单使用
  17. 乐视超级电视刷鸿蒙,乐视超3X55刷精简+root系统记录
  18. mysql 复制数据库
  19. 你真的懂one-hot编码吗?
  20. matlab 可视化界面,[转载]Matlab 的可视化界面设计(上)

热门文章

  1. 【云学习笔记】二、免费云服务器与免费域名组合打造自己的个人空间
  2. 干货 | 在搜索引擎广告关键词生成上,算法可以做什么?
  3. Unity3D组件 | 绘制静态柱状图
  4. 2017普及第四题 跳房子 jump DP+二分
  5. python_判断是否回文
  6. python数据分析之pandas
  7. hualinux 编程概念 3.15:天下武功,唯快不破—新时代敏捷项目管理之道
  8. 洛克菲勒写给儿子的38封信
  9. leetcode之随心刷
  10. OCR识别新能源车牌的原理