两种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就绪事件,它关注的是完成事件。
- 事件分离器等待操作完成事件
- 在分离器等待过程中,操作系统利用并行的内核线程执行实际的读操作,并将结果数据存入用户自定义缓冲区,最后通知事件分离器读操作完成。
- 事件分离器呼唤处理器。
- 事件处理器处理用户自定义缓冲区中的数据,然后启动一个新的异步操作,并将控制权返回事件分离器。
实践现状
由Douglas Schmidt等人开发的开源C++开发框架ACE,提供了大量与平台无关,支持并发的底层类(线程,互斥量等),且在高抽象层次上,提供了两组不同的类--ACE Reactor和ACE Proactor的实现。不过,虽然二者都与平台无关,提供的接口却各异。
ACE Proactor在windows平台上具有更为优异的性能表现,因为windows在操作系统提供了高效的异步API支持(见http://msdn2.microsoft.com/en-us/library/aa365198.aspx)。
然而,并非所有的操作系统都在系统级大力支持异步。像很多Unix系统就没做到。因此,在Unix上,选择ACE Reactor解决方案可能更好。但这样一来,为了获得最好的性能,网络应用的开发人员必须为不同的操作系统维护多份代码:windows上以ACE Proactor为基础,而Unix系统上则采用ACE Reactor解决方案。
通俗理解
使用Proactor框架和Reactor框架都可以极大的简化网络应用的开发,但它们的重点却不同。
Reactor框架中用户定义的操作是在实际操作之前调用的。比如你定义了操作是要向一个SOCKET写数据,那么当该SOCKET可以接收数据的时候,你的操作就会被调用;
而Proactor框架中用户定义的操作是在实际操作之后调用的。比如你定义了一个操作要显示从SOCKET中读入的数据,那么当读操作完成以后,你的操作才会被调用。
Proactor和Reactor都是并发编程中的设计模式。在我看来,他们都是用于派发/分离IO操作事件的。这里所谓的IO事件也就是诸如read/write的IO操作。"派发/分离"就是将单独的IO事件通知到上层模块。两个模式不同的地方在于,Proactor用于异步IO,而Reactor用于同步IO。
学习网络编程中...。
分享到:
相关推荐
本文将从同步和异步的概念开始,然后介绍阻塞和非阻塞的区别,接着介绍阻塞IO和非阻塞IO的区别,最后介绍五种IO模型和两种高性能IO设计相关的设计模式(Reactor和Proactor)。 一、同步和异步 同步和异步是IO模型...
Java通常依赖于NIO框架实现Reactor,C#可以利用.NET的`async/await`关键字结合`IOCompletionPort`实现Proactor,而C++可以使用Boost.Asio库来支持这两种模式。每种语言的性能和具体实现细节都需要通过实际测试来评估...
3. **反应堆模式(Reactor)**: - NIO的典型操作模式,应用通过注册感兴趣事件,然后系统异步通知应用程序那些事件已经准备就绪。 - 应用程序处理I/O事件。 4. **前摄器模式(Proactor)**: - 异步I/O的一种...
说起,然后接着阐述了阻塞和非阻塞的区别,接着介绍了阻塞IO和非阻塞IO的区别,然后介绍了同步IO和异步IO的区别,接下来介绍了5种IO模型,后介绍了两种和高性能IO设计相关的设计模式(Reactor和Proactor)。...
同时,他还会讨论Java NIO库如何支持这些模式,例如`java.nio.channels.Selector`在Simple Reactor和Multicast Reactor中的作用,以及`Future`和`CompletableFuture`如何与Proactor模式配合。 在实际开发中,Java的...
- **线程模型**:xSocket可能采用Reactor模式或者Proactor模式,有效地管理了线程资源,提高系统效率。 - **事件驱动**:通过选择器监听通道事件,如连接请求、数据到达等,触发相应的处理器进行处理。 - **协议...
NIO是基于Reactor模式,面向缓冲区并结合通道的IO模型。客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求就进行处理。 AIO : Asynchronous IO,即异步非阻塞,采用了 Proactor 模式,特点...
总而言之,Netty通过优化的NIO模型、Reactor模式和高度可定制的处理流程,为Java开发者提供了构建高性能网络应用的强大工具。学习Netty不仅需要理解IO流的演变,还需要掌握其独特的设计理念和实现机制。通过深入学习...
NIO使用非阻塞IO,基于事件驱动的思想(Reactor线程模型)。这种方式的优点是:可以实现高效的并发处理。 AIO(Asynchronous I/O) AIO方式是JDK1.7中提出的。它的工作原理是:采用Proactor模式。AIO的通知是发生...
4. Reactor和Proactor模式 Reactor模式用于同步IO模型,它预先注册了感兴趣的事件,通过轮询检查事件并顺序处理。Proactor模式用于异步IO模型,当事件发生时,由内核直接处理IO操作,完成后通知应用程序。两者的主要...
Mina采用Java NIO的Reactor实现,模拟Proactor模式。在某些系统中,如Windows,Proactor可以直接利用原生的异步I/O机制,如IO Completion Ports(IOCP),但在其他不支持原生异步I/O的系统上,可以通过Reactor模拟...
1. JAVA IO模型:Reactor 模型和 Proactor 模型的对比,IO 模型的选择对系统性能的影响。 2. JAVA NIO:Introduction to NIO,NIO 的优缺,NIO 的使用场景,NIO 的实现机制。 3. JAVA Netty:Netty 的架构,Netty ...
- **其他变种**:根据具体应用场景,Reactor模式还可以进一步发展和变化,比如Proactor模式等。 4. **Java NIO非阻塞I/O APIs**:NIO提供了不同于BIO的I/O处理方式。NIO的关键组件包括Channels(通道)、Buffers...
与Reactor不同,Proactor模式不关注事件的注册和选择,而是专注于异步操作的处理。在AIO框架中,Proactor组件负责接收来自`AsynchronousServerSocketChannel`的连接,并通过`AsynchronousSocketChannel`进行数据传输...
除了Reactor模式,还有一种称为Proactor模式的设计,它是一种基于操作完成的模型,与Reactor模式不同的是,Proactor模式中所有I/O操作都是由操作系统异步完成的,应用程序在操作完成后得到通知。Java NIO中没有直接...
3. IO模型和网络编程:IO模型包括BIO、NIO、AIO,以及Reactor/Proactor模式。网络编程方面需要理解NioEventLoopGroup/EventLoop、bossGroup/workerGroup、ByteBuff/Acceptor/Channel/Handler等核心基础类。 4. 网络...
注意这里所说的NIO并非Java的NIO(NewIO)库。(3)IO多路复用(IOMultiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。(4)异步IO(AsynchronousIO)...