首先分享一下,我在网上看到的两篇不错的文章:正是这两篇文章才理解了reactor和proactor模式;
首先就第一篇《Reactor模式,或者叫反应器模式》做一下笔记:
刚开店做生意,老板为了给顾客一个美好的印象,给顾客最好的服务,一对一:
随着经营的生意越来越好,顾客多了,不能服务员也多吧,那样得支出的成本也太大了,要是一下子来个1000个顾客,难道老板还得养活1000个服务员,没办法,得改变这种服务模式,但又不能让顾客感到这里的服务下降了,怎么办呢?
改革以后,有没有觉得和我们平时去大排档啊,街边小吃店的服务模式很相似是不是,
为什么不说和酒店服务很像,其实还真不像,一般XXX星级的饭店的服务,还真是上一种经营模式,为什么他们要这样呢,
因为,他们是高富帅啊,顾客消费也高,自然老板的收入也高,所以老板也乐子不疲啊。我们是屌丝,请客都只是去个大排档就好了。
改革后的模式就是reactor模式,顾客通过呼叫服务员(event事件)通知服务员,菜单写好了,服务员就会把菜单交给厨师(事件处理器),厨师就会去做菜了。
现在知道reactor模式的由来了吧,知道一个事情的始末会让我们更好的理解它。
下面对第二篇《高性能IO设计的Reactor和Proactor模式》做一下笔记:
这里主要是讲reactor模式和proactor模式的区别:其实就是对数据处理方式变了导致监听事件方式也转变了。
当然,如果还是以第一篇那样以饭店的经营模式来讲解的话,proactor模式应该是这样的:
我们知道每一个饭店都有自己的招牌菜去吸引顾客。当然,其实这道菜你也会做,只是别人做的比你更好,更美味。有一天,一群高富帅来了这家大拍档:
老板就是老板,人面广啊,自家厨师不会做,可以让更专业的人去做,省时省事省心啊!
其实这里我们都能看出reactor模式和proactor模式的一点点区别了吧!只是还不了解具体的细节。
第二篇《性能IO设计的Reactor和Proactor模式》就是干这个事的,给我们介绍具体细节和区别,我也是读了好几遍,慢慢画个流程图才理解了啊。
其实说到底就是一句广告语:把事情交给更专业的人,你会更开心。
好吧,以下是copy过来,做了少少修改的:转换为自己的理解。
在高性能的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 模式是两种常见的事件处理模式,在网络编程中广泛应用于设计高效、可靠的并发和网络应用程序。在本文中,我们将详细介绍 Reactor 和 Proactor ...
本人学习ACE 时候写的关于两种通信方式的实例代码,我把三个连写都写在了一个文件,根据需要注释掉其他的就行。 ACE用于开发通信程序非常方便,尤其相对于WinSock 来说,可以省很多代码,普通程序员也更容易理解
### Proactor模式&Reactor模式详解 #### 一、引言 在服务器端编程领域,构建高效的输入/输出(I/O)模型对于提高程序性能至关重要。根据数据传输方式的不同,通常将I/O模型分为四类:同步阻塞I/O、同步非阻塞I/O、I...
在具体实现上,`Reactor`模式通常使用`select`、`poll`或`epoll`等I/O多路复用技术,而`Proactor`模式则依赖于系统级别的异步I/O支持,如Windows的IOCP,或者在Linux中可以使用AIO(Asynchronous I/O)库。...
Proactor-Reactor 模式详解 Proactor-Reactor 模式是高性能服务器设计的核心思想之一,它们都是基于 I/O 多路复用的技术实现的。下面我们来详细了解 Proactor-Reactor 模式的设计思想和实现机理。 问题背景 在...
C和C++实现和封装不同的网络 IO 模型源码(如 epoll、reactor、io_uring 和 proactor).zip 【说明】 【1】项目代码完整且功能都验证ok,确保稳定可靠运行后才上传。欢迎下载使用!在使用过程中,如有问题或建议,请...
在并发系统设计中,Proactor和Reactor模式是两种常用的设计模式,它们主要用来处理I/O操作的事件派发和分离。这两种模式都是为了提高系统的并发能力,优化资源利用,但它们在处理I/O事件的方式上有所不同。 首先,...
两种高性能IO设计模式(Reactor和Proactor)比较 在高性能服务器设计中,I/O设计模式扮演着至关重要的角色。常见的I/O设计模式有阻塞型、非阻塞同步型和非阻塞异步型。其中,非阻塞异步型I/O设计模式是性能最高、...
使用线程池、非阻塞socket、epoll(ET和LT)、事件处理(Reactor和Proactor)的并发模型 使用状态机解析HTTP请求报文,支持GET和POST请求 实现web端用户注册和登录功能,可以请求服务器图片和视频文件 实现同步/异步日志...
《两种高性能IO设计模式(Reactor/Proactor)的比较》 在构建高性能TCP服务器时,I/O设计模式的选择至关重要,因为它们直接影响系统的性能和可扩展性。本文主要对比了两种主要的I/O多路复用模式:Reactor和Proactor...
常见的网络模式有Reactor和Proactor两种,它们在并发处理和异步操作中扮演着关键角色。 **Reactor模式** Reactor模式是一种事件驱动的设计模式,广泛应用于多线程和网络编程。它的核心思想是通过一个中心调度器...
分析常见高性能网络设计模式,涵盖了reactor, proactor。
"ACE通用服务器ace server"是一个基于ACE库构建的服务器架构,它涵盖了两种核心的设计模式:Reactor和Proactor。这两个模式在并发编程和网络服务领域中具有重要地位,特别是对于高性能、高并发的服务器开发至关重要...
ACE Reactor 模型是 ACE (Adaptive Communication Environment) 库中的核心组件,...在实际项目中,结合 ACE 的其他组件,如 Proactor(用于异步 I/O)、Acceptor(用于接受新连接)等,可以构建出功能丰富的网络服务。
- **Reactor与Proactor的比较**:Reactor更适用于传统的同步I/O操作,而Proactor则更适合异步I/O。 #### 5. ACE Task框架 - **Task框架**:提供了任务管理和调度的能力。 - **ACE_Message_Queue**:用于存储任务...
本文将从同步和异步的概念开始,然后介绍阻塞和非阻塞的区别,接着介绍阻塞IO和非阻塞IO的区别,最后介绍五种IO模型和两种高性能IO设计相关的设计模式(Reactor和Proactor)。 一、同步和异步 同步和异步是IO模型...
(1)使用 线程池 + 非阻塞socket + epoll(ET和LT均实现) + 事件处理(Reactor、Proactor) 的并发模型; (2)使用状态机解析HTTP请求报文,支持解析GET和POST请求; (3)访问服务器数据库实现web端用户注册、登录...
高并发编程会有一些服务器模型,例如reactor或proactor。这两类都要使用到IO多路复用,O多路复用是指单个进程/线程就可以同时处理多个IO请求。有三个方式select、poll、epoll。 select:将文件描述符放入一个集合中...