IO设计模式:Reactor和Proactor对比

时接触的开源产品如Redis、ACE,事件模型都使用的Reactor模式;而同样做事件处理的Proactor,由于操作系统的原因,相关的开源产品也少;这里学习下其模型结构,重点对比下两者的异同点;

反应器Reactor
Reactor模式结构

Reactor包含如下角色:

Handle 句柄;用来标识socket连接或是打开文件;
Synchronous Event Demultiplexer:同步事件多路分解器:由操作系统内核实现的一个函数;用于阻塞等待发生在句柄集合上的一个或多个事件;(如select/epoll;)
Event Handler:事件处理接口
Concrete Event HandlerA:实现应用程序所提供的特定事件处理逻辑;
Reactor:反应器,定义一个接口,实现以下功能: 
1)供应用程序注册和删除关注的事件句柄; 
2)运行事件循环; 
3)有就绪事件到来时,分发事件到之前注册的回调函数上处理;

“反应”器名字中”反应“的由来: 
“反应”即“倒置”,“控制逆转”,具体事件处理程序不调用反应器,而是由反应器分配一个具体事件处理程序,具体事件处理程序对某个指定的事件发生做出反应;这种控制逆转又称为“好莱坞法则”(不要调用我,让我来调用你)

业务流程及时序图

应用启动,将关注的事件handle注册到Reactor中;
调用Reactor,进入无限事件循环,等待注册的事件到来;
事件到来,select返回,Reactor将事件分发到之前注册的回调函数中处理;

主动器Proactor

Proactor模式结构

Proactor主动器模式包含如下角色

Handle 句柄;用来标识socket连接或是打开文件;
Asynchronous Operation Processor:异步操作处理器;负责执行异步操作,一般由操作系统内核实现;
Asynchronous Operation:异步操作
Completion Event Queue:完成事件队列;异步操作完成的结果放到队列中等待后续使用
Proactor:主动器;为应用程序进程提供事件循环;从完成事件队列中取出异步操作的结果,分发调用相应的后续处理逻辑;
Completion Handler:完成事件接口;一般是由回调函数组成的接口;
Concrete Completion Handler:完成事件处理逻辑;实现接口定义特定的应用处理逻辑;
业务流程及时序图

应用程序启动,调用异步操作处理器提供的异步操作接口函数,调用之后应用程序和异步操作处理就独立运行;应用程序可以调用新的异步操作,而其它操作可以并发进行;
应用程序启动Proactor主动器,进行无限的事件循环,等待完成事件到来;
异步操作处理器执行异步操作,完成后将结果放入到完成事件队列;
主动器从完成事件队列中取出结果,分发到相应的完成事件回调函数处理逻辑中;

对比两者的区别

主动和被动
以主动写为例: 
Reactor将handle放到select(),等待可写就绪,然后调用write()写入数据;写完处理后续逻辑; 
Proactor调用aoi_write后立刻返回,由内核负责写操作,写完后调用相应的回调函数处理后续逻辑;

可以看出,Reactor被动的等待指示事件的到来并做出反应;它有一个等待的过程,做什么都要先放入到监听事件集合中等待handler可用时再进行操作; 
Proactor直接调用异步读写操作,调用完后立刻返回;

实现
Reactor实现了一个被动的事件分离和分发模型,服务等待请求事件的到来,再通过不受间断的同步处理事件,从而做出反应;

Proactor实现了一个主动的事件分离和分发模型;这种设计允许多个任务并发的执行,从而提高吞吐量;并可执行耗时长的任务(各个任务间互不影响)

优点
Reactor实现相对简单,对于耗时短的处理场景处理高效; 
操作系统可以在多个事件源上等待,并且避免了多线程编程相关的性能开销和编程复杂性; 
事件的串行化对应用是透明的,可以顺序的同步执行而不需要加锁; 
事务分离:将与应用无关的多路分解和分配机制和与应用相关的回调函数分离开来,

Proactor性能更高,能够处理耗时长的并发场景;

缺点
Reactor处理耗时长的操作会造成事件分发的阻塞,影响到后续事件的处理;

Proactor实现逻辑复杂;依赖操作系统对异步的支持,目前实现了纯异步操作的操作系统少,实现优秀的如windows IOCP,但由于其windows系统用于服务器的局限性,目前应用范围较小;而Unix/Linux系统对纯异步的支持有限,应用事件驱动的主流还是通过select/epoll来实现;

适用场景
Reactor:同时接收多个服务请求,并且依次同步的处理它们的事件驱动程序; 
Proactor:异步接收和同时处理多个服务请求的事件驱动程序;

 

最后我们知道linux系统提供的异步I/O,只支持O_DIRECT,不能带缓存。因此出现了开源库libeio,它和Linux的异步I/O一样也是用多线程模拟,但是更高效。下图是libeio的异步I/O实现,是不是很像Proactor模式啊。

 最后我们知道linux系统提供的异步I/O,只支持O_DIRECT,不能带缓存。因此出现了开源库libeio,它和Linux的异步I/O一样也是用多线程模拟,但是更高效。下图是libeio的异步I/O实现,是不是很像Proactor模式啊。

-------------------- 
转载:
原文:https://blog.csdn.net/wanbf123/article/details/78062802?utm_source=copy

Reactor和Proactor对比以及优缺点 (netty的底层原理reactor模型)相关推荐

  1. IO设计模式:Reactor和Proactor对比

    IO设计模式:Reactor和Proactor对比 平时接触的开源产品如Redis.ACE,事件模型都使用的Reactor模式:而同样做事件处理的Proactor,由于操作系统的原因,相关的开源产品也 ...

  2. 转: IO设计模式:Reactor和Proactor对比

    转: https://segmentfault.com/a/1190000002715832 平时接触的开源产品如Redis.ACE,事件模型都使用的Reactor模式:而同样做事件处理的Proact ...

  3. 《Netty、Redis、Zookeeper高并发实战》2️⃣高并发IO的底层原理

    文章目录 1.IO读写的基础原理 1.1 内核缓冲区与进程缓存区 1.2 详解典型的系统调用流程 2.四种主要的IO模型 2.1 同步阻塞IO(Blocking IO) 2.2 同步非阻塞IO(Non ...

  4. 【Netty】主从反应器 ( Reactor ) 多线程模型

    文章目录 一. 主从 反应器 ( Reactor ) 多线程 模式 二. 主从 反应器 ( Reactor ) 多线程 工作流程 三. 主从 反应器 ( Reactor ) 多线程 优缺点分析 四. ...

  5. 2种IO并发开发中的设计模式:Reactor and Proactor

    Reactor and Proactor [原文:http://blog.csdn.net/wenbingoon/article/details/9880365] 1 概述 IO读写时,多路复用机制都 ...

  6. 带你彻底搞懂高性能网络模式Reactor 和 Proactor

    ​​​​摘要:无论是 Reactor,还是 Proactor,都是一种基于「事件分发」的网络编程模式,区别在于 Reactor 模式是基于「待完成」的 I/O 事件,而 Proactor 模式则是基于 ...

  7. 面试官:什么是 Reactor 和 Proactor

    1.概述 转载:面试官:什么是 Reactor 和 Proactor? 转载这个主要是了解一下两者的区别.以前写个 设计模式:高性能IO之Reactor模式 当初是学习netty的时候看到的. 这次就 ...

  8. 面试官:什么是 Reactor 和 Proactor?

    小林,来了. 这次就来图解 Reactor 和 Proactor 这两个高性能网络模式. 别小看这两个东西,特别是 Reactor 模式,市面上常见的开源软件很多都采用了这个方案,比如 Redis.N ...

  9. 两种高性能 I/O 设计模式 Reactor 和 Proactor

    Reactor 和 Proactor 是基于事件驱动,在网络编程中经常用到两种设计模式. 曾经在一个项目中用到了网络库 libevent,也学习了一段时间,其内部实现所用到的就是 Reactor,所知 ...

最新文章

  1. linux网站配置文件,Linux网站服务器配置文件
  2. 【STM32】外部中断
  3. 连接hadoop java.io.IOException:Could not locate executable null\bin\winutils.exe in the Hadoop binarie
  4. app-debug.apk does not exist on disk
  5. n皇后问题c语言_九章算法 | N皇后问题
  6. 从字节码层面,解析 Java 布尔型的实现原理
  7. linux常用查看磁盘空间大小的命令
  8. .NET IO 复习中的误区
  9. 推荐几本微积分入门书籍
  10. Lomboz插件的介绍 下载 安装 问题
  11. 云计算需要学什么内容 学完可以胜任哪些岗位
  12. linux 本地查看服务器图片-2种方式
  13. 短信接口被恶意盗刷(验证码短信被盗刷)怎么办?
  14. 船舶物资与市场杂志船舶物资与市场杂志社船舶物资与市场编辑部2022年第7期目录
  15. 基于java web和echarts的数据可视化项目
  16. TURN协议(RFC5766详解)
  17. Java实现多线程聊天室
  18. 每日一Lua(2)-语句
  19. ASP.NET MVC 微博网站--获取关注的人的微博和我的微博
  20. 蓝桥杯STM32学习之G431、F103基础知识(一)

热门文章

  1. Android学习笔记----Java中的字符串比较
  2. linux下的pdf分割合并软件
  3. 【ASP.NET Step by Step】之十六至二十三 Inserting, Updating, and Deleting Data
  4. 终端到服务器丢包,服务器丢包 ping的时候产生丢包的解决方法
  5. matlab实现id3,MATLAB简单实现ID3
  6. Golang——map集合初始化、键值操作、map作为函数参数的使用
  7. php注册树模式,PHP设计模式之详记注册树模式
  8. python索引例子_Python实现带下标索引的遍历操作示例
  9. 使用 做签名的post_基础实操|使用jmeter对聊天软件进行接口测试
  10. 互联网前景如何,还值得进入嘛?