`
CshBBrain
  • 浏览: 638263 次
  • 性别: Icon_minigender_1
  • 来自: 成都
博客专栏
B7d9bf34-126e-301f-819e-81f2615b5a2a
开源WebSocket服务...
浏览量:142155
Group-logo
HTML5移动开发
浏览量:135509
社区版块
存档分类
最新评论

reactor和proactor模式的比较

阅读更多

转自:http://blog.163.com/zongyuan1987@126/blog/static/13162315620108902130394/

reactor与proactor的概念
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),handler这个时候开始提交操。
2、通俗理解
使用Proactor框架和Reactor框架都可以极大的简化网络应用的开发,但它们的重点却不同。
Reactor框架中用户定义的操作是在实际操作之前调用的。比如你定义了操作是要向一个SOCKET写数据,
那么当该SOCKET可以接收数据的时候,你的操作就会被调用;
而Proactor框架中用户定义的操作是在实际操作之后调用的。比如你定义了一个操作要显示从SOCKET中读入的数据,
那么当读操作完成以后,你的操作才会被调用。
Proactor和Reactor都是并发编程中的设计模式。在我看来,他们都是用于派发/分离IO操作事件的。
这里所谓的IO事件也就是诸如read/write的IO操作。"派发/分离"就是将单独的IO事件通知到上层模块。
两个模式不同的地方在于,Proactor用于异步IO,而Reactor用于同步IO。

分享到:
评论

相关推荐

    Proactor模式&Reactor模式详解

    ACE proactor 与 Reactor 模式的详解

    actor和proactor模式1

    2. 注册EventHandler到InitiationDispatcher中,每个EventHandler包含对相应Handle的引用,从而建立Handle到

    Proactor和Reactor模式_继续并发系统设计的扫盲[参照].pdf

    Proactor和Reactor模式_继续并发系统设计的扫盲[参照].pdf

    网络服务设计模式

    分析常见高性能网络设计模式,涵盖了reactor, proactor。

    Network Pattern

    Network Pattern 常用的网络编程模式,如Reactor、Proactor

    netty原理的讲解

    从IO流到BIO,再到NIO,AIO,以及Reactor模式和Proactor模式来分析netty

    从零学架构无评论版

    介绍 PPC、TPC、Reactor、Proactor 模型提升性能,以及负载均衡的分类与架构、算法与优缺点。 高可用架构模式:将介绍 CAP 原理的理解和应用、FMEA 分析方法;从主备、主从、主主、集群、分区详解常见的高可用存储...

    Java NIO:浅析I/O模型

    说起,然后接着阐述了阻塞和非阻塞的区别,接着介绍了阻塞IO和非阻塞IO的区别,然后介绍了同步IO和异步IO的区别,接下来介绍了5种IO模型,后介绍了两种和高性能IO设计相关的设计模式(Reactor和Proactor)。...

    ACE服务器 全面开源

    很全面的ACE服务器,包括proactor、reactor模式

    Netty高性能网络应用框架.rar

    AIO : Asynchronous IO,即异步非阻塞,采用了 Proactor 模式,特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用。 既然BIO和NIO都是以同步的方式工作的,那么...

    ACE技术论文集(已翻译为中文)

    第 8 章 前摄器(Proactor):用于为异步事件多路分离和分派处理器的对象行为模式 第 9 章 接受器-连接器(Acceptor-Connector):用于连接和初始化通信服务的对象创建模式 第 10 章 服务配置器(Service ...

    ACE技术内幕:深入解析ACE架构设计与实现原理

    全书一共7章,详细分析了ace的reactor、serviceconfigurator、task、acceptor_connector、proactor和streams等6个框架的架构设计与实现原理。每个框架的分析分为3部分:,框架的设计分析,每个框架(除task框架)都...

    高性能IO模型浅析

    (3)IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。 (4)异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非...

    Linux高性能服务器编程

    第8章 高性能服务器程序框架 8.1 服务器模型 8.1.1 CS模型 8.1.2 P2P模型 8.2 服务器编程框架 8.3 IO模型 8.4 两种高效的事件处理模式 8.4.1 Reactor模式 8.4.2 Proactor模式 8.4.3 模拟Proactor模式 8.5...

    非阻塞式服务器Web.Java.zip

    文件服务采用了Proactor模式,并搭配304状态使用,能极大的提高静态文件的相应速度,且不影响整体。 模板引擎 简单的标签:只需要记住{{}}标签用于输出变量,{%%}标签用于if,for 等操作。 ...

    两种高性能IO设计模式(ReactorProactor)的比较

    这篇文章是在《程序员》上发表的 在豆丁上要3分 拿过来分享下 要个1分 安慰下

    剖析Python的Twisted框架的核心特性

    而关于proactor(主动器)和reactor(反应堆),这里有一篇推荐博客有比较详细的介绍。 就reactor模式的网络IO而言,应该是同步IO而不是异步IO。而Dave第一章中提到的异步,核心在于:显式地放弃对任务的控制权而不是被...

    Socket高性能IO模型浅析

    (3)IO多路复用(IOMultiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。(4)异步IO(AsynchronousIO):即经典的Proactor设计模式,也称为异步非...

Global site tag (gtag.js) - Google Analytics