本书为使用C++语言的分布式和并行编程提供了体系结构上的方法,对C++语言的标准库、算法以及容器类在分布式和并行环境中如何运转进行了特别关注,对通过类库和函数库扩展C++语言,以实现分布式和并行编程任务的方法进行了解释,强调了对于多线程C++语言如何与新的POSIX和单一UNIX标准协同工作。同样本书也讨论了将C++语言可执行代码与其他语言的可执行代码结合起来,实现分布式或者并行编程问题多语言的解决方法,并且介绍了几种支持并行和分布式编程的软件组织方法。
本书示范了如何排除并行操作中的基本障碍,探讨了新兴的并行化思想。本书中我们关注的核心不是优化技术、硬件细节、性能比较或者试图将并行编程技术应用到复杂的科学或数学算法中;而是关注于如何组织计算机程序和软件系统以充分发挥并行化的优势。此外,我们还会让读者熟悉解决某些分布式或并行编程固有问题的多范例(multiparadigm)方法。有效解决这些问题通常要求综合采用几种软件设计和工程方法。例如,我们采用面向对象编程技术来解决数据竞争和同步问题。我们使用面向agent的体系结构来处理多进程和多线程的管理。黑板(blackboard)方法则用来使流出的通信量最小。除了面向对象、面向agent和面向人工智能的编程技术外,我们还使用参数化编程技术来实现适合于需要并发操作的通用算法(generalized algorithm)。我们开发不同规模和形式的软件的经历使我们相信:成功的软件设计和实现要求通用性。本书中我们提出的建议、思想和解决方法正是我们这些经历的体现。
并行和分布式编程的挑战
编写并行和分布式程序存在三个基本的挑战,它们分别是:
(1)确认问题领域的环境中存在的固有并行性。
(2)将软件适当地分成两个或多个任务,这些任务可以在同一时刻执行,以完成所需的并行性。
(3)协调上述过程中所分隔的任务,使软件正确高效地运行,从而达到预期目的。
对于并行操作,这三个挑战中会有下述障碍:
数据竞争 死锁检测
部分失效 延迟
死锁 通信失效
终止检测 缺少全局状态
多时钟问题 协议不匹配
定位错误 缺少集中资源分配
本书解释了这些障碍是什么、它们为什么发生以及如何管理它们。
.
最后,我们在并发操作中采用的几种机制使用TCP/IP作为协议。特别是MPI(Message Passing Interface,消息传递接口)库、PVM(Parallel Virtual Machine,虚拟并行计算机)库和MICO(CORBA)库,这些机制都使用TCP/IP作为协议。因此,这允许我们的方法可以用于Internet/Intranet环境,这意味着并行协同运转的程序可以在Internet或者企业的Intranet中的不同站点上执行,并且通过消息传递通信。关于并发操作的思想,有许多是Web服务基础结构的基石。除了MPI和PVM例程外,我们使用的CORBA对象可以跨越Internet与不同的服务器进行通信。这些构件可以用来提供多种Internet/Intranet服务。
并行和分布式编程的方法
我们提倡对分布式和并行编程中存在的挑战和障碍使用组件方法。我们主要的目标是使用框架类作为并发的构建块。框架类通过面向对象的互斥锁、信号量、管道和套接字支持。通过使用接口类,任务同步和通信的复杂度大大降低了。我们采用agent驱动的线程和进程来促进线程和进程的管理。对于全局状态及其相关问题,我们的主要方法包括黑板模型的使用。我们综合面向agent和面向对象的体系结构来实现多范例解决方法。通过使用支持面向对象编程、参数化编程和结构化编程的C++语言,使多范例的方法成为可能。
为什么选用C++?
实际上每个平台和操作环境都有可以利用的C++编译器。ANSI(American National Standards Institute,美国国家标准化协会)和ISO(International Standard Organization,国际标准化组织)已经为C++语言及其库定义了标准。C++语言有与商业实现一样健壮的开源实现。C++语言在世界范围内已经广泛地被研究人员、设计者和专业开发人员采用。C++语言已经用于解决不同规模和形式(从驱动程序到大规模的工业应用程序)的问题。C++语言支持软件开发的多范例方法,并且已经可以使用增加了并行和分布式编程能力的库。
并行和分布式编程的库
MPICH(MPI的一种实现)、PVM库和Pthread(POSIX线程)库用来实现使用C++的并行编程;MICO(CORBA标准的C++实现)用来实现分布式编程。C++标准库与CORBA和Pthread库结合在一起,为本书讨论的面向agent和黑板编程概念提供了支持。
新的单一UNIX规范标准
新的单一UNIX规范标准,版本号为3,于2001年发布,是IEEE和Open Group合作的结晶。新的单一UNIX规范包括POSIX标准,并且为应用程序员提供了可移植性。该标准为软件开发人员提供一个单独的、所有UNIX系统都支持的API集合。它为需要编写多任务和多线程应用程序的程序员提供了一个可靠的标准路线图。本书中我们关于进程创建、进程管理、Pthread库、新的posix_spawn()例程、POSIX信号量和FIFO的讨论都基于单一UNIX规范标准。本书中的附录B包含的单一UNIX规范标准的摘录可以用作我们所提供的资料的引用。
本书面向的读者
本书为软件设计人员、软件开发人员、应用程序员、研究员、教育工作者以及使用C++语言、需要并行和分布式编程导论的学生编写。学习本书需要具有初步的C++语言和标准C++类库的知识。本书不是C++编程或者面向对象编程的指南,假定了读者对面向对象技术(例如封装、继承和多态)已有基本的了解。本书介绍了C++语言环境中并行和分布式编程的基本知识。
支持的开发环境
本书中所提供的例子和程序都是在Linux和UNIX环境,具体说就是Solaris 8、Aix和Linux(SuSE,Red Hat)下开发和测试的。PVM和MPI代码是在基于Linux、具有32个节点的集群上开发和测试的。本书中的大多数程序在SUN公司的Enterprise 450上进行了测试。我们使用了SUN公司的C++ Workshop、Portland Group的C++编译器以及GNU C++。本书中的大多数例子都可以在UNIX和Linux两个环境中运行,对于在这两种环境下都不能运行的例子,本书在为完整的程序例子提供的程序说明(Program Profile)中进行了注释。
补充
UML图:
本书中的许多图使用了UML(Unified Modeling Language,统一建模语言)标准,特别是用来描述重要的并行操作的体系结构和类关系的活动图、部署图、类图、状态图。尽管在本书中对UML的了解不是必需的,但是精通UML的话会有很大的帮助。附录A包含了本书中所使用的UML符号和语言的解释和描述。
程序说明
本书中每个完整的程序都有一个程序说明。说明中包含有诸如所需的头文件、所需的库、编译指令和链接指令的实现的详细说明。说明同样也包括一个“注意”说明段,该段中包含了执行该程序时需要注意的特殊考虑事项。对于没有说明的代码则意味着该代码仅限于讲解目的。
补充内容
我们尽量避免在像本书一样的入门教材中采用过于理论的表示法。但是,在某些情况下理论或者数学表示法是不可避免的。在这种情况下,我们使用了理论或者数学表示法,但是我们在补充内容中为该表示法提供了详细的解释。
测试和代码可靠性
尽管本书中所有的代码和应用程序为了保证正确性已经进行了测试,但是我们不保证本书中所包含的程序没有缺陷或者错误,与任何特定标准或者商品一致或者对于任何特定应用程序满足你的需求。我们不应依赖这些程序来解决问题,因为不正确的解决方法将导致人身的伤害或者财产的损失。作者和出版商拒绝承担你使用本书中的例子、程序或者应用程序所造成的直接或间接伤害的所有责任。
致谢
如果没有许多朋友和同事的帮助、建议、建设性批评以及他们提供的资源,我们不可能成功地完成本书的编写。特别要指出的是,我们要感谢OSC(Ohio Super-Computing)公司的Terry Lewis和Doug Johnson,他们为我们提供了基于Linux、具有32个节点的集群的完全访问;感谢YSU大学的Mark Welton,他为我们配置支持PVM和MPI程序的集群提供了帮助,提出了专家意见;感谢YSU大学的Sal Sanders,他允许我们访问运行Mac OSX和Adobe Illustrator的Power PC;感谢YSU大学的Brian Nelson允许我们在SUN公司的E-250和E-450多处理机上测试我们大部分的多线程和分布式程序;我们也受到YSU大学MAAG的Mary Ann Johnson和Jeffrey Trimble的帮助,他们为我们查找和保存我们所需的技术引用;感谢IEEE标准、认证和合约办公室的Claudio M. Stanziola、Paulette Goldweber和Jacqueline Hansson,从他们那里我们获得授权复印了新的单一UNIX/POSIX标准的部分内容;Open Group组织的Andrew Josey和Gene Pierce也在这方面提供了帮助;感谢Z-Group公司的Trevor Watkins,他为我们测试了程序例子,他的多Linux分布式环境对于测试过程非常重要;特别要感谢的是Steve Tarasweki,他对本书的草稿进行了技术上的审阅。感谢Eugene Santos博士在我们探讨如何将数据结构分类以便用于PVM中时为我们指明了方向;感谢YSU大学高级计算工作组的Mike Crescimanno博士允许我们引用一些ACWG会议的资料;最后,感谢Prentice Hall出版社的Paul Petrlia及其制作组(特别是Gail Cicker-Bogusz)容忍我们超过了最终期限以及古怪的UNIX/Linux文件格式——我们特别要感谢他们的耐心、勇气、激情和专业。