这是国内第一本从源代码角度去讲解ACE的著作。本书从构架模式、应用示例和源代码三个方面,使用了近400个图例(包括框架代码、框架使用示例、UML类图、UML顺序图)详细地分析了ACE的Reactor、Service Configurator、Task、Acceptor_Connector、Proactor和Stream共六个框架。通过本书,我们不仅可以从理论上学习到框架的设计原理,还可以从源代码中学习到框架的实现。本书的图例不仅可以帮助你实现与软件框架的一次亲密接触,还可以真正减少你学习的时间和精力。书中还涉及十多个Gof经典设计模式,为我们学习和掌握设计模式提供了非常好的实际场景。
ACE是一个重量级的 C++ 网络库。本书从构架模式、编程示例和源代码三个方面详细地介绍了ACE的Reactor、Service Configurator、Task、Acceptor_Connector、Proactor和Streams框架。书中涉及10多种Gof经典设计模式,对每个框架的的设计和实现进行了细致的分析。通过对本书的学习,读者不仅可以掌握部分构架模式的理论知识,还可以从ACE的源代码中学习到很多框架的实现方法。这些理论知识和实现方法,对在实际的项目和产品中构建软件框架具有指导意义。对于希望理解如何设计和实现软件框架的开发人员,以及普通的程序员和架构师,本书都具有很好的参考价值。
—— 51CTO(www.51cto.com) 中国领先的IT技术网站
本书主要内容
模式与框架的概念,以及二者之间的关系;
ACE框架的基本组成和宏观架构,以及ACE Socket封装器的详细分析;
Reactor框架的设计分析、应用分析和实现分析,包括框架的架构模式、应用示例、事件处理器接口的实现、管理器的设计分析、I/O事件调度的分析、信号量事件调度的分析、定时器事件调度的分析、Notify事件调度的分析等内容;
Service Configurator框架的设计分析、应用分析和实现分析,包括框架的架构模式、应用示例、ACE动态库接口封装的分析、配置组件接口的分析、组件工厂函数的分析、动态符号定位的分析、配置组件仓库的分析、配置组件类型的分析等内容;
Task框架的设计分析、应用分析和实现分析,包括框架的应用示例、ACE消息队列的实现分析、ACE多线程编程、框架接口的分析、Active Object设计模式等内容;
Acceptor_Connector框架的设计分析、应用分析和实现分析,包括框架的架构模式、应用示例、服务器处理接口的分析、Acceptor设计的分析、Connector设计的分析等内容;
Proactor框架的设计分析、应用分析和实现分析,包括框架的架构模式、应用示例、事件完成处理器接口的分析、异步操作初始化器和操作结果的分析、异步非I/O调度事件的分析、定时器事件调度的分析、Proactor框架的调度分析等内容;
Streams框架的设计分析、应用分析和实现分析,包括框架的架构模式、应用示例、ACE_Module类的分析、ACE_Stream类的分析等内容;
对10余种经典设计模式的深入解读和阐释;
包含大量网络编程、动态库编程、异步编程、C++编程方面的技巧和最佳实践。
本书通过源代码和编程示例对经典网络框架ACE的架构设计和实现原理进行了深刻解读,对于ACE的使用者和研究者来说,绝对是一份宝贵的资料。但是,本书的价值远远不止于此,而且这也不是它的核心价值之所在。本书的核心价值是,它以ACE这个框架为研究对象,通过它的设计思想和原理来指导框架设计者去设计属于自己的软件框架,揭示了软件框架设计的哲学和艺术。大家都知道,软件框架的设计代表着软件设计的最高水准,它比应用程序和工具箱都要更难设计,本书旨在为框架软件设计者和平台软件设计者提供思想性指导。除此之外,本书还有另外一点非常重要的价值,即它能帮助读者进一步掌握设计模式、网络编程、动态库编程、异步编程、C++编程的最佳实践等重要知识。
作 者 简 介
潘荣 资深C/C++网络开发工程师,有多年的软件开发经验。对ACE框架有非常深入的认识和研究。曾就职于国内知名通信企业,从事嵌入式产品的研发工作。现主要从事Linux下应用程序的开发工作。
关注面向对象的分析与设计技术,对软件框架的设计思想和哲学有比较深刻的领悟,对软件框架的设计方法和原理有系统性的认识。
为什么写作本书
软件框架的设计始终代表着业界最高的设计水准,《设计模式》一书指出:如果说应用程序难以设计,那么工具箱就更难了,而框架则是最难的。
尽管业界有一些大型的、常用的软件框架,如OMG的CORBA框架、SUN的EJB框架和微软的DCOM框架,但是很多一线的开发人员在日常的开发活动中并不和它们打交道,也很少接触其他软件框架。在这种情况下,我们如何来学习软件框架的设计思想,如何让这些思想来帮助我们设计和架构自己的软件框架呢?
ACE(Adaptive Communication Environment)是一个开源的、面向对象的网络框架,它实现了很多用于并发通信软件的核心模式,是一个非常好的软件框架学习平台。学习ACE所需要的特殊的专业知识非常少,读者只要熟悉C++和网络编程即可。有了本书可以让你的框架学习事半功倍。
虽然本书还无法和参考资料中大师们的著作相比,但是其对你学习软件框架的架构设计与实现原理同样会有非常大的帮助。侯捷大师说过这样一句话:“源码之前,了无秘密。”本书通过框架代码、框架使用示例、UML类图、UML顺序图详细分析了ACE的Reactor、Service Configurator、Task、Acceptor_Connector、Proactor和Streams等6个框架。这些图例不仅可以帮助你从源代码的角度学习框架的架构设计与实现原理,实现与软件框架的一次亲密接触,还可以真正减少你学习所需的时间和精力。
书中每一个框架的架构原理均来自《Pattern-Oriented Software Architecture—A System of Patterns》和《Pattern-Oriented Software Architecture: Patterns for Concurrent and Networked Objects, Volume 2》,想深入学习架构原理的读者可以在阅读时参考以上两本书。
读者对象
本书主要适合以下读者:
q 希望深入理解软件框架设计和实现的读者。本书从构架模式和源代码两个方面,分析了ACE的6个框架的设计和实现原理。这些内容非常适合这部分读者学习和掌握软件框架的设计思想,进而设计和实现自己的软件框架。
q ACE应用开发人员。对这部分读者来说,本书的内容有助于加深对ACE网络框架的理解,提高自己的开发水平。本书可以作为他们定制和扩展ACE网络框架的宝贵参考资料。
q C/C++编程人员。书中有大量对C++源代码的分析,包括网络编程、动态库编程和异步编程,还涉及十多个Gof经典设计模式,是C/C++编程人员非常好的进阶书籍。
q 平台开发人员和架构师。ACE的设计和实现都极其优秀,它的实现源码和架构思想非常值得这类读者去学习和研究。
如何阅读本书
学习本书应当具备的基础知识如下(ACE是一个跨平台的网络框架,这里不区分Windows、Linux、UNIX等各种不同平台)。
q 熟悉Socket编程,至少了解一种平台的常用的Socket API。
q 熟悉多线程编程,至少了解一种平台常用的多线程编程接口。
q 可选知识有:了解一种平台的动态库知识(用于Service Configurator框架)和异步编程知识(用于Proactor框架)。如果需要这些知识也可以在学习本书的过程中查阅相关资料。
本书共分7章,其中第1章介绍了ACE的Socket封装器,其余6章详细分析了ACE的Reactor、Service Configurator、Task、Acceptor_Connector、Proactor和Streams共6个框架。每个框架的分析又分为3部分:
第一部分是框架的设计分析。每一个框架(除Task框架)都有一个构架模式与之对应,构架模式阐述了框架的设计原理,给出了框架的总体结构,是学习框架的理论基础。
第二部分是框架的应用分析。每个框架都有一个应用实例与之对应,应用实例既帮助读者了解框架的实际使用方法,又为读者提供了一个可以调试的应用程序,便于读者使用调试器探索框架的内部秘密。
第三部分是框架的实现分析,也是本书的重点。本书对框架的实现进行了详细分析,并且对重点的类和流程给出了UML类图和UML顺序图,可以让读者在短时间内掌握框架的实现技术。
ACE的6个框架在实现上是相互独立的,在使用时又可以相互调用。如果读者是第一次接触ACE的框架,建议从本书的第1章开始学习。如果读者已经学习了ACE的部分框架,那么可以根据需要选择相关的章节补充学习。
勘误和支持
由于本人水平有限,书中难免有错误之处,恳请您在阅读时给予批评和指正。您可以访问我的博客http://blog.csdn.net/panrong_nust和我交流,也可以直接将您的宝贵意见发送到panrong.nust@gmail.com。我将及时修改书中的错误并在我的博客中发布,同时也会尽最大努力为您提供支持和帮助,期待能够得到您的反馈。
本书的源代码来自ACE官方网站:http://www.cse.wustl.edu/~schmidt/ACE.html,选择的版本是ACE-6.0.0。
本书中的示例代码请登录华章网站(http://www.hzbook.com)进行下载。
致谢
感谢ACE的开发和设计者们,是你们奉献了一款优秀的开源软件框架!
感谢机械工业出版社华章分社的策划编辑杨福川老师,有了你的热心帮助才使本书得以出版!感谢姜影老师孜孜不倦地帮我修改稿件!
感谢我的父母,感谢你们将我培养成人。感谢我的小妹和妹夫。
感谢我的爱人,谢谢你的支持和鼓励。
感谢潘天骄和潘锦程两位小朋友,祝你们童年快乐!
感谢我的老师、朋友,谢谢你们的关心和帮助!
谨以此书献给加班在一线的最普通的程序员们,祝福你们!
潘 荣
计算机\程序设计
ACE是一个重量级的 C++ 网络库。本书从构架模式、编程示例和源代码三个方面详细地介绍ACE的Reactor、Service Configurator、Task、Acceptor_Connector、Proactor和Stream框架。书中涉及10多种Gof经典设计模式,对每个框架的的设计和实现进行了细致的分析。通过对本书的学习,读者不仅可以掌握部分构架模式的理论知识,还可以从ACE的源代码中学习到很多框架的实现方法。这些理论知识和实现方法,对在实际的项目和产品中构建软件框架具有指导意义。对于希望理解如何设计和实现软件框架的开发人员,以及普通的程序员和架构师,本书都具有很好的参考价值。
——51CTO(www.51cto.com) 中国领先的IT技术网站
本书主要内容:
1.模式与框架的概念,以及二者之间的关系;
2.ACE框架的基本组成和宏观架构,以及ACE Socket封装器的详细分析;
3.Reactor框架的设计分析、应用分析和实现分析,包括框架的架构模式、应用示例、事件处理器接口的实现、管理器的设计分析、I/O事件调度的分析、信号量事件调度的分析、定时器事件调度的分析、Notify事件调度的分析等内容;
4.Service Configurator框架的设计分析、应用分析和实现分析,包括框架的架构模式、应用示例、ACE动态库接口封装的分析、配置组件接口的分析、组件工厂函数的分析、动态符号定位的分析、配置组件仓库的分析、配置组件类型的分析等内容;
5.Task框架的设计分析、应用分析和实现分析,包括框架的应用示例、ACE消息队列的实现分析、ACE多线程编程、框架接口的分析、Active Object设计模式等内容;
6.Acceptor_Connector框架的设计分析、应用分析和实现分析,包括框架的架构模式、应用示例、服务器处理接口的分析、Acceptor设计的分析、Connector设计的分析等内容;
7.Proactor框架的设计分析、应用分析和实现分析,包括框架的架构模式、应用示例、事件完成处理器接口的分析、异步操作初始化器和操作结果的分析、异步非I/O调度事件的分析、定时器事件调度的分析、Proactor框架的调度分析等内容;
8. Streams框架的设计分析、应用分析和实现分析,包括框架的架构模式、应用示例、ACE_Module类的分析、ACE_Stream类的分析等内容;
9.对10余种经典设计模式的深入解读和阐释;
10. 包含大量网络编程、动态库编程、异步编程、C++编程方面的技巧和最佳实践。
潘荣 著:放排好的目录及图书封面的宣传语(设计时找策划要)
前 言
第1章 概述 / 1
1.1 模式与框架 / 1
1.1.1 模式 / 1
1.1.2 框架 / 2
1.1.3 模式与框架的关系 / 3
1.2 ACE框架 / 3
1.3 关于本书 / 7
1.3.1 本书的内容 / 7
1.3.2 源代码的表示 / 8
1.3.3 测试组网 / 9
1.3.4 几个常用术语 / 9
1.4 ACE Socket封装器 / 9
1.4.1 示例分析 / 10
1.4.2 Socket IPC分析 / 13
1.4.3 ACE_SOCK_Acceptor类的分析 / 15
1.4.4 ACE_SOCK_Connector类的分析 / 19
1.5 进一步学习 / 23
1.6 总结 / 23
第2章 Reactor框架 / 24
2.1 Reactor构架模式 / 24
2.2 Reactor框架概述 / 26
2.3 Reactor框架应用示例 / 27
2.3.1 I/O事件处理器的实现 / 27
2.3.2 Accept事件处理器的实现 / 31
2.3.3 main函数 / 34
2.4 事件处理器接口实现 / 35
2.4.1 事件处理器接口的构造与析构 / 38
2.4.2 事件处理器接口的使用规范 / 38
2.5 Reactor管理器的设计分析 / 39
2.5.1 Reactor管理器接口分析 / 40
2.5.2 Bridge设计模式接口 / 44
2.5.3 ACE_Select_Reactor_Impl类的分析 / 45
2.5.4 ACE_Select_Reactor_T类的分析 / 46
2.6 I/O事件调度的分析 / 47
2.6.1 I/O事件调度集的设计 / 47
2.6.2 调度集操作函数的分析 / 50
2.6.3 I /O事件处理器仓库的分析 / 53
2.6.4 I/O事件注册流程的分析 / 59
2.6.5 I/O事件调度流程的分析 / 61
2.6.6 I/O事件删除流程的分析 / 70
2.7 信号量事件调度的分析 / 71
2.7.1 信号量事件管理器的分析 / 71
2.7.2 Reactor管理器中的信号量事件处理 / 77
2.7.3 信号量事件删除流程的分析 / 78
2.8 定时器事件调度的分析 / 79
2.8.1 定时器事件管理器的分析 / 80
2.8.2 定时器事件注册流程的分析 / 93
2.8.3 定时器事件调度流程的分析 / 94
2.8.4 定时器事件删除流程的分析 / 95
2.9 Notify事件调度的分析 / 96
2.9.1 Notify事件管理器的分析 / 97
2.9.2 Notify事件注册流程的分析 / 105
2.9.3 Notify事件调度流程的分析 / 106
2.10 进一步学习 / 107
2.11 总结 / 107
第3章 Service Configurator框架 / 108
3.1 Component Configurator构架模式 / 108
3.2 Configurator框架概述 / 109
3.3 Configurator框架应用示例1 / 111
3.3.1 配置文件 / 111
3.3.2 可配置组件 / 111
3.3.3 main函数 / 113
3.4 ACE动态库接口封装的分析 / 114
3.5 配置组件接口的分析 / 115
3.6 组件工厂函数的分析 / 117
3.7 组件配置器设计的分析 / 119
3.7.1 组件配置器控制接口的分析 / 119
3.7.2 组件配置器实现的分析 / 128
3.7.3 语法分析器的分析 / 138
3.8 动态库符号定位的分析 / 141
3.8.1 ACE_Location_Node类分析 / 142
3.8.2 ACE_Object_Node类的分析 / 143
3.8.3 ACE_Function_Node类的分析 / 144
3.9 配置组件仓库的分析 / 147
3.9.1 find函数 / 148
3.9.2 remove函数 / 149
3.9.3 suspend函数 / 150
3.9.4 resume函数 / 150
3.10 配置组件类型的分析 / 151
3.10.1 ACE_Service_Type类 / 152
3.10.2 ACE_Service_Type_Impl类 / 153
3.10.3 ACE_Service_Object_Type类 / 154
3.10.4 ACE_Service_Type_Factory类 / 154
3.11 指令解析功能的分析 / 156
3.12 配置文件解析流程的分析 / 157
3.13 Configurator框架应用示例2 / 160
3.13.1 可配置组件 / 160
3.13.2 配置文件 / 161
3.13.3 配置文件解析流程的分析 / 162
3.14 配置改变 / 162
3.15 Configurator框架应用示例3 / 162
3.15.1 静态配置组件 / 163
3.15.2 配置文件 / 165
3.15.3 静态配置组件分析 / 166
3.16 进一步学习 / 169
3.17 总结 / 169
第4章 Task框架 / 170
4.1 Task框架概述 / 170
4.2 Task框架应用示例 / 171
4.2.1 生产者 / 171
4.2.2 消费者 / 173
4.2.3 main函数 / 174
4.3 ACE消息队列实现分析 / 175
4.3.1 数据块结构分析 / 176
4.3.2 消息块结构的分析 / 180
4.3.3 消息队列实现的分析 / 182
4.4 ACE多线程编程 / 185
4.4.1 线程的创建 / 186
4.4.2 线程的运行 / 189
4.4.3 线程的退出 / 191
4.4.4 线程等待 / 195
4.5 Task框架接口的分析 / 198
4.5.1 ACE_Task_Base类 / 199
4.5.2 ACE_Task类 / 200
4.6 Active Object设计模式 / 201
4.6.1 模式概述 / 201
4.6.2 应用示例 / 203
4.6.3 ACE_Future和ACE_Future_Rep类 / 207
4.7 进一步学习 / 210
4.8 总结 / 210
第5章 Acceptor_Connector框架 / 211
5.1 Acceptor_Connector构架模式 / 211
5.2 Acceptor_Connector框架概述 / 212
5.3 Acceptor_Connector框架应用示例 / 213
5.3.1 open函数 / 214
5.3.2 handle_input函数 / 214
5.3.3 handle_close函数 / 215
5.3.4 main函数 / 215
5.4 服务处理器接口的分析 / 216
5.4.1 open函数 / 217
5.4.2 handle_close函数 / 218
5.4.3 close函数 / 219
5.4.4 shutdown函数 / 219
5.5 Acceptor设计的分析 / 220
5.5.1 ACE_Acceptor类 / 220
5.5.2 open函数 / 221
5.5.3 handle_input函数 / 222
5.5.4 handle_close函数 / 224
5.6 Connector设计的分析 / 225
5.6.1 ACE_Connector类 / 226
5.6.2 阻塞模式连接的分析 / 226
5.6.3 非阻塞模式连接的分析 / 229
5.7 进一步学习 / 236
5.8 总结 / 236
第6章 Proactor框架 / 237
6.1 Proactor构架模式 / 237
6.2 Proactor框架概述 / 239
6.3 Proactor框架应用示例 / 240
6.3.1 I/O事件完成处理器的实现 / 240
6.3.2 异步Acceptor的实现 / 245
6.3.3 main函数 / 245
6.4 事件完成处理器接口的分析 / 246
6.5 Proactor管理器的设计分析 / 247
6.5.1 Proactor管理器接口的分析 / 248
6.5.2 Bridge设计模式接口 / 252
6.5.3 ACE_POSIX_Proactor接口分析 / 252
6.6 异步操作初始化器和操作结果分析 / 253
6.6.1 公共接口介绍 / 256
6.6.2 ACE_POSIX_Asynch_Operation类 / 256
6.6.3 ACE_POSIX_Asynch_Result类 / 258
6.6.4 ACE_POSIX_Asynch_Read_Stream_Result类 / 261
6.6.5 ACE_POSIX_Asynch_Read_Stream类 / 263
6.7 ACE_POSIX_AIOCB_Proactor管理器实现的分析 / 265
6.7.1 构造函数 / 267
6.7.2 start_aio函数 / 268
6.7.3 handle_events_i函数 / 271
6.7.4 find_completed_aio函数 / 274
6.7.5 start_deferred_aio函数 / 275
6.7.6 application_specific_code函数 / 277
6.8 异步非I/O事件调度的分析 / 278
6.8.1 ACE_AIOCB_Notify_Pipe_Manager类 / 278
6.8.2 post_completion函数 / 281
6.8.3 putq_result函数 / 282
6.8.4 process_result_queue函数 / 283
6.9 定时器事件调度的分析 / 283
6.9.1 定时器事件操作结果的分析 / 284
6.9.2 定时器管理器实现的分析 / 285
6.10 网络连接之accept事件调度的分析 / 290
6.10.1 Reactor任务分析 / 292
6.10.2 异步Acceptor分析 / 293
6.10.3 ACE_POSIX_Asynch_Accept类 / 294
6.10.4 ACE_POSIX_Asynch_Accept_Result类 / 300
6.10.5 ACE_Asynch_Acceptor类 / 302
6.11 Proactor框架的调度分析 / 311
6.11.1 调度函数分析 / 311
6.11.2 退出调度分析 / 311
6.12 进一步学习 / 313
6.13 总结 / 313
第7章 Streams框架 / 314
7.1 管道和过滤器构架模式 / 314
7.2 Streams框架的概述 / 315
7.2.1 ACE_Task类 / 315
7.2.2 put函数 / 316
7.2.3 put_next函数 / 316
7.3 Streams框架应用示例 / 317
7.3.1 Logrec_Reader类 / 317
7.3.2 Logrec_Timer类 / 318
7.3.3 Logrec_Suffix类 / 319
7.3.4 Logrec_Writer类 / 319
7.3.5 main函数 / 320
7.4 ACE_Module类的分析 / 322
7.4.1 open函数 / 323
7.4.2 link函数 / 324
7.4.3 ACE_Module的关闭 / 325
7.5 ACE_Stream类的分析 / 326
7.5.1 构造函数 / 326
7.5.2 open函数 / 327
7.5.3 push函数 / 329
7.5.4 close函数 / 330
7.6 进一步学习 / 331
7.7 总结 / 331
参考文献 / 332