前言
一般地,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主动器:
应 用程序启动,调用异步操作处理器提供的异步操作接口函数,调用之后应用程序和异步操作处理就独立运行;应用程序可以调用新的异步操作,而其它操作可以并发 进行; 应用程序启动Proactor主动器,进行无限的事件循环,等待完成事件到来; 异步操作处理器执行异步操作,完成后将结果放入到完成事件队列; 主动器从完成事件队列中取出结果,分发到相应的完成事件回调函数处理逻辑中;
两种模式的步骤
标准的经典的 Reactor模式:
-
步骤 1) 等待事件 (Reactor 的工作)
-
步骤 2) 发”已经可读”事件发给事先注册的事件处理者或者回调 ( Reactor 要做的)
-
步骤 3) 读数据 (用户代码要做的)
-
步骤 4) 处理数据 (用户代码要做的)
Proactor模式:
-
步骤 1) 等待事件 (Proactor 的工作)
-
步骤 2) 读数据(看,这里变成成了让 Proactor 做这个事情,可用用操作系统的异步io函数,也可以用一个主线程来模拟异步io)
-
步骤 3) 把数据已经准备好的消息给用户处理函数,即事件处理者(Proactor 要做的)
-
步骤 4) 处理数据 (用户代码要做的)
对比两者的区别
主动和被动
以主动写为例:
Reactor将handle放到select(),等待可写就绪,然后调用write()写入数据;写完处理后续逻辑;
Proactor调用aoi_write后立刻返回,由内核负责写操作,写完后调用相应的回调函数处理后续逻辑;
可以看出,Reactor被动的等待指示事件的到来并做出反应;它有一个等待的过程,做什么都要先放入到监听事件集合中等待handler可用时再进行操作;
Proactor直接调用异步读写操作,调用完后立刻返回;
实现
Reactor实现了一个被动的事件分离和分发模型,服务等待请求事件的到来,再通过不受间断的同步处理事件,从而做出反应;
Proactor实现了一个主动的事件分离和分发模型;这种设计允许多个任务并发的执行,从而提高吞吐量;并可执行耗时长的任务(各个任务间互不影响)
优点
Reactor实现相对简单,对于耗时短的处理场景处理高效;
操作系统可以在多个事件源上等待,并且避免了多线程编程相关的性能开销和编程复杂性;
事件的串行化对应用是透明的,可以顺序的同步执行而不需要加锁;
事务分离:将与应用无关的多路分解和分配机制和与应用相关的回调函数分离开来,
Proactor性能更高,能够处理耗时长的并发场景;
缺点
Reactor处理耗时长的操作会造成事件分发的阻塞,影响到后续事件的处理;
Proactor实现逻辑复杂;依赖操作系统对异步的支持,目前实现了纯异步操作的操作系统少,实现优秀的如windows IOCP,但由于其windows系统用于服务器的局限性,目前应用范围 较小;而Unix/Linux系统对纯异步的支持有限,应用事件驱动的主流还是通过select/epoll来实现
(Linux有对aio的支持,可以参照这篇文章:http://www.lenky.info/archives/2013/01/2183 linux native AIO与eventfd、epoll的结合使用);
适用场景
Reactor:同时接收多个服务请求,并且依次同步的处理它们的事件驱动程序;
Proactor:异步接收和同时处理多个服务请求的事件驱动程序;
http://m.oschina.net/blog/658968
相关推荐
优化操作系统 为了获得最佳的服务器性能, 对操作系统的优化也是很必要的, 因为操作系统性能问题通常会涉及到进程管理、内存管理、调度等,所以用户需要确保 有足够的I/O带宽、CPU的处理能力、交换空间来尽可能的...
1.4.3 不用缓存的I/O 5 1.4.4 标准I/O 6 1.5 程序和进程 7 1.5.1 程序 7 1.5.2 进程和进程ID 7 1.5.3 进程控制 7 1.6 ANSI C 9 1.6.1 函数原型 9 1.6.2 类属指针 9 1.6.3 原始系统数据类型 10 1.7 出错处理 10 1.8 ...
作 者:[英] Tom Hughes-Croucher Mike Wilson 著 Node.js正迅速成为Web开发社区里最有影响...用现成的设计模式编写事件驱动程序; 在多核环境下高效地运用Node的单线程策略; 配合具体例子,深入框架核心及API工具;
Heroku Buildpack:NGINX + PageSpeed版本: 1.15.8 1.13.35.2稳定动机在处理网络I / O时,某些应用程序... 基本上,对于非高效,无阻塞I / O设计的Web服务器,让NGINX处理所有I / O操作将使我们受益。要求(代理模式
2. 跨计算连续体的无处不在的 I/O:PC、手持式、工作站、服务器、云、企业、HPC、嵌入式、物联网、汽车、人工智能 3. 跨具有不同外形尺寸、宽度(x1/x2/x4/x8/x16)和数据速率的所有细分市场的同一个堆栈/同一芯片:...
针对分层的驱动程序的I/O请求 577 I/O完成端口 585 驱动程序检验器(Driver Verifier) 589 9.4 即插即用(PnP)管理器 590 即插即用支持的级别 591 驱动程序对于即插即用的支持 592 驱动程序加载、初始化和安装 594...
《oracle数据库性能优化的艺术》内容高屋建瓴,用辩证法中的系统化分析方法,不仅从硬件(服务器系统、存储系统、网络系统等)、软件(操作系统、中间件系统、应用软件等)和应用场景(用户访问模式、用户使用频度、...
部分320 课时 MVC与Struts 高级Java Web应用开发:业界通用的MVC设计模式,Struts架构、应用程序国际化、Struts Taglib 熟练的掌握MVC设计模式和基于STRUTS架构的应用程序开发 Java B/S商务项目开发(基于Struts...
SAN(Storage Area Network):是一种用高速(光纤)网络联接专业主机服务器的一种储存方式,此系统会位于主机群的后端,它使用高速I/O 联结方式, 如 SCSI, ESCON 及 Fibre- Channels。一般而言,SAN应用在对网络速度...
支 " " "持RAID ADM - Advanced Data Mirroring " "光驱 "HP 12.7mm Slim SATA DVD ROM JackBlack Optical Drive " "PCI I/O插槽 "标准3个PCI-E 3.0插槽,安装第二颗CPU可支持最大6个PCI-E " " "3.0插槽 " "网络 "1个...
4.1.2 所有数据库文件中的I/O瓶颈 59 4.1.3 后台进程中的并发I/O操作 61 4.1.4 定义系统恢复能力与性能目标 61 4.1.5 系统硬件及结构镜像的定义 62 4.1.6 识别专用于数据库的磁盘 62 4.1.7 选择正确的设计 63 4.2 I/...
2分法-通用存储过程分页(top max模式)版本(性能相对之前的not in版本极大提高) 分页存储过程:排序反转分页法 优化后的通用分页存储过程 sql语句 一些Select检索高级用法 SQL server 2005中新增的排序函数及应用 ...
全书按照Visual C++的实际应用共分为11章,主要内容包括:用户界面设计、文档应用程序设计、图形程序设计、文件I/O与串行化程序设计、多媒体程序设计、系统控制与注册表、数据库技术程序设计、网络、通信技术程序...
全书按照Visual C++的实际应用共分为11章,主要内容包括:用户界面设计、文档应用程序设计、图形程序设计、文件I/O与串行化程序设计、多媒体程序设计、系统控制与注册表、数据库技术程序设计、网络、通信技术程序...
是一个简单高效的HTTP Server,在Linux平台下C++语言开发,基于非阻塞IO和事件驱动,one loop per thread模型,利用epoll的ET模式,支持GET和POST方法、公共网关接口(CGI)、文件和目录的访问、404等错误处理,经过...
· 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态...
虽然它继承了微服务架构MSA的基本概念,但它已被赋予了新的架构模式,尽可能实现最高效的硬件利用。 尽管Serverless架构有显著的进步,但适应这种架构需要一个周全的过程,把企业解决方案精确映射到Serverless架构上...
· 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态...
· 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态...
· 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态...