一、 Reactor and Proactor

1 概述

IO读写时,多路复用机制都会依赖对一个事件多路分离器,负责把源事件的IO 事件分离出来,分别到相应的read/write事件分离器。涉及到事件分离器的两种模式分别就是 Reactor和Proactor,Reactor是基于同步IO的,Proactor是基于异步IO的。

在Reactor模式中,事件分离者等待某个事件或者可应用或个操作的状态发生(比如文件描述符可读写,或者是socket可读写),事件分离者就把这个事件传给事先注册的事件处理函数或者回调函数,由后者来做实际的读写操作。Reactor模式主要是提高系统的吞吐量,理解反应器模式的例子:Reactor模式,或者叫反应器模式

在Proactor模式中,事件处理者(或者代由事件分离者发起)直接发起一个异步读写操作(相当于请求),而实际的工作是由操作系统来完成的。发起时,需要提供的参数包括用于存放读到数据的缓存区,读的数据大小,或者用于存放外发数据的缓存区,以及这个请求完后的回调函数等信息。事件分离者得知了这个请求,它默默等待这个请求的完成,然后转发完成事件给相应的事件处理者或者回调。举例来说,在Windows上事件处理者投递了一个异步IO操作(称有 overlapped的技术),事件分离者等IOCompletion事件完成. 这种异步模式的典型实现是基于操作系统底层异步API的,所以我们可称之为“系统级别”的或者“真正意义上”的异步,因为具体的读写是由操作系统代劳的。

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

在Reactor中实现读:

- 注册读就绪事件和相应的事件处理器

- 事件分离器等待事件

- 事件到来,激活分离器,分离器调用事件对应的处理器。

- 事件处理器完成实际的读操作,处理读到的数据,注册新的事件,然后返还控制权。

与如下Proactor(真异步)中的读过程比较:

- 处理器发起异步读操作(注意:操作系统必须支持异步IO)。在这种情况下,处理器无视IO就绪事件,它关注的是完成事件。

- 事件分离器等待操作完成事件

- 在分离器等待过程中,操作系统利用并行的内核线程执行实际的读操作,并将结果数据存入用户自定义缓冲区,最后通知事件分离器读操作完成。

- 事件分离器呼唤处理器。

- 事件处理器处理用户自定义缓冲区中的数据,然后启动一个新的异步操作,并将控制权返回事件分离器。

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

不同点在于,异步情况下(Proactor),当回调handler时,表示IO操作已经完成;同步情况下(Reactor),回调handler时,表示IO设备可以进行某个操作(can read or can write),handler这个时候开始提交操作。

2、Reactor模式

Reactor释义“反应堆”,是一种事件驱动机制。和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的时间发生,Reactor将主动调用应用程序注册的接口,这些接口又称为“回调函数”。使用Libevent也是想Libevent框架注册相应的事件和回调函数;当这些时间发声时,Libevent会调用这些回调函数处理相应的事件(I/O读写、定时和信号)。
    用“好莱坞原则”来形容Reactor再合适不过了:不要打电话给我们,我们会打电话通知你。

3、两个模式简单对比

两个模式的相同点:(1)都是对某个IO事件的事件通知(即告诉某个模块,这个IO操作可以进行或已经完成)。(2)在结构上的相同点:demultiplexor负责提交IO操作(异步)、查询设备是否可操作(同步),然后当条件满足时,就回调handler。

不同点在于:异步情况下(Proactor),当回调handler时,表示IO操作已经完成;同步情况下(Reactor),回调handler时,表示IO设备可以进行某个操作(can read or can write),handler这个时候开始提交操作。

我的理解:两者的根本区别就在于《Unix网络编程第一卷:套接口API》第6章讲解的五种I/O模型,Proactor是基于异步I/O,Reactor是同步I/O(一般是I/O复用)。但是现在的操作系统并不是都能很好的真正支持异步I/O,比如Windows里有真正的异步I/O——IOCP,而Unix、Linux并没有真正实现异步I/O。所以考虑程序移植性以及现在很多服务器基于Unix,Linux;Proactor封装了这种差异,在内部异步事件分离器实现时根据系统的不同调用相应的I/O模式。

二、BIO、NIO、AIO

NIO通常采用Reactor模式,AIO通常采用Proactor模式。AIO简化了程序的编写,stream的读取和写入都有OS来完成,不需要像NIO那样子遍历Selector。Windows基于IOCP实现AIO,Linux只有eppoll模拟实现了AIO。

Java7之前的JDK只支持NIO和BIO,从7开始支持AIO。

4种通信方式:TCP/IP+BIO, TCP/IP+NIO, UDP/IP+BIO, UDP/IP+NIO。

TCP/IP+BIO、

Socket和ServerSocket实现,ServerSocket实现Server端端口监听,Socket用于建立网络IO连接。

不适用于处理多个请求 1.生成Socket会消耗过多的本地资源。2. Socket连接的建立一般比较慢。

BIO情况下,能支持的连接数有限,一般都采取accept获取Socket以后采用一个thread来处理,one connection one thread。无论连接是否有真正数据请求,都需要独占一个thread。

可以通过设立Socket池来一定程度上解决问题,但是使用池需要注意的问题是:1. 竞争等待比较多。 2. 需要控制好超时时间。

TCP/IP+NIO

使用Channel(SocketChannel和ServerSocketChannel)和Selector。

Server端通常由一个thread来监听connect事件,另外多个thread来监听读写事件。这样做的好处是这些连接只有在真是请求的时候才会创建thread来处理,one request one thread。这种方式在server端需要支持大量连接但这些连接同时发送请求的峰值不会很多的时候十分有效。

UDP/IP+BIO

DatagramSocket和DatagramPacket。DatagramSocket负责监听端口以及读写数据,DatagramPacket作为数据流对象进行传输。

UDP/IP是无连接的,无法进行双向通信,除非双方都成为UDP Server。

UDP/IP+NIO

通过DatagramChannel和ByteBuffer实现。DatagramChannel负责端口监听及读写。ByteBuffer负责数据流传输。

如果要将消息发送到多台机器,如果为每个目标机器都建立一个连接的话,会有很大的网络流量压力。这时候可以使用基于UDP/IP的Multicast协议传输,Java中可以通过MulticastSocket和DatagramPacket来实现。

Multicast一般多用于多台机器的状态同步,比如JGroups。SRM, URGCP都是Multicast的实现方式。eBay就采用SRM来实现将数据从主数据库同步到各个搜索节点机器。

参考:http://simpleframework.net/blog/v/20096.html

http://blog.csdn.net/success041000/article/details/6725110

Reactor模式--VS--Proactor模式相关推荐

  1. Reactor模式与Proactor模式

    博主一脚刚踏进分布式的大门(看<分布式Java应用>,如果大家有啥推荐的书欢迎留言~),发现书中对NIO采用的Reactor模式.AIO采用的Proactor模式一笔带过,好奇心趋势我找了 ...

  2. 高性能IO设计中的Reactor模式与Proactor模式

    为什么80%的码农都做不了架构师?>>>    在高性能的IO设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proacto ...

  3. Linux服务器 | 事件处理模式:Reactor模式、Proactor模式

    文章目录 Reactor模式 Proactor模式 同步I/O模型模拟Proactor模式 两者的优缺点 Reactor Proactor 同步I/O模型通常用于实现 Reactor 模式,异步I/O ...

  4. Rector模式和Proactor模式

    在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作. 在比较这两个模式之前,我们首先的搞明白 ...

  5. Linux网络编程 | 事件处理模式:Reactor模式、Proactor模式

    文章目录 Reactor模式 Proactor模式 同步I/O模型模拟Proactor模式 两者的优缺点 Reactor Proactor 随着网络设计模式的兴起,Reactor和Proactor事件 ...

  6. Reactor模式和Proactor模式

    同步IO模型通常用户实现Reactor模式,异步IO模型用于实现Proactor模式,不过也可以使用同步IO去模式Proactor模式. 1.Reactor模式 Reactor是这样的一种模式,它要求 ...

  7. 【IO】IO设计模式:TPR模式,Reactor模式、Proactor模式

    1.TPR模式 传统的 Server/Client 模式会基于TPR(Thread per Request),服务器会为每个客户端请求建立一个线程,由该线程单独负责处理一个客户请求. 这种模式虽然处理 ...

  8. Rector模式和同步IO模拟Reactor模式,proactor模式和异步IO模拟proactor模式

    Reactor模式本身就是一种同步IO模式 Reactor模式的流程如下: 1.应用程序注册socket的读写就绪事件,和事件处理器 2.事件分类器等待读写就绪事件 3.当事件分离器监听到读写就绪事件 ...

  9. 两种IO模式:Proactor与Reactor模式

    在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作. 在比较这两个模式之前,我们首先的搞明白 ...

  10. 高性能IO设计的Reactor和Proactor模式(转)

    在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作. 在比较这两个模式之前,我们首先的搞明白 ...

最新文章

  1. ASP.NET Core 1.0 使用 MySQL for EF Core 1.0 (.NET Core 1.0)
  2. 阶跃函数和冲击函数相关性质及傅立叶变换求取方法
  3. FASTSCRIPT脚本实现多国语言
  4. navicat远程连接mysql很慢_解决Navicat远程连接mysql很慢的方法
  5. JsonHelper Json转xml,Json转DataSet,DataSet转Json
  6. PHP线程安全和非线程安全有什么区别
  7. MySQL grant、revoke 用户权限注意事项
  8. 解析ES6箭头函数中的this
  9. 2017年微商方向选择
  10. 网络性能指标及测试方法
  11. [跟进]_微软关闭MSN博客,腾讯第一时间抢占市场
  12. 专有名词collect
  13. 无线传感器网络的时钟同步估计问题(Matlab代码实现)
  14. 我把csdn版权标志隐藏了.
  15. 可视化百分比数据,Excel图表展示小技巧
  16. Power OJ 2844: New contest【模拟】
  17. 一款可以批量检测百度违规屏蔽关键词工具
  18. 计算机维修技能培训,计算机维修基本技能培训大纲.doc
  19. 给自己的一封信(给未来,也给现在)
  20. 鸿泰智能潘帆:义无反顾加盟鸿雁,疫情后半年做出300万业绩

热门文章

  1. Python图像增强
  2. HTML、CSS、JS(JAVA Sprict)
  3. scala中sealed关键字使用指南
  4. linux内核mtd分区,linux内核MTD分区
  5. Linux-字符串截取
  6. 布施持戒忍辱精进禅定般若——净空法师【转】
  7. 百度地图经纬度和像素坐标互转
  8. protractor 添加测试报告
  9. 平均每个ICO项目存在5个高危漏洞,所有ICO移动应用都存在安全漏洞
  10. 银行管理系统 - 2022计科实训QT课设