行C++代码,由约500个类组成。其中的许多类相互协作,形成了ACE的主要框架。ACE工具包还包括了许多较高级的组件,以及大量的示例和大范围的自动regression test(退行测试)套件(退行测试是指在新模块被集成进系统中、测试所增加的功能时,重新测试先前测试过的功能,以确保新模块不会破坏系统——译注)。
如图1.7所示,为了划分事务、降低复杂性,并实现功能性的子集划分,ACE的设计使用了分层的架构[POSA1]。ACE所提供的功能跨越了OSI参考模型[Blas91]的会话、表示和应用层。ACE工具包的基础是其OS适配层和许多C++ wrapper facade的结合,它们共同封装了核心的OS网络编程机制,以在副栏2中所示的所有OS平台上可移植地运行。ACE的较高层在此基础上构建,以提供可复用的框架、网络化服务组件,以及基于标准的中间件。
1.4.2 ACE框架提要
ACE框架是一组集成的类,开发者可对其进行实例化和定制,以提供完整的网络化应用和服务组件。以“在经过良好测试、可复用的C++软件制品中包含专家经验”的形式,这些框架有助于将ACE
图为:ACE中的关键框架
副栏2:ACE所支持的OS平台 |
ACE可运行在诸多操作系统上,包括: l PC,例如,Windows(32和64位版本)、WinCE,以及Macintosh OS X l 大多数版本的UNIX,例如,SunOS/Solaris、IRIX、HP-UX、Tru64 UNIX(Digital UNIX)、AIX、DG/UX、Linux(Redhat、Debian,以及SuSE)、SCO OpenServer、UnixWare、NetBSD,以及FreeBSD l 实时操作系统,例如,VxWorks、ChorusOS、LynxOS、Pharlap TNT、QNX Neutrino和RTP、RTEMS,以及pSoS l 大型企业系统,例如,OpenVMS、MVS OpenEdition、Tandem NonStop-UX,以及Cray UNICOS 我们可以使用这些平台上的所有主要的C++编译器来编译ACE。位于http://ace.ece.uci.edu的ACE网站含有完整的、最新的平台列表,以及怎样下载及生成ACE的指令。 |
开发者在数十年中积累的知识直接传递给ACE用户。ACE框架为编写并发的面向对象网络化应用实现了一种模式语言。图1.8说明ACE的各个框架。为了说明这些框架是怎样相互依赖、相互使用的,在各个方框之间使用了线和箭头来表示其依赖关系和方向。下面对各个框架进行概述。
ACE Reactor和Proactor框架 这些框架分别实现Reactor和Proactor模式[POSA2]。它们都是架构型模式,允许应用由“从一个或多个事件源递送到应用的事件”进行驱动;这些事件源中最为重要的是I/O端点。通过由事件发信号告知已可以开始同步操作,Reactor框架便利了反应式I/O(Reactive I/O)模型的使用。Proactor框架是为前摄式I/O(Proactive I/O)模型设计的,在其中一个或多个异步I/O操作被发起,每个操作的完成会触发一个事件。使用前摄式I/O模型可以获得并发的性能好处,而又不会带来并发的许多连带问题。Reactor和Proactor框架使“为响应许多类型的事件而进行的检测、多路分离,以及应用定义的处理器的分派”得以自动化。第3章和第4章描述ACE Reactor框架,第8章描述ACE Proactor框架。
ACE Service Configurator框架 该框架实现Component Configurator模式[POSA2],这种设计模式允许应用链接其组件实现,或解除其链接,而无需静态地修改、重编译,或是重链接应用。ACE Service Configurator框架支持这样的应用配置:其服务可在设计周期的后期,比如安装时和/或运行时,进行装配。具有高可用性需求的应用,比如进行在线交易处理或实时生产过程自动化的关键性系统,常常需要这样灵活的配置能力。第2章描述与配置网络化服务相关的设计维度,第5章描述ACE Service Configurator框架。
ACE Task框架 该框架实现多种并发模式,比如Active Object和Half-Sync/Half-Async [POSA2]。Active Object设计模式解除了“执行方法的线程”与“调用此方法的线程”的耦合。其目的是加强并发,并简化对驻留在自己的控制线程(Thread of Control)中的对象的同步化访问。Half-Sync/Half-Async是一种架构型模式,可以解除并发系统中的同步与异步处理的耦合,从而简化编程,而又不过度地降低性能。该模式结合了两个互通信层,一个用于异步服务处理,一个用于同步服务处理。排队层则协调异步和同步层中的服务之间的通信。C++NPv1的第5章描述了与并发的网络化应用相关联的设计维度,本书的第6章描述ACE Task框架。
ACE Acceptor-Connector框架 该框架有效地利用了Reactor框架,并使Acceptor-Connector模式[POSA2]得以具体化。该设计模式解除了“网络化系统中相互协作的各对等服务的连接和初始化”与“连接和初始化一旦完成后它们所进行的处理”的耦合。Acceptor-Connector框架解除了“主动的和被动的初始化角色”与“应用定义的服务处理”的耦合——这些处理由各通信对等端服务在初始化完成后进行。第7章描述这一框架。
ACE Streams 框架 该框架实现Pipes and Filters模式,这种架构型模式为处理数据流的系统提供了一种结构[POSA1]。ACE Streams框架简化了分层次的服务的开发和组合,比如用户级协议栈和网络管理代理[SS94]。第9章描述这一框架。
在协同使用时,上面所概述的ACE框架赋予了开发者开发这样的网络化应用的能力:无需修改/
图 应用类库来开发和使用ACE框架
重编译、重链接,或是重启运行中的应用,就可以对它们进行更新和扩展。ACE是通过结合以下方法来获得这一空前的灵活性和可扩展性的:
l OS机制 比如事件多路分离、IPC、动态链接、多线程、多进程,以及同步[Ste99]。
l C++语言特性 比如模板、继承,以及动态绑定[Bja00]。
l 模式 比如Component Configurator[POSA2]、Strategy[GoF],以及Handler/Callback[Ber95]。
如表1.2所示,ACE框架通过回调提供了控制的反转:
表1.2
ACE框架 |
控制的反转 |
Reactor和Proactor |
回调应用提供的事件处理器,以在事件同步或异步发生时进行处理 |
Service Configurator |
回调应用提供的服务对象,以对其进行初始化、挂起(Suspend)、恢复(Resume),以及结束(Finalize)操作 |
Task |
回调应用提供的挂钩方法,以在一个或多个控制线程中进行处理工作 |
Acceptor-Connector |
回调服务处理器,以在它们被连接后对其进行初始化 |
Streams |
当任务被推入和弹出流时进行回调,以对任务进行初始化和结束操作 |
ACE的框架中的回调方法被定义为C++虚方法。这一对动态绑定的使用允许网络化应用*地实现和扩展接口方法,而无需修改或重编译已有的框架类。相反,ACE wrapper facade很少使用回调或虚方法,所以其可扩展性不及ACE框架。但是,ACE Wrapper facade也支持广泛的使用情况,并可通过泛型编程[Ale01]技术集成在一起。泛型技术基于在副栏40中所概述的C++ traits和traits类惯用手法。
上图说明了在ACE中类库和框架为何是互补的技术。通过其容器类库——其中包括列表、队列、哈希表、字符串,以及其他可复用的数据结构——ACE工具包简化了其框架的实现。同样地,由ACE Reactor框架中的事件处理器所调用的应用定义的代码可以使用ACE wrapper facade和C++标准库类来执行IPC、同步、文件管理,以及字符串处理操作。副栏3描述了怎样生成(Build)ACE库,从而让你能够试验我们在本书中给出的示例。
副栏3:生成ACE及使用ACE的程序 |
ACE是开放源码软件,你可以从http://ace.ece.uci.edu或http://www.riverace.com下载并自行生成ACE。这两个站点包含有许多其他的与ACE有关的材料,比如教程、技术论文,以及对没有在本书中涵盖的其他ACE wrapper facade和框架的综述。你还可以以极低的价格从Riverace购买ACE的预编译版本。Riverace所支持的预生成编译器和OS平台的列表,见http://www.riverace.com。 如果你想要自行生成ACE,你应该下载ACE的发布文件,并将其解压到一个空目录中。发布文件的*目录名是ACE_wrapper。我们指称这个*目录为“ACE_ROOT”。你应该用这个名字创建一个环境变量,在其中包含*ACE目录的全路径。ACE源文件和头文件位于$ACE_ROOT/ace中。 在$ACE_ROOT/ACE-INSTALL.html文件中有生成ACE的全部指令,其中包括怎样为你的OS和编译器进行配置。本书的网络化日志服务示例的源文件和头文件位于$ACE_ROOT/examples/C++NPv2中,并且可以在ACE所支持的所有平台上生成。要生成你自己的程序,必须把$ACE_ROOT加到你的编译器的文件包含路径中。对于命令行编译器,可以通过-I或/I编译器选项来完成此工作。图形的IDE提供了类似的选项,比如MSVC++中,在Project Settings对话框上的C/C++选项卡的 “Preprocessor, Additional include directories”选项。 |