Reactor模式和Proactor模式

原创 2013年12月02日 14:35:33

一般地,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。

3、备注

其实这两种模式在ACE(网络库)中都有体现;如果要了解这两种模式,可以参考ACE的源码,ACE是开源的网络框架,非常值得一学。。

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

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

Java网络编程(四) Reactor和Proactor模式

http://zhaohuiopensource.iteye.com/blog/1517730 在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模...
  • ckchenwei
  • ckchenwei
  • 2016年07月03日 12:02
  • 724

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

IO模型介绍 Reactor模式IO模型介绍在介绍libevent的Reactor模式之前,首先介绍下IO模型的: 1、 同步阻塞IO(Blocking IO): 即传统的IO模型。当用户进程向系...
  • wzgang123
  • wzgang123
  • 2016年04月18日 20:28
  • 699

netty学习笔记(一)—结合reactor模式探索netty对网络io的处理机制

Reactor与Proactor简介 reactor、proactor常见的翻译是反应器(堆)、前摄器,这名字听着总让人一头雾水的,抓不着本质。后来看看对应形容词的英文释义,再结合技术角度的描述,总算...
  • u011090495
  • u011090495
  • 2014年03月19日 00:16
  • 4332

Reactor模式和Proactor模式

一、Reactor模式(反应器模式) 1、Reactor模式的特点 Reactor用于同步I/O,同步是指用户进程触发IO操作并等待或去轮询的查看I/O操作是否就绪,如果事件就绪的话需要应...
  • LF_2016
  • LF_2016
  • 2017年05月25日 09:41
  • 576

Reactor模式和Proactor模式

Reactor模式和Proactor模式同步I/O和异步I/O 同步I/O: 在同步文件IO方式中,线程启动一个IO操作然后就立即进入等待状态,直到IO操作完成后才醒来继续执行。 异步I...
  • hbtj_1216
  • hbtj_1216
  • 2017年07月19日 12:58
  • 104

Reactor模式和Proactor模式

先介绍Rector模式,Reactor这个词译成汉语还真没有什么合适的,很多地方叫反应器模式,但更多好像就直接叫reactor模式了,其实我觉着叫应答者模式更好理解一些。通过了解,这个模式更像一个侍卫...
  • cppxiaoyin
  • cppxiaoyin
  • 2013年03月21日 15:29
  • 490

reactor模式和Proactor模式

最近在研究boost异步io,但是具体原理还是很混乱,现在理清一下思路,对普通函数和reactor模式和proactor模式进行比较 普通函数处理机制: 程序调用接口函数 -> 函数执行,程序等待...
  • xiongping_
  • xiongping_
  • 2016年04月05日 11:19
  • 231

reactor模式与proactor模式

首先分享一下,我在网上看到的两篇不错的文章:正是这两篇文章才理解了reactor和proactor模式;Reactor模式,或者叫反应器模式高性能IO设计的Reactor和Proactor模式首先就第...
  • github_33736971
  • github_33736971
  • 2016年08月05日 10:10
  • 123

reactor模式C++实现

copy from github上的一份实现。。。找不到链接了。。。 感觉epoll主要负责fd到event类型的映射,而reactor模式管理fd event类型 eventhandler具体...
  • u011693064
  • u011693064
  • 2017年05月11日 14:28
  • 303
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Reactor模式和Proactor模式
举报原因:
原因补充:

(最多只允许输入30个字)