原文来自:http://simpleframework.net/bbs/835/14129.html
在高性能的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事件发生的时候通知应用程序,而阻塞和非阻塞仅仅是系统在调用系统调用的时候函数的实现方式而已
分享到:
相关推荐
Reactor 和 Proactor 模式是两种常见的事件处理模式,在网络编程中广泛应用于设计高效、可靠的并发和网络应用程序。在本文中,我们将详细介绍 Reactor 和 Proactor 模式的概念、特点、优缺点,以及在网络编程中的...
epoll、reactor、io_uring 和 proactor).zipC和C++实现和封装不同的网络 IO 模型源码(如 epoll、reactor、io_uring 和 proactor).zipC和C++实现和封装不同的网络 IO 模型源码(如 epoll、reactor、io_uring 和 ...
文章比较了Java、C#和C++对Reactor和Proactor设计模式的实现和性能,并提供了一种跨平台的设计模式(解决方案),希望能够给高性能服务器开发者一些帮助,选择最佳的设计方案。 在选择I/O设计模式时,需要考虑到...
总的来说,Reactor模式适合于同步I/O环境,而Proactor模式利用异步I/O提供更高的并发性和性能。选择哪种模式取决于具体的应用场景和需求,例如服务器的并发连接数、系统资源限制以及对实时性的要求。在设计高性能...
在IT领域,特别是网络编程和并发处理中,`Actor`和`Proactor`模式是两种重要的设计模式,它们主要用于高效地处理I/O操作。这两种模式都涉及到如何有效地管理多个并发的I/O请求,以提高系统性能和响应速度。 首先,...
本文旨在详细介绍这些I/O模型,并着重解析Reactor模式与Proactor模式的设计思想及其应用场景。 #### 二、同步阻塞I/O (Blocking I/O) 同步阻塞I/O是最基本且最直观的I/O处理方式。在这种模式下,应用程序发出I/O...
本人学习ACE 时候写的关于两种通信方式的实例代码,我把三个连写都写在了一个文件,根据需要注释掉其他的就行。 ACE用于开发通信程序非常方便,尤其相对于WinSock 来说,可以省很多代码,普通程序员也更容易理解
在并发系统设计中,Proactor和Reactor模式是两种常用的设计模式,它们主要用来处理I/O操作的事件派发和分离。这两种模式都是为了提高系统的并发能力,优化资源利用,但它们在处理I/O事件的方式上有所不同。 首先,...
本文将从同步和异步的概念开始,然后介绍阻塞和非阻塞的区别,接着介绍阻塞IO和非阻塞IO的区别,最后介绍五种IO模型和两种高性能IO设计相关的设计模式(Reactor和Proactor)。 一、同步和异步 同步和异步是IO模型...
Proactor-Reactor 模式详解 Proactor-Reactor 模式是高性能服务器设计的核心思想之一,...学习 Reactor 模式的设计思想可以帮助我们更好地设计高性能的服务器程序,并且也可以帮助我们更好地理解开源软件的设计思想。
高性能Server-Reactor模型是构建高效能网络服务的核心设计模式,尤其在Java领域中广泛应用。该模型主要用于解决C/S(客户端/服务器)架构中的高并发、低延迟问题,特别是在现代互联网应用如电子邮件、视频流媒体、...
分析常见高性能网络设计模式,涵盖了reactor, proactor。
Reactor模式是一种事件驱动的设计模式,主要用于解决高并发场景下的系统设计问题,而Java的NIO(Non-blocking Input/Output,非阻塞I/O)是Java平台提供的一种I/O模型,它支持基于事件的多路复用,为实现Reactor模式...
同时,他还会讨论Java NIO库如何支持这些模式,例如`java.nio.channels.Selector`在Simple Reactor和Multicast Reactor中的作用,以及`Future`和`CompletableFuture`如何与Proactor模式配合。 在实际开发中,Java的...
在实际应用中,比如开发服务器或者网络库时,理解并合理运用Reactor和Proactor模式,能够帮助我们构建出高并发、高性能的网络服务。对于开发者来说,熟悉这些模式,不仅可以提升代码质量,还能提高解决问题的能力。...
高性能网络设计-网络编程(网络io与select、poll、epoll,reactor原理与实现、http服务器实现、websocket协议与服务器实现)与网络原理(服务器百万并发,网络协议栈,UDP可靠传输协议QUIC),协程框架NtyCo的实现....
在高性能服务器设计中,Reactor模型是一种广泛使用的I/O模型,它是一种基于事件驱动的反应器设计模式。该模型包括以下几个主要部分: - **事件分离器(Event Demultiplexer)**:负责监听事件,当事件发生时,将...
Easy-Reactor是一个Linux C++高性能TCP服务框架,基于Reactor模式,支持单线程、多线程Reactor,也支持UDP服务 C++是一种广泛使用的编程语言,它是由Bjarne Stroustrup于1979年在新泽西州美利山贝尔实验室开始...