Reactor 反应堆
Reactor模式也叫做反应堆. 其中心思想 : 将要处理的IO事件注册到一个中心处理接口的IO多路复用上, 由回调函数处理事件. 其实就是将select
, poll
, epoll
等使用统一接口进行封装, 注册其回调函数, 等待事件到来时直接调用回调函数.
(图片来源)
处理机制
普通函数调用机制
普通函数的调用机制其实就是函数被调用, 将参数封装成栈帧压栈 -> 函数调用 -> 结果压栈 -> 函数返回, 将控制权交给主程序.
Reactor模式调用机制
处理函数被注册 -> 事件发生后 -> 主动调用注册的处理函数(从
Reactor
中调用).
Reactor
模式主要的不同就在于事件注册后不再由主程序直接调用, 而事件来的时候才主动有Reactor
调用.
举个栗子 : 平时写作业, 你可能想要抄别人的答案, 你并不知道对方什么时候写完所以你打算每隔一小时问一次“你写完没有”, 这样对方可能4,5小时后才写完, 而你就要问4-5次“你写完没有”. 而Reactor
模式就像你告诉对方你写完通知我一声(其实就是函数注册), 几小时后对方写完了通知你, 你就知道对方写完了(回调).
Reactor组成
eventdemultiplexer
: 事件多路分发器一个函数用来等待一个或者多个事件的到来, 这个过程中函数会被阻塞知道分发器上有事件到来. 其实就是IO多路复用机制, libevent就是将
select
,epoll
等函数进行封装. libevent中就是event_base
接口来管理的.struct event_base {const struct eventop *evsel; // 对应io的事件多路分发器(如epoll)const struct eventop *evsigsel; // 对应信号的事件多路分发器 evsigops };
handle
: 事件源识别事件的类型. Linux上是文件描述符, Windows上就是Socket或者Handle(句柄), 还有信号. 在libevent中由
event
管理struct event {evutil_socket_t ev_fd; // 对应的事件 };
event handle
: 事件处理器每个接口对应一种处理的类型事件. 只有识别了事件源的类型才能调用响应的处理函数, 套接字就由套接字函数处理, 信号就由信号函数处理. 其实就是调用事件处理的回调函数
struct event {void (*ev_callback)(evutil_socket_t, short, void *arg); // 事件处理程序void *arg; // 参数 };
ConcreteEvent Handler
: 具体的事件处理器这是
event handle
接口的具体实现, 实际上就是真正完成事件处理功能的部分. 而每个事件对应于一个描述符.reactor
: 反应器Reactor事件管理的接口, 将就绪的事件注册到事件多路分发器上, 或者就事件删除等操作. libevent中就是
event_base
接口来管理的.
参考
Reactor的事件处理机制
Reactor 反应堆相关推荐
- 设计模式之Reactor反应堆
Reactor反应堆设计模式是高效的I/O设计中常用的模式之一,它是以同步I/O方式来处理I/O事件的.目前常见的开源网络事件库libevent.libev.libuv.muduo都用到了Reacto ...
- java 反应堆模式_Netty中的三种Reactor(反应堆)
目录: Reactor(反应堆)和Proactor(前摄器) <Java NIO系列教程(八)JDK AIO编程>-- java AIO的proactor模式 Netty的I/O线程Nio ...
- curl 请求没反应_理解Redis的反应堆模式
本文首发于: 理解Redis的反应堆模式mp.weixin.qq.com 微信公众号:后端技术指南针 欢迎关注 接收最新文章! 1. Redis的网络模型 Redis基于Reactor模式(反应堆模 ...
- (一)Reactor模式详解
阅读libevent代码版本为1.4.13 stable版本,阅读书籍参考张亮大神libevent源码深度剖析. 在此主要记录自己学习过程中的一些点点滴滴. 阅读之前需要先了解一下5中I/O模型的比较 ...
- 基于Epoll的Reactor模式
Reactor模式 Reactor模式的定义 Reactor模式中的主要角色 Epoll (ET)服务器 EventItem类的设计 Reactor类的设计 回调函数 套接字相关 引入线程池 Reac ...
- 网络编程:C10K问题而引出的reactor模型
C10问题 随着互联网的蓬勃发展,一个非常重要的问题摆在计算机工业界面前.这个问题就是如何使用最低的成本满足高性能和高并发的需求.这个问题在过去可能不是一个严重的问题,但是在2000年前后,互联网用户 ...
- epoll服务器反应堆模型
常规的epoll处理 epoll是io多路复用的一种实现方式,最开始我们使用epoll是对多个fd进行管理,当epoll_wait从内核的rdllist就绪链表中取出一定数量的poll_event时, ...
- epoll的反应堆实现模式
这里有个epoll的反应堆模式实现,在这段代码之前,不知道什么是reactor反应堆,赶紧去补了一下Reator模式 论文阅读整理,这个论文是以面向对象的思想来介绍反应堆的实现的. 对比这个epoll ...
- 基础服务器 IO 模型 Proactor 模型 Reactor 模型 IO 多路复用 异步 IO 模型 Linux 服务器开发 网络编程服务器模型
本文主要记录服务器的 IO 模型的类型(从多路复用,异步 IO 讲到 Proactor Reactor 模型),包括 Real World nginx 和 apache ,kafka 等分析,配备自洽 ...
- Reactor设计模式 -- 基于EpollET模式
TOC epoll的工作方式 epoll有2种工作方式-水平触发(LT)和边缘触发(ET) ; epoll默认状态下就是LT工作模式 ,select和poll其实也是工作在LT模式下,epoll既可以 ...
最新文章
- 精灵动画Animation对话框组成Idle动画的各精灵
- Matlab符号运算 - 解微分方程
- 模拟操作系统动态内存管理(c实现)
- jvm 参数_6个重要的JVM性能参数
- 微软发布 Visual Studio 2019年第二季度路线图
- jboss与nginx_JBoss BRMS与JasperReports进行报告
- 数据库备份策略 分布式_管理优秀的分布式数据团队的4种基本策略
- ublox Android 定位超时,[RK3288] [Android 7.1] u-blox GPS调试
- Oracle数据库分页查询的几种实现方法
- phpredis报错信息:protocol error, got ‘o‘ as reply type byte解决方案
- android 引入 .so,android studio导入so文件,并调用其中的方法
- c/c++_消除非标准警告
- vba 循环读取单元格_VBA入门直播课程大纲!
- 行为识别---不同模型的帧采样策略
- 搭建安装kubesphere平台——在 Linux 上以 All-in-One 模式,附安装步骤—{全篇踩坑排坑记} kubernetes:k8s
- pycharm的安装,简单使用
- 乐视超级电视刷鸿蒙,乐视超3X55刷精简+root系统记录
- mysql 复制数据库
- 你真的懂one-hot编码吗?
- matlab 可视化界面,[转载]Matlab 的可视化界面设计(上)