关闭

reactor和proactor模式

129人阅读 评论(0) 收藏 举报

首先分享一下,我在网上看到的两篇不错的文章:正是这两篇文章才理解了reactor和proactor模式;

 Reactor模式,或者叫反应器模式

高性能IO设计的Reactor和Proactor模式

 首先就第一篇《Reactor模式,或者叫反应器模式》做一下笔记:

 

刚开店做生意,老板为了给顾客一个美好的印象,给顾客最好的服务,一对一:

 

随着经营的生意越来越好,顾客多了,不能服务员也多吧,那样得支出的成本也太大了,要是一下子来个1000个顾客,难道老板还得养活1000个服务员,没办法,得改变这种服务模式,但又不能让顾客感到这里的服务下降了,怎么办呢?

 

改革以后,有没有觉得和我们平时去大排档啊,街边小吃店的服务模式很相似是不是,

为什么不说和酒店服务很像,其实还真不像,一般XXX星级的饭店的服务,还真是上一种经营模式,为什么他们要这样呢,

因为,他们是高富帅啊,顾客消费也高,自然老板的收入也高,所以老板也乐子不疲啊。我们是屌丝,请客都只是去个大排档就好了。

 

改革后的模式就是reactor模式,顾客通过呼叫服务员(event事件)通知服务员,菜单写好了,服务员就会把菜单交给厨师(事件处理器),厨师就会去做菜了。

 

 

现在知道reactor模式的由来了吧,知道一个事情的始末会让我们更好的理解它。

下面对第二篇《高性能IO设计的Reactor和Proactor模式》做一下笔记:

这里主要是讲reactor模式和proactor模式的区别:其实就是对数据处理方式变了导致监听事件方式也转变了。

当然,如果还是以第一篇那样以饭店的经营模式来讲解的话,proactor模式应该是这样的:

 

我们知道每一个饭店都有自己的招牌菜去吸引顾客。当然,其实这道菜你也会做,只是别人做的比你更好,更美味。有一天,一群高富帅来了这家大拍档:

 

 

老板就是老板,人面广啊,自家厨师不会做,可以让更专业的人去做,省时省事省心啊!

 

其实这里我们都能看出reactor模式和proactor模式的一点点区别了吧!只是还不了解具体的细节。

第二篇《性能IO设计的Reactor和Proactor模式》就是干这个事的,给我们介绍具体细节和区别,我也是读了好几遍,慢慢画个流程图才理解了啊。

其实说到底就是一句广告语:把事情交给更专业的人,你会更开心。

 

好吧,以下是copy过来,做了少少修改的:转换为自己的理解

        

 

       在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作。


       在比较这两个模式之前,我们首先的搞明白几个概念,什么是阻塞和非阻塞,什么是同步和异步;

 

       同步和异步是针对应用程序和内核的交互而言的;

       同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,

       异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。

 

       阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式;

       阻塞方式下读取或者写入函数将一直等待,

       非阻塞方式下,读取或者写入函数会立即返回一个状态值。


        一般来说I/O模型可以分为:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO


同步阻塞IO:

在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。Java传统的IO模型属于此种方式!


同步非阻塞IO:

在此种方式下,用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。



异步阻塞IO:

此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因为此时是通过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄,从而提高系统的并发性!



异步非阻塞IO:

在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。目前Java中还没有支持此种IO模型。



搞清楚了以上概念以后,我们再回过头来看看,Reactor模式和Proactor模式。

首先来看看Reactor模式,Reactor模式应用于同步I/O的场景。我们以读操作为例来看看Reactor中的具体步骤:

读取操作:

1. 应用程序注册读就需事件和相关联的事件处理器

2. 事件分离器等待事件的发生

3. 当发生读就需事件的时候,事件分离器调用第一步注册的事件处理器

4. 事件处理器首先执行实际的读取操作,然后根据读取到的内容进行进一步的处理

 

下面我们来看看Proactor模式中读取操作和写入操作的过程:

读取操作:

1. 应用程序初始化一个异步读取操作,然后注册相应的事件处理器,此时事件处理器不关注读取就绪事件,而是关注读取完成事件,这是区别于Reactor的关键。

2. 事件分离器等待读取操作完成事件

3. 在事件分离器等待读取操作完成的时候,操作系统调用内核线程完成读取操作,并将读取的内容放入用户传递过来的缓存区中。这也是区别于Reactor的一点,Proactor中,应用程序需要传递缓存区。

4. 事件分离器捕获到读取完成事件后,激活应用程序注册的事件处理器,事件处理器直接从缓存区读取数据,而不需要进行实际的读取操作。


Proactor中写入操作和读取操作,只不过感兴趣的事件是写入完成事件。



从上面可以看出,Reactor和Proactor模式的主要区别就是真正的读取和写入操作是有谁来完成的,Reactor中需要应用程序自己读取或者写入数据,而Proactor模式中,应用程序不需要进行实际的读写过程,它只需要从缓存区读取或者写入即可,操作系统会读取缓存区或者写入缓存区到真正的IO设备.


综上所述,同步和异步是相对于应用和内核的交互方式而言的,同步 需要主动去询问,而异步的时候内核在IO事件发生的时候通知应用程序,而阻塞和非阻塞仅仅是系统在调用系统调用的时候函数的实现方式而已。

 

最后来两张图做个总结:

 

0
0
查看评论

两种高效的服务器设计模型:Reactor和Proactor模型

I/O模型 在文章《unix网络编程》(12)五种I/O模型中提到了五种I/O模型,其中前四种:阻塞模型、非阻塞模型、信号驱动模型、I/O复用模型都是同步模型;还有一种是异步模型。 Reactor模型         Reac...
  • u013074465
  • u013074465
  • 2015-05-30 18:25
  • 6604

Reactor与Proactor的区别

1、标准定义 两种I/O多路复用模式:Reactor和Proactor 一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)...
  • windows_nt
  • windows_nt
  • 2014-05-06 17:42
  • 4065

proactor 与 actor 模式

Proactor和Reactor都是并发编程的设计模式。不同之处在于,Proactor是异步,Reactor是同步阻塞。 相同点:demultiplexor负责提交IO操作(异步)、查询设备是否可操作(同步),然后当条件满足时,就回调handler。 不同点:异步情况下(Proactor),当回...
  • zhiliaoniu
  • zhiliaoniu
  • 2015-06-16 15:54
  • 627

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

IO设计模式:Reactor和Proactor对比 平时接触的开源产品如Redis、ACE,事件模型都使用的Reactor模式;而同样做事件处理的Proactor,由于操作系统的原因,相关的开源产品也少;这里学习下其模型结构,重点对比下两者的异同点; 反应器Reactor Reactor模...
  • wanbf123
  • wanbf123
  • 2017-09-22 14:44
  • 293

关于Reactor和Proactor的区别

系统I/O 可分为阻塞型, 非阻塞同步型以及非阻塞异步型。 阻塞型I/O意味着控制权只到调用操作结束了才会回到调用者手里。 非阻塞同步是会立即返回控制权给调用者的。调用者不需要等等,它从调用的函数获取两种结果:要么此次调用成功进行了;要么系统返回错误标识告诉调用者当前资源不可用,你再等等或者再...
  • yygydjkthh
  • yygydjkthh
  • 2015-07-12 21:20
  • 2272

libevent高性能网络库源码分析——Reactor模式(二)

IO模型介绍 Reactor模式IO模型介绍在介绍libevent的Reactor模式之前,首先介绍下IO模型的: 1、 同步阻塞IO(Blocking IO): 即传统的IO模型。当用户进程向系统发起read操作时,首先需要在内核中数据准备和内核态到用户进程的数据拷贝。当两个步骤都完成后,才会...
  • wzgang123
  • wzgang123
  • 2016-04-18 20:28
  • 753

boost asio学习笔记1--Reactor与Proactor模式

boost asio(异步输入输出) 为什么会想学习asio,起初是想了解c++的网络编程,接着去深入的了解有没有什么实用的网络库,现在网上比较流行的就是ACE, libevent和boost.asio。开始的时候去了解一下ACE,但是明显感觉这是一个重量级的网络通信库,其中有较多的设计模式。相比...
  • u013246898
  • u013246898
  • 2016-07-27 11:41
  • 1132

I/O事件处理模型之Reactor和Proactor

在编写服务端软件的时候,如何处理各种I/O事件是其中很重要的一部分。在Unix Network Programming中介绍了5种Unix/Linux下可用的I/O编程模型:1)阻塞式I/O; 2)非阻塞式I/O; 3)I/O复用; 4)信号驱动式I/O; 5)异步I/O。这几种都是基本的I/O...
  • guomei
  • guomei
  • 2014-05-07 00:49
  • 688

Java 高性能I/O设计模式Reactor和Proactor

reference:http://projectreactor.io/core/docs/reference/ apI:http://projectreactor.io/core/docs/api/ github地址:http://github.com/reactor maven:仓库地址: &#...
  • u013732449
  • u013732449
  • 2016-06-06 23:48
  • 415

彻底理解:阻塞、非阻塞、同步、异步、Reactor、Proactor

我以前是写AS3的,事件和回调无处不在,天生就是异步的,很少需要讨论这些概念。现在写C#,这些概念提的就多了,所以需要彻底搞明白。如果把技术的逻辑抽象出来,跟生活中的逻辑做比较,你会发现技术包含的道理是多么的朴素呀。 1、阻塞:阻塞是指当前线程被堵住了,不能继续往下执行了,就被操作系统挂起了。 ...
  • llj1985
  • llj1985
  • 2016-06-01 20:06
  • 1324
    个人资料
    • 访问:761119次
    • 积分:8904
    • 等级:
    • 排名:第2555名
    • 原创:99篇
    • 转载:394篇
    • 译文:2篇
    • 评论:64条
    最新评论