- 浏览: 2049561 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (795)
- java (263)
- 聚类搜索引擎 (9)
- 经验之谈 (67)
- DSP (3)
- C++ (140)
- Linux (37)
- SNMP (6)
- Python (6)
- 数据库 (61)
- 网络 (20)
- 算法 (15)
- 设计模式 (4)
- 笔试题 (38)
- 散文 (35)
- 数据结构 (9)
- 银行知识 (0)
- 榜样 (9)
- Lucene (15)
- Heritrix (6)
- MetaSeeker (0)
- netbeans (12)
- php (3)
- 英语 (8)
- DB2 (0)
- java基础 (5)
- mongodb & hadoop (4)
- Javascript (7)
- Spring (4)
- ibatis & myibatis (1)
- velocity (1)
- 微服务 (0)
- paddle (1)
- 第三方 (0)
- 知识沉淀 (1)
- 建模 (0)
最新评论
-
0372:
标示对java很陌生!
中文乱码解决的4种方式 -
梦留心痕:
Java中\是转意字符, 可是你的这句话我没看懂,只要把得到的 ...
java中如何忽略字符串中的转义字符--转载 -
yanjianpengit:
[b][/b]
java为什么非静态内部类里面不能有静态成员 -
springdata-jpa:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
eclipse 如何把java项目转成web项目 -
qq1130127172:
,非常好。
(转)SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
昨天购买了《程序员》杂志 2007.4期,第一时间去翻阅了一遍,其中有一篇《两种高性能I/O设计模式的比较》令人眼睛一亮,这是一篇译文,偶最近在一直想认真看看这方面的文章很久了。
文章主要是讲到了系统I/O方式可分为阻塞,非阻塞同步和非阻塞异步三类,三种方式中,非阻塞异步模式的扩展性和性能最好。主要是讲了两种IO多路复用模式:Reactor和Proactor,并对它们进行了比较。
文章还介绍了为Reactor和Proactor模式构建一个通用的,统一的对外接口并是一个完全可移植的开发框架选择方案:TProactor (ACE compatible Proactor) :http://www.terabit.com.au/solutions.php。因为Linux对aio支持的不完整,所以ACE_Proactor框架在linux上的表现很差,大部分在windows上执行正常的代码,在Linux则运行异常,甚至不能编译通过。这个问题一直困扰着很大多数ACE的用户,现在好了,有一个TProactor帮助解决了在Linux不完整支持AIO的条件下,正常使用(至少是看起来正常)ACE_Proactor。
文章主要摘要:
---------->
两种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原来位于事件处理器内的read/write操作移至分离器(不妨将这个思路称为“模拟异步”),以此寻求将Reactor多路同步IO转化为模拟异步IO。以读操作为例子,改进过程如下:
- 注册读就绪事件及其处理器,并为分离器提供数据缓冲区地址,需要读取数据量等信息。
- 分离器等待事件(如在select()上等待)
- 事件到来,激活分离器。分离器执行一个非阻塞读操作(它有完成这个操作所需的全部信息),最后调用对应处理器。
- 事件处理器处理用户自定义缓冲区的数据,注册新的事件(当然同样要给出数据缓冲区地址,需要读取的数据量等信息),最后将控制权返还分离器。
如我们所见,通过对多路IO模式功能结构的改造,可将Reactor转化为Proactor模式。改造前后,模型实际完成的工作量没有增加,只不过参与者间对工作职责稍加调换。没有工作量的改变,自然不会造成性能的削弱。对如下各步骤的比较,可以证明工作量的恒定:
标准/典型的Reactor:
- 步骤1:等待事件到来(Reactor负责)
- 步骤2:将读就绪事件分发给用户定义的处理器(Reactor负责)
- 步骤3:读数据(用户处理器负责)
- 步骤4:处理数据(用户处理器负责)
改进实现的模拟Proactor:
- 步骤1:等待事件到来(Proactor负责)
- 步骤2:得到读就绪事件,执行读数据(现在由Proactor负责)
- 步骤3:将读完成事件分发给用户处理器(Proactor负责)
- 步骤4:处理数据(用户处理器负责)
对于不提供异步IO API的操作系统来说,这种办法可以隐藏socket API的交互细节,从而对外暴露一个完整的异步接口。借此,我们就可以进一步构建完全可移植的,平台无关的,有通用对外接口的解决方案。
上述方案已经由Terabit P/L公司(http://www.terabit.com.au/)实现为TProactor。它有两个版本:C++和JAVA的。C++版本采用ACE跨平台底层类开发,为所有平台提供了通用统一的主动式异步接口。
Boost.Asio库,也是采取了类似的这种方案来实现统一的IO异步接口。
<-----------
最近在项目中使用了Boost.Asio类库,其就是以Proactor这种设计模式来实现,参见:Proactor(The Boost.Asio library is based on the Proactor pattern. This design note outlines the advantages and disadvantages of this approach.),其设计文档链接:http://asio.sourceforge.net/boost_asio_0_3_7/libs/asio/doc/design/index.html
First, let us examine how the Proactor design pattern is implemented in asio, without reference to platform-specific details.
Proactor design pattern (adapted from [1])
当然这两I/O设计模式,也在ACE中被大量应用,这在ACE的相关书籍中都有介绍,其中在“ACE开发者”网站中有很多不错的介绍文章。
如:ACE技术论文集-第8章 前摄器(Proactor):用于为异步事件多路分离和分派处理器的对象行为模式
ACE技术论文集-第7章 ACE反应堆(Reactor)的设计和使用:用于事件多路分离的面向对象构架
ACE程序员教程-第6章 反应堆(Reactor):用于事件多路分离和分派的体系结构模式
Proactor模式在单CPU单核系统应用中有着无可比拟的优势,现在面临的问题是:在多CPU多核的系统中,它如何更好地应用多线程的优势呢???这是很值思考和实践的,也许会产生另外一种设计模式来适应发展的需要啦。
发表评论
-
流式计算
2022-02-07 14:31 286private void postHandle(List& ... -
消息队列使用的四种场景介绍
2018-08-09 16:34 2478以下介绍消息队列在实际应用中常用的使用场 ... -
设计模式
2018-04-11 16:49 9861.桥梁模式,将抽象部分与实现部分隔离开,抽象部分持有实现 ... -
Spring boot web可以访问Service和Mapper层
2018-03-26 16:42 2872Spring boot的web层可以访问Service层,然 ... -
FreeMarker的基础语法使用 && 心得和技巧
2018-01-10 10:03 2063FreeMarker是一个模板引 ... -
webService----wss4j+cxf实现WS-Security(基于UsernameToken)
2017-10-23 18:58 1561分享一下wss4j+cxf基于UsernameToken的安 ... -
Spring MVC之LocaleResolver(解析用户区域)
2017-09-23 15:55 2534为了让web应用程序支持国际化,必须识别每个用户的首选区域, ... -
(转)java泛型
2016-11-12 20:29 1650http://www.cnblogs.com/lwbqqyu ... -
java中如何忽略字符串中的转义字符--转载
2016-06-28 16:42 9916原文地址:http://my ... -
(转)关于JAP FetchType.LAZY(hibernate实现)的理解 .
2016-04-27 15:22 5108JPA定义实体之间的关系有如下几种: @OneToOne ... -
(转)hibernate annotation注解方式来处理映射关系
2016-04-26 16:52 1841http://www.cnblogs.com/xiao ... -
代码片段,导出的文件头
2015-11-18 20:34 1606public static void setDownload ... -
(转)为什么要两次调用encodeURI来解决乱码问题
2015-08-03 20:19 2489地址:http://blog.csdn.net/howla ... -
杀死进程
2015-07-21 14:54 1293sudo lsof -i :9000 COMMAND P ... -
批处理batch,执行多个SQL语句
2015-07-15 19:21 10616批处理batch,执行多个SQL语句。 ... -
中文乱码解决的4种方式
2015-07-03 14:20 2630目前收集到4中方法,中文传参一documentPath为例: ... -
GET请求的中文乱码问题及处理意义
2015-07-03 13:47 6635首先看一段乱码的程序 ... -
java.ByteArrayInputStream与ByteArrayOutputStream再次理解
2015-03-16 17:59 3242第一次看到ByteArrayOutputStream的时 ... -
(转)SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
2014-07-28 17:42 2282概述 继 Spring 2.0 对 Spring MVC ... -
java中序列化的serialVersionUID解释
2014-07-25 09:26 1891serialVersionUID: 字面意思上是序列化的版本号 ...
相关推荐
* 非阻塞:Reactor 模式使用非阻塞式 I/O 操作,避免了线程的阻塞,提高了系统的性能。 * loose coupling:Reactor 模式中,事件处理程序和事件源之间松散耦合,易于维护和扩展。 Reactor 模式的优点是: * 高效:...
文章将探讨两种高性能I/O设计模式:Reactor和Proactor,并比较Java、C#和C++对这些设计模式的实现和性能。 阻塞型I/O设计模式的缺点是控制权只到调用操作结束了才会回到调用者手里,调用者被阻塞了,无法做任何其它...
在并发系统设计中,Proactor和Reactor模式是两种常用的设计模式,它们主要用来处理I/O操作的事件派发和分离。这两种模式都是为了提高系统的并发能力,优化资源利用,但它们在处理I/O事件的方式上有所不同。 首先,...
同步非阻塞I/O和I/O多路复用(Reactor模式)适合处理高并发连接,尤其是当连接数量远远超过可用处理器核心数时;而异步I/O(Proactor模式)则提供了最高级别的非阻塞性和效率,尤其适用于需要处理大量并发连接且充分...
在IT领域,特别是网络编程和并发处理中,`Actor`和`Proactor`模式是两种重要的设计模式,它们主要用于高效地处理I/O操作。这两种模式都涉及到如何有效地管理多个并发的I/O请求,以提高系统性能和响应速度。 首先,...
在构建高性能TCP服务器时,I/O设计模式的选择至关重要,因为它们直接影响系统的性能和可扩展性。本文主要对比了两种主要的I/O多路复用模式:Reactor和Proactor,这两种模式都是为了克服传统阻塞I/O的性能瓶颈而提出...
Proactor-Reactor 模式是高性能服务器设计的核心思想之一,它们都是基于 I/O 多路复用的技术实现的。下面我们来详细了解 Proactor-Reactor 模式的设计思想和实现机理。 问题背景 在设计高性能服务器时,如何处理...
在实际应用中,比如开发服务器或者网络库时,理解并合理运用Reactor和Proactor模式,能够帮助我们构建出高并发、高性能的网络服务。对于开发者来说,熟悉这些模式,不仅可以提升代码质量,还能提高解决问题的能力。...
本文将从同步和异步的概念开始,然后介绍阻塞和非阻塞的区别,接着介绍阻塞IO和非阻塞IO的区别,最后介绍五种IO模型和两种高性能IO设计相关的设计模式(Reactor和Proactor)。 一、同步和异步 同步和异步是IO模型...
此外,异步编程模型,如事件驱动编程(event loop)和回调函数,也是现代高性能服务器的常见设计模式。 4. **C/C++编程**:作为底层编程语言,C++和C提供了对系统资源的直接访问,能实现更高效的服务器程序。理解...
在异步I/O中,有一个相应的模式称为预处理器(Proactor)模式。与Reactor不同,Proactor模式不关注事件的注册和选择,而是专注于异步操作的处理。在AIO框架中,Proactor组件负责接收来自`...
Proactor模式则是在异步I/O操作中的一种设计模式,与Reactor模式相比,它更加强调非阻塞I/O的处理。在Proactor模式中,I/O操作是异步启动的,完成后由操作系统通知,然后执行后续处理。这种模式在处理大量I/O操作时...
- **Proactor模型**:关注点在于预知未来的I/O事件,通过异步操作来减少阻塞等待时间。 #### 六、多核环境下的性能优化 在多核计算环境下,如何有效地管理并发操作和资源共享变得尤为重要。例如,在分布式锁的竞争...
理解并熟练运用这些概念,开发者能够构建出高性能、可扩展的Java I/O系统。Doug Lea的PPT文档和翻译为我们提供了深入学习和实践的宝贵资源。 总结来说,《Scalable IO in Java》文档是Java开发者提升I/O处理能力的...
6. **并发服务器设计**:书中介绍了多种并发服务器架构,如单线程、多线程、事件驱动(如Reactor和Proactor模式)、线程池等,分析了各自的优缺点和适用场景。 7. **性能调优工具**:为了监测和优化服务器性能,书...
3. **基于事件的编程模型**:这是一种非阻塞I/O模型,如Reactor或Proactor模式,它利用事件驱动来处理网络通信。当有新的网络事件(如数据到达)发生时,系统会触发回调函数进行处理,而不是持续检查是否有新事件,...
分析常见高性能网络设计模式,涵盖了reactor, proactor。
Boost.Asio是一个用于网络和低级别I/O...无论是需要创建高性能网络应用还是处理低级别I/O操作,Boost.Asio都是一个强有力的解决方案。通过它的并发控制和事件处理能力,Boost.Asio帮助开发者创建出既高效又可靠的程序。
- **预读取服务器**(Proactor模式):利用异步I/O,提前发起I/O操作,处理其他任务,I/O完成后回调。 - **事件驱动服务器**(如Node.js):基于事件循环,处理高并发场景,减少线程切换开销。 - **工作进程/工作...