译 者 序 随着多核时代的到来,原本只属于高端应用的并行化编程也随之变得越来越普及。可以说,在处理器平台多核的大潮中,单纯的芯片制造工艺和技术已经不足以体现和发挥出多核所带来的更高处理能力以及性能优势,具备在多核环境中多线程工作的软件将会成为发挥多核高效率的保证。 多核技术在单个封装内集成了更多的核,为实现真正并行提供了物质基础。那么究竟如何设计和编写并行应用程序才能充分发挥多核架构的资源优势?这正是软件开发人员所要解决的问题。本书从这一需求出发,期望为面向多核架构设计和编写并行应用程序的开发人员提供一些力所能及的帮助。 在翻译本书的过程中,我们的切身体会就是本书并不仅仅是简单地介绍如何编写多核程序,更重要的是为程序开发人员提供了如何顺利从命令式顺序编程迁移到声明式并行编程的方法。作者以多个应用实例贯穿本书,一步步引导读者领会如何从问题陈述逐步精化,最终实现并行程序。 本书由齐宁和董泽惠翻译完成,Be Flying工作室()负责人肖国尊负责翻译质量和进度的控制管理。书中文字和内容力求忠实原著,但限于译者水平和时间紧迫,翻译过程中难免出现不妥之处和错误,敬请广大读者批评指正。 前 言 多核革命即将到来。并行处理不再是超级计算机或集群的专属领域,入门级服务器乃至基本的开发工作站都拥有硬件级和软件级并行处理的能力。问题是这对于软件开发人员意味着什么?对软件开发过程会有怎样的影响?在谁拥有速度最快的计算机的竞争中,芯片生产商更倾向于在单独的芯片上放置多个处理器,而不是提高处理器的速度。迄今为止,软件开发人员尚能依赖于新的处理器,在不对软件做出任何实际改进的情况下提高软件的速度,但是这样的情况将成为过去。为了提高总体系统性能,计算机供应商已经决定增加更多的处理器,而不是提高时钟频率。这意味着如果软件开发人员希望应用程序从下一个新的处理器受益,就必须对应用程序进行修改以利用多处理器计算机。 尽管顺序编程和单核应用程序开发仍会有一席之地,但软件开发将向多线程和多进程转变。曾经仅被理论计算机科学家和大学学术界所关注的并行编程技术,现在正处于为大多数人所接受的过程中。多核应用程序设计和开发的思想如今成为人们关注的主流。 学习多核编程 本书使用一般软件开发人员能够理解的术语介绍多核编程的基本知识。为读者介绍了为多处理器和多线程体系结构进行编程的基础知识,对并行处理和软件并发的概念进行了实用的介绍。本书介绍的是深奥的、不易理解的并行编程技术,但将使用一种简单、可理解的方式来介绍它们。我们介绍了并发编程和同步的缺陷与陷阱以及应对之策,对多处理和多线程模型进行了直截了当的讨论。本书提供了大量的编程实例,示范了如何实现成功的多核编程。本书还包含了调试及测试多核编程的方法与技术。最后,我们示范了如何使用跨平台技术来利用处理器的具体特性。 不同的视角 本书的内容是为对多核编程和应用程序开发有着不同切入点的广大读者设计的。本书的读者包含但不限于: ● 库及工具制作人员 ● 操作系统程序员 ● 内核开发人员 ● 数据库服务器及应用服务器的设计人员及实现人员 ● 科学应用程序员以及使用计算密集型应用程序的用户 ● 应用程序开发人员 ● 系统程序员 每组人员都会从不同的视角来了解多核计算机。有些人关心的是使用自底向上的方法,需要开发利用特定硬件和特定供应商的特性的软件。对于上述人员而言,他们希望更加详尽地介绍多线程处理的知识。其他人员可能对自顶向下的方法感兴趣,他们不希望为并发任务同步或线程安全的细节费心,而是倾向于使用高级库和工具来完成工作。还有一些人需要混合使用自底向上和自顶向下的方法。本书提供了对多核编程的多种视角的介绍,涵盖了自底向上和自顶向下的方法。 解决方案是多范型方法 首先,我们承认不是每个软件解决方案都需要多处理或多线程。有些软件解决方案通过使用顺序编程技术能够更好地实现(即使目标平台是多核的)。我们的方法是以解决方案和模型作为驱动。首先,针对问题开发出模型或解决方案。如果解决方案要求某些指令、过程或任务并发地执行,那么就决定了最好使用哪组技术。这个方法同强迫解决方案或模型去适合一些预先选择的库或开发工具的方法相反。技术应当遵从解决方案。尽管本书讨论库和开发工具,但并不偏向任何具体生产商库或工具集。尽管书中包含了利用特定硬件平台的实例,但我们依赖跨平台方法,使用POSIX标准操作系统调用和库,并且仅使用国际化C++标准所支持的C++特性。 面对多处理和多线程中的挑战和障碍,我们倡导组件方法。主要的目的是利用框架类作为并发的构建块。框架类被面向对象互斥量(mutex)、信号量(semaphore)、管道(pipe)、队列(queue)和套接字(socket)所支持。通过使用接口类,显著降低了任务同步和通信的复杂度。在我们的多线程和多处理应用程序中,控制机制主要是agent驱动。
阅读更多