`

两种I/O多路复用模式 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)。

2、通俗理解

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

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

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

3、备注

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

转:http://www.cnblogs.com/dawen/archive/2011/05/18/2050358.html

分享到:
评论

相关推荐

    actor和proactor模式1

    在具体实现上,`Reactor`模式通常使用`select`、`poll`或`epoll`等I/O多路复用技术,而`Proactor`模式则依赖于系统级别的异步I/O支持,如Windows的IOCP,或者在Linux中可以使用AIO(Asynchronous I/O)库。...

    p401 - p418 proactor -Reactor模型

    Reactor 模式是基于 I/O 多路复用的技术实现的,它主要由 Reactor 和处理资源池这两个核心部分组成。Reactor 负责监听和分发事件,事件类型包含连接事件、读写事件;处理资源池负责处理事件,如 read -> 业务逻辑 ->...

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

    本文主要对比了两种主要的I/O多路复用模式:Reactor和Proactor,这两种模式都是为了克服传统阻塞I/O的性能瓶颈而提出的。 首先,阻塞I/O在调用操作时会占用调用线程,直到操作完成,导致资源浪费和低效率。而非阻塞...

    C++多线程编程介绍,技巧及注意要点-Part_3.pptx

    进一步讨论,Proactor和Reactor模式是异步I/O的两种实现方式。同步I/O操作(如传统的阻塞I/O)是顺序等待的,而异步I/O则允许在等待期间执行其他任务。在Proactor模式下,操作系统负责完成I/O操作并触发回调,而在...

    ACE.rar_ACE 网络 编程_visual c

    1. Reactor模式:这是ACE的核心,用于处理I/O事件,实现事件多路复用。Reactor可以监听多个描述符,当有事件发生时,它会调用相应的处理函数。 2. Proactor模式:与Reactor类似,但更适用于异步I/O操作,如Windows下...

    ACE中文技术开发文档

    - **多路复用I/O**:如Epoll、Kqueue等,ACE对这些机制进行了抽象,使得跨平台的多路复用I/O成为可能。 - **错误处理和调试**:ACE提供了丰富的错误处理机制和调试工具,方便开发者调试和优化代码。 4. **实例与...

    阻塞式客户端服务器

    为了解决这个问题,非阻塞式网络编程模型应运而生,如I/O多路复用(如select、poll、epoll)、异步I/O(如AIO)和事件驱动编程(如Reactor或Proactor模式)。这些模型允许服务器处理更多的并发连接,提高系统的可...

    epoll文档.zip

    **epoll**是Linux内核提供的一种高效I/O事件通知机制,主要用于解决多路复用I/O中的性能问题。在高并发服务器开发中,epoll是实现高性能网络编程的重要工具。下面将详细介绍epoll的优越性、工作原理、使用方法以及...

    unix网络编程技术与分析.rar

    - 非阻塞I/O和多路复用:通过fcntl()或select/poll/epoll等机制,实现非阻塞的网络通信,提高系统资源利用率。 - 错误处理:学会处理各种网络异常,如EINTR、ECONNREFUSED、EHOSTUNREACH等错误。 - 连接管理:处理半...

    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...

    聊聊Netty那些事儿之从内核角度看IO模型.doc

    两种IO线程模型是Reactor模型和Proactor模型。Reactor模型是将IO操作和事件处理分离的模型,而Proactor模型是将IO操作和事件处理合并的模型。Netty中的Reactor模型是使用Reactor模型来实现的。 5. Netty中的Reactor...

    后台开发核心技术面试集锦

    - 引入了二进制分帧、多路复用等特性,进一步提升了性能。 **2.9 安全问题** - **CSRF与XSS** - CSRF(跨站请求伪造)是一种利用用户身份执行恶意操作的攻击手段;XSS(跨站脚本攻击)则是向网页注入恶意脚本的...

Global site tag (gtag.js) - Google Analytics