`

ACE反应器(Reactor)模式(1)

    博客分类:
  • ACE
阅读更多

1ACE反应器框架简介

反应器(Reactor):用于事件多路分离和分派的体系结构模式

通常的,对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞非阻塞。所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待状态, 直到有东西可读或者可写为止。而对于非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待

在前面的章节中提到的Tcp通信的例子中,就是采用的阻塞式的工作方式:当接收tcp数据时,如果远端没有数据可以读,则会一直阻塞到读到需要的数据为止。这种方式的传输和传统的被动方法的调用类似,非常直观,并且简单有效,但是同样也存在一个效率问题,如果你是开发一个面对着数千个连接的服务器程序,对每一个客户端都采用阻塞的方式通信,如果存在某个非常耗时的读写操作时,其它的客户端通信将无法响应,效率非常低下。

一种常用做法是:每建立一个Socket连接时,同时创建一个新线程对该Socket进行单独通信(采用阻塞的方式通信)。这种方式具有很高的响应速度,并且控制起来也很简单,在连接数较少的时候非常有效,但是如果对每一个连接都产生一个线程的无疑是对系统资源的一种浪费,如果连接数较多将会出现资源不足的情况。

另一种较高效的做法是:服务器端保存一个Socket连接列表,然后对这个列表进行轮询,如果发现某个Socket端口上有数据可读时(读就绪),则调用该socket连接的相应读操作;如果发现某个Socket端口上有数据可写时(写就绪),则调用该socket连接的相应写操作;如果某个端口的Socket连接已经中断,则调用相应的析构方法关闭该端口。这样能充分利用服务器资源,效率得到了很大提高。

在Socket编程中就可以通过select等相关API实现这一方式。但直接用这些API控制起来比较麻烦,并且也难以控制和移植,在ACE中可以通过Reactor模式简化这一开发过程。

反应器本质上提供一组更高级的编程抽象,简化了事件驱动的分布式应用的设计和实现。除此而外,反应器还将若干不同种类的事件的多路分离集成到易于使用的API中。特别地,反应器对基于定时器的事件、信号事件、基于I/O端口监控的事件和用户定义的通知进行统一地处理。

ACE中的反应器与若干内部和外部组件协同工作。其基本概念是反应器框架检测事件的发生(通过在OS事件多路分离接口上进行侦听),并发出对预登记事件处理器(event handler)对象中的方法的"回调"(callback)。该方法由应用开发者实现,其中含有应用处理此事件的特定代码。

使用ACE的反应器,只需如下几步:

  1. 创建事件处理器,以处理他所感兴趣的某事件。
  2. 在反应器上登记,通知说他有兴趣处理某事件,同时传递他想要用以处理此事件的事件处理器的指针给反应器。

随后反应器框架将自动地:

  1. 在内部维护一些表,将不同的事件类型与事件处理器对象关联起来。
  2. 在用户已登记的某个事件发生时,反应器发出对处理器中相应方法的回调。

反应器模式在ACE中被实现为ACE_Reactor类,它提供反应器框架的功能接口。

如上面所提到的,反应器将事件处理器对象作为服务提供者使用。反应器内部记录某个事件处理器特定事件的相关回调方法。当这些事件发生时,反应器会创建这种事件和相应的事件处理器的关联。

  1. 事件处理器
    事件处理器就是需要通过轮询发生事件改变的对象列表中的对象,如在上面的例子中就是连接的客户端,每个客户端都可以看成一个事件处理器。
  2. 回调事件
    就是反应器支持的事件,如Socket读就绪,写就绪。拿上面的例子来说,如果某个客户端(事件处理器)在反应器中注册了读就绪事件,当客户端给服务器发送一条消息的时候,就会触发这个客户端的数据可读的回调函数。

在反应器框架中,所有应用特有的事件处理器都必须由ACE_Event_Handler的抽象接口类派生。可以通过重载相应的"handle_"方法实现相关的回调方法。

使用ACE_Reactor基本上有三个步骤:

  1. 创建ACE_Event_Handler的子类,并在其中实现适当的"handle_"方法,以处理你想要此事件处理器为之服务的事件类型。
  2. 通过调用反应器对象的register_handler(),将你的事件处理器登记到反应器。
  3. 在事件发生时,反应器将自动回调相应的事件处理器对象的适当的handle_"方法

下面我就以一个Socket客户端的例子为例简单的说明反应器的基本用法。

#include <ace/OS.h>
#include <ace/Reactor.h>
#include <ace/SOCK_Connector.h> 

#include <string>
#include <iostream>
using namespace std;

class MyClient:public ACE_Event_Handler 
{
public:
    bool open()
    {
        ACE_SOCK_Connector connector;
        ACE_INET_Addr addr(3000,"127.0.0.1");
        ACE_Time_Value timeout(5,0);
        if(connector.connect(peer,addr,&timeout) != 0)
        {
            cout<<endl<<"connecetd fail";
            return false;
        }
        ACE_Reactor::instance()->register_handler(this,ACE_Event_Handler::READ_MASK);
        cout<<endl<<"connecetd ";
        return true;
    }

    ACE_HANDLE get_handle(void) const
    {
        return peer.get_handle();
    }

    int handle_input (ACE_HANDLE fd)
    {
        int rev=0;
        ACE_Time_Value timeout(5,0);
        if((rev=peer.recv(buffer,1000,&timeout))>0)
        {
            buffer[rev]='\0';
            cout<<endl<<"rev:\t"<<buffer<<endl;
        }
        return 3;
    }

private:
    ACE_SOCK_Stream peer;
    char buffer[1024];
};

int main(int argc, char *argv[]) 
{
    MyClient client;
    client.open();

    while(true)
    {
        ACE_Reactor::instance()->handle_events(); 
    }

    return 0; 
}
 

在这个例子中,客户端连接上服务器后,通过ACE_Reactor::instance()->register_handler(this,ACE_Event_Handler::READ_MASK)注册了一个读就绪的回调函数,当服务器端给客户端发消息的时候,会自动触发handle_input()函数,将接收到的信息打印出来。

这个例子只是为了演示反应器的基本用法,并不完善,我将在下一节中对如何在Socket通信中使用反应器做进一步的介绍。

分享到:
评论

相关推荐

    ACE反应器(Reactor)模式的深入分析

    ACE反应器(Reactor)模式是一种用于处理并发事件的架构设计模式,主要应用于网络服务器的开发,特别是处理大量并发连接的场景。它有效地解决了在单线程或多线程环境中,如何高效地处理多个I/O事件的问题。Reactor模式...

    Reactor反应器的实现方法详解

    创建自定义反应器实例后,可以使用`ACE_Reactor::instance()`方法替换默认的反应器实例,并指定是否在程序结束时删除这个实例。 3. **具体的Reactor实现** - **ACE_Select_Reactor**:这是在除Windows外的大多数...

    C++ Network Programming, Volume 2: Systematic Reuse with ACE and Frameworks

    - 第4章提供了ACE反应器不同实现的详细介绍,包括ACE_Select_Reactor、ACE_TP_Reactor和ACE_WFMO_Reactor类,每种实现都有其特定的使用场景和优势。 5. ACE服务配置器框架 - 第5章介绍了ACE服务配置器框架,展示...

    ace_reactor:王牌React堆服务器

    Ace Reactor提供了多种反应器实现,包括基于select、poll、epoll等不同操作系统原生API的版本,以适应不同的性能和规模需求。例如,Linux系统的epoll机制在高并发下表现出色,因为它支持水平触发和边缘触发两种模式...

    ACE开发指南(初级)

    ACE的核心特性包括反应器(Reactor)和预行动器(Proactor)模式,它们是事件驱动设计的关键部分。 2.2 **环境搭建** 在开始开发前,需要安装ACE库,并配置开发环境。这通常包括下载源码,编译安装,然后在项目中链接...

    ACE学习文档大全.rar

    5. **ACE反应器(Reactor)模式**: Reactor模式是ACE的核心,它负责监听和分发网络事件。开发者需要理解Reactor的事件处理机制,如事件注册、调度策略、回调函数等。同时,Reactor的异步I/O模型也是学习的重点,它...

    ACE框架知识

    反应器操作 - **close()**: 关闭并释放由`ACE_Reactor`使用的资源。 - **register_handler(ACE_Event_Handler*, ACE_Reactor_Mask)**: 注册事件处理器到`ACE_Reactor`,并指定感兴趣的事件类型。 - **remove_...

    ACE 程序员指南 源代码

    7. **分布式系统设计**:ACE_TSS(Thread Specific Storage)用于线程局部存储,ACE_Logger提供日志记录,ACE_WFMO_Reactor实现了Windows下的基于WaitFOrMultipleObjects的反应器。 8. **性能优化**:ACE_Dynamic_...

    ACE程序员指南

    3. **ACE组件**:包括ACE_TSS(线程特定存储)、ACE_Reactor(事件反应器)、ACE_Scheduler(调度器)、ACE_Proactor(异步操作处理器)等。每个组件都有其特定的功能,如Reactor用于事件驱动编程,Proactor则适用于...

    ACE简单例子 并附说明

    - **反应器模型**:ACE的反应器(`ACE::Reactor`)是处理I/O事件的核心组件。 - **设计模式的应用**:ACE广泛采用了设计模式,如单例模式、适配器模式、迭代器模式等。 ##### 2. 内存管理 - **缓存内存分配类ACE_...

    ACE开发指南(初级).

    ##### 3.1 Reactor(反应器)框架 Reactor模式是一种常见的事件驱动设计模式,它将事件处理与事件接收解耦,使得系统更加灵活和可扩展。 ###### 3.1.1 ACE_Event_Handler(事件处理器) 在ACE框架中,`ACE_Event_...

    ACE.rar_ACE

    1. **ACE框架结构**:ACE主要由几个核心组件构成,如Reactor(事件反应器)、Thread Manager(线程管理器)、Tokenizer(分词器)等,它们共同构成了一个强大的网络通信框架。 2. **Reactor模式**:这是ACE的核心...

    开源利器ACE

    调用方可以将自己关心的事件及其处理函数在反应器中注册,当特定的事件发生时,由反应器在其线程环境中调用预先指定的函数。 ACE_Acceptor/Connector 封装客户端和服务器的连接过程,并使用了类厂模式,在连接建立...

    ACE技术论文集(已翻译为中文)

    第 7 章 ACE 反应器(Reactor)的设计和使用:用于事件多路分离的面向对象框架 第 8 章 前摄器(Proactor):用于为异步事件多路分离和分派处理器的对象行为模式 第 9 章 接受器-连接器(Acceptor-Connector):...

    一个简单的ace C/S 供学习参考

    2. `ACE_Reactor`: 反应器模式是ACE中的核心设计模式,用于处理并发事件。`ACE_Reactor`负责调度事件处理,当有新的连接或数据到达时,它会调用相应`ACE_Handler`的回调函数。 3. `ACE_Acceptor`: ACE提供`ACE_...

    ACE经典教程 经典

    ACE是基于事件驱动和反应器模式的库,它提供了一系列接口和工具,用于简化网络编程、并发处理和系统资源管理。ACE支持多种操作系统,包括Windows、Linux、Unix等,确保代码的可移植性。 2. ACE核心概念: - 事件...

    ACE自适配通信环境中文技术文档.pdf

    Process Communication,进程间通信)、I/O、Active Object(活动对象设计模式)、Reactor(反应器模式)、Proactor(前摄器模式)、Acceptor(接受器模式)以及众多操作系统平台,例如UNIX、Win32、Linux、Mac OS、...

Global site tag (gtag.js) - Google Analytics