1、标准定义

两种I/O多路复用模式:Reactor和Proactor

一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理器。两个与事件分离器有关的模式是Reactor和Proactor。Reactor模式采用同步IO,而Proactor采用异步IO。

在Reactor中,事件分离器负责等待文件描述符或socket为读写操作准备就绪,然后将就绪事件传递给对应的处理器,最后由处理器负责完成实际的读写工作。

而在Proactor模式中,处理器--或者兼任处理器的事件分离器,只负责发起异步读写操作。IO操作本身由操作系统来完成。传递给操作系统的参数需要包括用户定义的数据缓冲区地址和数据大小,操作系统才能从中得到写出操作所需数据,或写入从socket读到的数据。事件分离器捕获IO操作完成事件,然后将事件传递给对应处理器。比如,在windows上,处理器发起一个异步IO操作,再由事件分离器等待IOCompletion事件。典型的异步模式实现,都建立在操作系统支持异步API的基础之上,我们将这种实现称为“系统级”异步或“真”异步,因为应用程序完全依赖操作系统执行真正的IO工作。

举个例子,将有助于理解Reactor与Proactor二者的差异,以读操作为例(类操作类似)。
在Reactor中实现读:

- 注册读就绪事件和相应的事件处理器
- 事件分离器等待事件
- 事件到来,激活分离器,分离器调用事件对应的处理器。
- 事件处理器完成实际的读操作,处理读到的数据,注册新的事件,然后返还控制权。
在Proactor中实现读:

- 处理器发起异步读操作(注意:操作系统必须支持异步IO)。在这种情况下,处理器无视IO就绪事件,它关注的是完成事件。
- 事件分离器等待操作完成事件
- 在分离器等待过程中,操作系统利用并行的内核线程执行实际的读操作,并将结果数据存入用户自定义缓冲区,最后通知事件分离器读操作完成。
- 事件分离器呼唤处理器。
- 事件处理器处理用户自定义缓冲区中的数据,然后启动一个新的异步操作,并将控制权返回事件分离器。

可以看出,两个模式的相同点,都是对某个IO事件的事件通知(即告诉某个模块,这个IO操作可以进行或已经完成)。在结构上,两者也有相同点:demultiplexor负责提交IO操作(异步)、查询设备是否可操作(同步),然后当条件满足时,就回调handler;不同点在于,异步情况下(Proactor),当回调handler时,表示IO操作已经完成;同步情况下(Reactor),回调handler时,表示IO设备可以进行某个操作(can read or can write)。

2、通俗理解

使用Proactor框架和Reactor框架都可以极大的简化网络应用的开发,但它们的重点却不同。

Reactor框架中用户定义的操作是在实际操作之前调用的。比如你定义了操作是要向一个SOCKET写数据,那么当该SOCKET可以接收数据的时候,你的操作就会被调用;而Proactor框架中用户定义的操作是在实际操作之后调用的。比如你定义了一个操作要显示从SOCKET中读入的数据,那么当读操作完成以后,你的操作才会被调用。

Proactor和Reactor都是并发编程中的设计模式。在我看来,他们都是用于派发/分离IO操作事件的。这里所谓的IO事件也就是诸如read/write的IO操作。"派发/分离"就是将单独的IO事件通知到上层模块。两个模式不同的地方在于,Proactor用于异步IO,而Reactor用于同步IO。

Reactor与Proactor的区别相关推荐

  1. IO:Reactor和Proactor的区别

    系统I/O 可分为阻塞型, 非阻塞同步型.阻塞异步型以及非阻塞异步型. 阻塞型I/O意味着控制权只到调用操作结束了才会回到调用者手里. 同步非阻塞是会立即返回控制权给调用者的.调用者不需要等等,它从调 ...

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

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

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

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

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

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

  5. Reactor 和 Proactor 区别

    Reactor 和 Proactor 区别 同步异步.阻塞非阻塞组合 同步 以read()函数为例,int n = read(fd, buf. sz) 当采用同步的方式和阻塞io的方式时,buf就是从 ...

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

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

  7. 同步和异步, 阻塞和非阻塞, Reactor和Proactor

    http://www.artima.com/articles/io_design_patterns.html http://note.sdo.com/u/1434409594/n/lvRFW~kjR2 ...

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

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

  9. I/O模型系列之四:两种高性能IO设计模式 Reactor 和 Proactor

    不同的操作系统实现的io策略可能不一样,即使是同一个操作系统也可能存在多重io策略,常见如linux上的select,poll,epoll,面对这么多不同类型的io接口,这里需要一层抽象api来完成, ...

最新文章

  1. Oracle数据库——SQL高级查询
  2. java swing 怎么_JAVA SWING 怎么用?帮帮忙.
  3. mysql中视图和表的区别及联系_MySQL中Update、select联用操作单表、多表,及视图与临时表的区别...
  4. Wireshark使用入门
  5. BranchCache实验(1)总部的服务器配置
  6. 【文献阅读】Perceptual Generative Adversarial Networks for Small Object Detection –CVPR-2017
  7. (Abstract Factory)抽象工厂模式的Java实现
  8. 计算机应用基础课件教学大赛,全国“XX杯”说课大赛计算机应用基础类优秀作品:设置IP地址教学课件.ppt...
  9. matlab绘制符号函数的ezplot函数
  10. 26 JS常用数组方法Array对象内置方法——检索方法
  11. 如何自学Android编程?
  12. ICPCCamp 2016 Day 6 - Spb SU and Spb AU Contest(Colored path-dp)
  13. sqlserver数据库限制用户登录失败次数
  14. 微信小程序 实现报表(表格)双指缩放功能
  15. 【去后厂村开游戏厅吧】基于pp-tinypose的体感贪吃蛇游戏
  16. C++利用openssl进行公钥解密
  17. 小功能⭐️Unity中利用材质自发光实现物体闪烁效果
  18. 一个骚操作,公众号粉丝破10万!
  19. 微信(电脑版)多开教程
  20. 机器人单关节力矩控制

热门文章

  1. 基础html定义值——包含 list-style属性
  2. 在vue项目里面的全局页面加备案
  3. centos7时间同步
  4. 微软认知服务:QnA Maker使用示例
  5. 青龙面板 XDD QQ机器人修复方案 22/6/6更新
  6. Android 内存修改与一键修改
  7. C/C++编程:POD类型
  8. 番外篇7-容灾和非容灾相关词语的解释
  9. python任务调度之schedule
  10. Directx 3D - TL渲染流水线