`
m635674608
  • 浏览: 5027288 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

服务器高效I/O设计模式

 
阅读更多

前言

 

         一般地,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

分享到:
评论

相关推荐

    java阻塞i/o与非阻塞i/o控制

    对于高效的系统设计,理解并掌握阻塞I/O和非阻塞I/O是非常重要的。这两种I/O模型在处理数据传输时有着显著的区别,对程序性能和并发性有着深远的影响。 **阻塞I/O(Blocking I/O)** 阻塞I/O模型是最常见的I/O模式...

    1_WINSOCK的I/O模型_

    在实现C/S模式的群聊服务软件时,通常会选择I/O多路复用或异步I/O模型,因为它们能有效管理大量并发连接,确保服务器的高效运行。客户端通常相对简单,可以使用阻塞I/O,或者根据需求选择其他模型。 在压缩包文件中...

    深入分析 Java I/O 的工作机制(转载)

    过滤流(FilterStream)是Java I/O中的一种设计模式,它们在已存在的流之上添加额外功能。例如,DataInputStream和DataOutputStream扩展了字节流,增加了对基本类型数据的读写支持;而BufferedInputStream和...

    java i/o 开发框架mina

    2. **事件驱动**:Mina采用事件驱动的设计模式,当网络事件发生时,如数据接收、连接建立或关闭,都会触发相应的事件处理器。这使得代码结构更加清晰,易于理解和维护。 3. **协议独立性**:Mina提供了一个抽象层,...

    TCA9554 低功耗输入输出 (I/O) 扩展芯片

    **TCA9554 低功耗输入输出 (I/O) 扩展...总结来说,TCA9554是一款高效、灵活且可靠的I/O扩展芯片,适用于多种需要扩展GPIO接口的嵌入式系统,其低功耗、高速I²C支持和丰富的配置选项使其成为各种应用场景的理想选择。

    VC++编写的应用了设计模式的完整TCP完成端口服务器+客户端

    总的来说,这个项目展示了如何在VC++环境中利用高级的Windows I/O完成端口技术和设计模式来构建高效、灵活的TCP服务器和客户端应用。对于学习和理解网络编程、并发处理以及C++设计模式的实践者来说,这是一个有价值...

    Proactor模式&Reactor模式详解

    本文旨在详细介绍这些I/O模型,并着重解析Reactor模式与Proactor模式的设计思想及其应用场景。 #### 二、同步阻塞I/O (Blocking I/O) 同步阻塞I/O是最基本且最直观的I/O处理方式。在这种模式下,应用程序发出I/O...

    VC开发的TCP/IP完成端口服务器程序

    总之,完成端口服务器程序是利用Windows内核提供的高效I/O机制,来构建高性能、高并发的TCP/IP服务器的关键技术。通过研究和实践这样的项目,开发者可以深入理解网络编程和并发处理的原理,为构建大规模分布式系统...

    Linux下套接字I_O复用模型介绍.pdf

    3. **epoll**:是Linux特有的高效I/O复用机制,它基于事件驱动,支持水平触发和边缘触发两种模式,显著提高了大规模并发连接的处理效率。epoll_wait会等待事件发生,当有事件就绪时,它会返回就绪的描述符列表,避免...

    windows TCP/IP 网络编程(五)5种windows网络模型(4) 重叠IO模型(a)事件通知 DEMO

    `WSARecv`调用使用了重叠I/O模式,如果I/O操作立即完成,我们会处理接收到的数据;如果操作挂起,`WAIT_OBJECT_0`返回值表明事件已经触发,表示I/O操作完成。 总结来说,Windows的重叠I/O模型结合事件通知机制,为...

    关于通过完成端口实现高效网络服务器设计的详细说明

    总之,通过完成端口实现高效网络服务器设计,关键在于充分利用操作系统提供的异步I/O能力,减少不必要的线程开销,实现对大量并发连接的有效管理。在实际开发中,还需要根据具体的应用场景和需求,合理配置完成端口...

    IOCP客户端和服务器端

    这种方式避免了传统的轮询或阻塞I/O模式中线程的浪费,极大地提高了系统效率。 在服务器端,创建IOCP通常通过`CreateIoCompletionPort`函数实现,接着绑定到监听套接字上。一旦有新的连接请求,服务器接受连接并将...

    网络IO模型 Linux环境下的network IO

    epoll是Linux特有的高性能I/O复用机制,它使用“水平触发”和“边缘触发”两种模式,可以更高效地处理大量并发连接。 4. **信号驱动I/O模型** 在信号驱动I/O中,当数据准备好时,操作系统会发送一个信号通知进程。...

    Java I-O NIO and NIO2

    这些流类主要基于装饰者设计模式,通过包装一个输入/输出流,提供了额外的功能,比如缓冲流、过滤流等。读者和写者类则用于读取和写入字符数据,它们支持字符编码转换,适用于读写文本文件。 NIO(New I/O)引入了...

    fio.rar_fio源码原理

    通过对fio的源码分析,我们可以学习到如何设计高效的I/O操作,如何优化网络通信,以及如何评估和调优存储系统的性能。无论是对开发者还是系统管理员,fio都是一个宝贵的工具,帮助我们更好地理解和优化存储系统。

    IOCP服务器

    IOCP(I/O Completion Port,I/O完成端口)是一种高效、可扩展的Windows系统级I/O模型,常用于高性能的网络服务器开发,尤其是大型在线服务。标题中的"IOCP服务器"表明我们讨论的是利用IOCP技术构建的网络服务器,...

    Completionportmode

    标题中的"Completionportmode"指的是I/O完成端口(I/O Completion Ports,简称IOCP)模式,这是一种在Windows操作系统中高效处理I/O操作的技术。它主要用于多线程环境,能够帮助开发者有效地管理和调度异步I/O操作,...

    网络编程模型综述.doc

    网络编程模型是设计和实现网络应用程序的关键部分,它们决定了如何高效地处理输入/输出(I/O)操作。本篇将概述几种主要的网络编程模型,包括在UNIX和Windows操作系统中的应用。 1. **UNIX网络I/O模型** - **阻塞...

Global site tag (gtag.js) - Google Analytics