Windows并发编程指南(多核时代不可获缺的编程手册)
基本信息
编辑推荐
深入揭示Windows并发编程理论及实现
微软首席研究与战略官Craig Mundie作序推荐
推荐阅读
内容简介回到顶部↑
本书详细讲述windows并发编程的相关知识。内容分为四个部分:第一部分“概念”从高层视角介绍并发的基本概念,为读者理解并发打下基础;第二部分“机制”重点介绍了一些基础的功能、内部工作机制以及各种api等;第三部分“技术”介绍了一些常见的编程模式、最优方法、算法,以及在编写并发软件时需要使用的各种数据结构;第四部分“系统”介绍了一些在系统架构和流程中经常出现的问题。
本书内容翔实,实例丰富,适合windows开发人员、windows测试人员和windows技术支持人员等参考。
本书详尽地介绍了如何在开发软件时高效地使用并发和硬件并行,以及如何设计、实现和维护大型的、主要以windows平台上的c#和c++等语言编写的并发程序。
本书为应用程序、系统以及库等的开发人员在多核处理器上编写高效、安全的代码提供必要的工具和技术指导。这不仅对于那些存在内在并发性的领域(如服务器应用、计算密集的图像处理、金融分析、数值模拟以及ai算法等)来说是很重要的,而且对于一些可以通过并行来获得加速的领域(如数学库、排序算法、报告生成、xml处理以及流式处理算法等)来说同样是重要的。
本书主要包括四部分:第一部分从高层视角介绍并发的一些基本概念;第二部分重点介绍一些重要的平台功能、内部工作机制以及api细节等;第三部分介绍在编写并发软件时一些常见的编程模式、最优方法、算法和数据结构等;第四部分介绍在编写并发程序时需要注意的一些系统性的架构和流程方面的问题。
要想学习在windows和.net上进行并发编程的最优方法和通用模式,那么本书将是你唯一需要的一本书。
本书内容翔实,实例丰富,适合windows开发人员、windows测试人员和windows技术支持人员等参考。
本书详尽地介绍了如何在开发软件时高效地使用并发和硬件并行,以及如何设计、实现和维护大型的、主要以windows平台上的c#和c++等语言编写的并发程序。
本书为应用程序、系统以及库等的开发人员在多核处理器上编写高效、安全的代码提供必要的工具和技术指导。这不仅对于那些存在内在并发性的领域(如服务器应用、计算密集的图像处理、金融分析、数值模拟以及ai算法等)来说是很重要的,而且对于一些可以通过并行来获得加速的领域(如数学库、排序算法、报告生成、xml处理以及流式处理算法等)来说同样是重要的。
本书主要包括四部分:第一部分从高层视角介绍并发的一些基本概念;第二部分重点介绍一些重要的平台功能、内部工作机制以及api细节等;第三部分介绍在编写并发软件时一些常见的编程模式、最优方法、算法和数据结构等;第四部分介绍在编写并发程序时需要注意的一些系统性的架构和流程方面的问题。
要想学习在windows和.net上进行并发编程的最优方法和通用模式,那么本书将是你唯一需要的一本书。
作译者回到顶部↑
本书提供作译者介绍
Joe Duffy是Microsoft公司.NET框架团队中并行扩展功能的技术主管、架构师以及奠基者,就职于Visual Studio部门。除了编写代码和管理开发团队外,他还为团队定下了远景目标和长期策略。他当前的研究领域包括:函数式编程(Functional Programming)、类型系统中的并发安全性,以及开发一些编程模型来充分利用GPU和SIMD等处理器。Joe还是并行Parallel LINQ(PLINQ)的开发者,以及在通用语言运行时(CLR)中负责并发功能的程序经理。在加入Microsoft之前,他拥有7年的职业编程经历,包括在EMC工作了四年。他.. << 查看详细
目录回到顶部↑
对本书的赞誉
译者序
序
前言
致谢
作者简介
第一部分 概 念
第 1 章 概述1
1.1 为什么需要并发1
1.2 程序架构与并发2
1.3 并行的层次4
1.4 为什么不需要并发5
1.5 小结5
延伸阅读6
第 2 章 同步与时间7
2.1 程序状态的管理7
2.1.1 共享状态与私有状态的区分8
2.1.2 状态机与时间11
2.1.3 独立性17
2.1.4 不变性19
译者序
序
前言
致谢
作者简介
第一部分 概 念
第 1 章 概述1
1.1 为什么需要并发1
1.2 程序架构与并发2
1.3 并行的层次4
1.4 为什么不需要并发5
1.5 小结5
延伸阅读6
第 2 章 同步与时间7
2.1 程序状态的管理7
2.1.1 共享状态与私有状态的区分8
2.1.2 状态机与时间11
2.1.3 独立性17
2.1.4 不变性19
译者序回到顶部↑
随着多核处理器的日益普及,并发也逐渐成为IT行业和广大开发人员的关注焦点。并发并非一项新技术,例如在高端服务器和大型机上的并发技术已经发展了数十年,而在研究领域关于并发的理论也非常成熟。然而,要将并发作为一种普及性的编程技术,却还有很长的路要走。正如“罗马不是一日建成的”,开发人员在从传统的串行编程转向并行编程时也不能一蹴而就。这种转变要求从程序的设计、架构、开发、调试以及测试等方面都作出重大的调整,这种调整的规模或许不亚于从结构化编程转向面向对象编程的过程。
在这种转变过程中,开发人员会遇到许多问题:例如如何选择正确的同步原语,如何在程序的不同部分之间实现协同,哪些数据结构和设计模式可以提高并发编程的效率,以及如何避免并发中的一些常见错误等。在面对这些问题时,开发人员需要一本全面且实用的参考书,它不仅能由浅入深地阐述并发的各种基本概念,而且还能提供丰富的应用示例,Duffy的这本书正好能满足所有这些需求。本书包含以下特点:
(1)全面性。作者首先从高层视角阐述了Windows了并发机制的总体概览,然后从系统内核的底层同步原语(例如线程、内核同步原语等)开始,一直介绍到.NET中的高层同步抽象(例如线程池、数据同步与控制同步),基本上涵盖了Windows上各个层次的并发概念和机制。本书还介绍了一些与并发紧密相关的高级主题,包括内存模型与无锁编程、纤程、图形用户界面、输入与输出等。最后,本书还介绍了在并发编程中常见的误区与陷阱、编写可重用并发库时需要遵循的一些指导原则,以及如何衡量并发为程序带来的性能提升。
(2)实用性。在了解了Windows上的各种并发机制后,更重要的是如何在编程中使用它们,包括如何根据具体的问题来选择编程模式、最优方法以及数据结构等。针对这些需求,本书介绍了异步编程模型、并行容器,以及更高级的数据并行和任务并行等编程模式,这些内容足以处理各种常见的并发编程情况。此外,书中还给出了丰富的示例程序和代码分析。
在本书每一章的“延伸阅读”中还给出许多参考文献,包括公开发表的文章、参考书籍、研究报告以及博客等,希望进一步了解相关内容的读者可以阅读这些文献。
对于大多数程序员来说,并发仍然是一项神秘的技术,然而它也是我们在将来工作中不可回避的一个问题。“与其临渊羡鱼,不如退而结网”,虽然并发是一项较难掌握的技术,但只要按本书的内容组织循序渐进地学习,就一定可以将并发技术应用自如。
由于本书的技术性较强,因此读者在阅读本书时需要预先具备一定的基础,包括熟悉C++和C#等语言,对.NET框架和Windows系统的底层架构有一定的了解,并具备一定的编程和调试基础。
参与本书翻译工作的还有李杨、吴汉平、徐光景、童胜汉、陈军、胡凯、刘红、张玮、陈红、李斌、李勇涛、王海涛、周云波、彭敏才、张世锋、朱介秋、宗敬、李静、叶锦、高波、熊莉、程凤、陈娟、胡世娟、董敏、谢路阳、冯卓、李志勇、胡欢、王进等。由于译者的时间和水平有限,翻译中的疏漏和错误在所难免,还望读者和同行不吝指正。
感谢冀康将这本书的翻译工作交给了我,让我再次体会到翻译一本好书带来的乐趣。感谢家人在翻译本书的过程中给予的理解和支持,使我能够顺利完成翻译工作。
聂雪军
2009年8月于武汉
在这种转变过程中,开发人员会遇到许多问题:例如如何选择正确的同步原语,如何在程序的不同部分之间实现协同,哪些数据结构和设计模式可以提高并发编程的效率,以及如何避免并发中的一些常见错误等。在面对这些问题时,开发人员需要一本全面且实用的参考书,它不仅能由浅入深地阐述并发的各种基本概念,而且还能提供丰富的应用示例,Duffy的这本书正好能满足所有这些需求。本书包含以下特点:
(1)全面性。作者首先从高层视角阐述了Windows了并发机制的总体概览,然后从系统内核的底层同步原语(例如线程、内核同步原语等)开始,一直介绍到.NET中的高层同步抽象(例如线程池、数据同步与控制同步),基本上涵盖了Windows上各个层次的并发概念和机制。本书还介绍了一些与并发紧密相关的高级主题,包括内存模型与无锁编程、纤程、图形用户界面、输入与输出等。最后,本书还介绍了在并发编程中常见的误区与陷阱、编写可重用并发库时需要遵循的一些指导原则,以及如何衡量并发为程序带来的性能提升。
(2)实用性。在了解了Windows上的各种并发机制后,更重要的是如何在编程中使用它们,包括如何根据具体的问题来选择编程模式、最优方法以及数据结构等。针对这些需求,本书介绍了异步编程模型、并行容器,以及更高级的数据并行和任务并行等编程模式,这些内容足以处理各种常见的并发编程情况。此外,书中还给出了丰富的示例程序和代码分析。
在本书每一章的“延伸阅读”中还给出许多参考文献,包括公开发表的文章、参考书籍、研究报告以及博客等,希望进一步了解相关内容的读者可以阅读这些文献。
对于大多数程序员来说,并发仍然是一项神秘的技术,然而它也是我们在将来工作中不可回避的一个问题。“与其临渊羡鱼,不如退而结网”,虽然并发是一项较难掌握的技术,但只要按本书的内容组织循序渐进地学习,就一定可以将并发技术应用自如。
由于本书的技术性较强,因此读者在阅读本书时需要预先具备一定的基础,包括熟悉C++和C#等语言,对.NET框架和Windows系统的底层架构有一定的了解,并具备一定的编程和调试基础。
参与本书翻译工作的还有李杨、吴汉平、徐光景、童胜汉、陈军、胡凯、刘红、张玮、陈红、李斌、李勇涛、王海涛、周云波、彭敏才、张世锋、朱介秋、宗敬、李静、叶锦、高波、熊莉、程凤、陈娟、胡世娟、董敏、谢路阳、冯卓、李志勇、胡欢、王进等。由于译者的时间和水平有限,翻译中的疏漏和错误在所难免,还望读者和同行不吝指正。
感谢冀康将这本书的翻译工作交给了我,让我再次体会到翻译一本好书带来的乐趣。感谢家人在翻译本书的过程中给予的理解和支持,使我能够顺利完成翻译工作。
聂雪军
2009年8月于武汉
前言回到顶部↑
我在2005年底开始写这本书。当时,双核处理器正成为普通消费者(非程序员)购买PC的主流标准,并且在计算机业界也开始有人在讨论日渐重要的并发问题(例如,Herb Sutter发表的经典文章“The Free Lunch is Over”)。当然,人们担心的问题是,过去在编写软件时并没有考虑如何充分利用不断增加的计算能力,因为时钟频率似乎会永无止境地增加下去。 然而,没有更多的免费午餐了,确实如此。
在我看来,并发正在成为每个软件开发人员工作中的重要组成部分,而与本书类似的其他介绍并发的书籍也将变得更为重要和有用。仅仅2年后,这种影响开始从操作系统通过各种库延伸到了应用程序本身。
当时,我刚好完成了一个历时6个月的小型项目原型,叫做“并行的语言级集成查询”(Parallel Language Integrated Query,PLINQ), 我在PLINQ项目中深入分析了并发的复杂性以及如何在实际中使用并行。我将PLINQ作为一种工具用于找出Windows在并发方面的不足之处。这是我日常工作之外的研究,我在Microsoft的主要工作是研究“软件事务内存”(Software Transactional Memory,STM),这项技术已经成为业界的一个流行术语。无需多言,我在并发问题上已经投入了大量的研究工作。那么,能否通过编写一本介绍并发的书来使研究工作更进一步?
随着我在这些项目上不断工作,以及最终将PLINQ发展为.NET框架的并行扩展(Parallel Extension),令我感到吃惊的是,介绍Windows并发的书籍少之又少。我还记得自己一次又一次地对一些复杂且神秘的并发信息感到困惑,然后匆匆记录下来并把它们包含在本书中。我当时多么希望有人曾经在我之前记录了这些信息,这样我就不需要为收集它们费那么多周折: 例如,在走廊上和同事一起讨论,在夜晚琢磨Windows和CLR的源代码,以及反复阅读Microsoft员工撰写的博客。关于并发主题的最好书籍还要追溯到20世纪90年代早期,而且,尽管这些书中的内容仍然是有价值的,但却过分关注于各种并发机制,而对于如何设计并行程序结构,实现并行算法,应对并发带来的各种危害,以及介绍一些重要概念则显得有所不足。其他的一些文献则是以学术界和理论研究人员为目标,而不是以开发应用程序、系统和库的工程师们为目标。
于是,我决定以自己喜欢的方式来写一本书,采用一种有用的方式来描述我所收集的各种信息。虽然这本书花了我长达两年半的时间才完成,但由于在并发编程方面的技术发展较慢,因此本书介绍的各个主题仍然是非常适用的。我希望本书不仅实用,而且还能包含更多深入的技术信息。对于任何Windows或者.NET开发人员,如果他们相信并发将成为所有软件的一个重要需求,那么都会发现本书是非常有用的。
我从写作本书中获得了许多乐趣,并且我希望各位读者也同样在阅读中获得乐趣。
本书的结构
我将本书内容分为四个主要的部分。第一部分“概念”,从高层视角来介绍并发,对于每个主题并没有进行深入的分析。第二部分“机制”,重点介绍了一些基础的功能、内部工作机制以及各种API等。第三部分“技术”,介绍了一些常见的编程模式、最优方法、算法,以及在编写并发软件时需要使用的各种数据结构。第四部分“系统”,介绍了一些在系统架构和流程中经常出现的问题。这4个部分形成了一个系列。最开始是“概念”部分,这部分内容将为读者理解并发打下一个基础。如果没有透彻地理解“机制”部分的内容,那么在理解“技术”部分的内容时将遇到困难,同样,如果没有很好地理解其他部分,那么要构建实际的“系统”也是不现实的。本书的末尾还包括了两个附录。
代码要求
要运行本书中的代码,需要下载一些免费软件:
Microsoft Windows SDK。这包括Microsoft C++编译器以及相关的头文件和库。在编写本书时,最新的版本是Windows Vista和Server 2008 SDK。
Microsoft .NET框架SDK。这包括Microsoft C#和Visual Basic编译器,以及相关的框架库。在编写本书时,最新的版本是.NET框架3.5 SDK。
二者都可以在MSDN中找到,网址是http://msdn.microsoft.com。
此外,我还强烈建议你使用Visual Studio。虽然并非一定需要使用它(事实上,本书的大部分代码都是在emacs中编写的),但Visual Studio提供了更完备的开发环境和调试环境。 可以免费下载Visual Studio 2008精简版,不过它缺少了许多有用的功能,例如性能分析。
最后,还可以使用Windows调试工具集(Debugging Tools for Windows),尤其是在没有Visual Studio的情况下,这个软件包包含了调试工具WINDBG,可以从http://www.microsoft.com免费下载。同样,还可以从http://technet.microsoft.com/sysinternals下载Sysinternals工具,这个工具在分析Windows操作系统时将非常有用。
本书还有一个专门的网站:
http://www.bluebytesoftware.com/books
Joe Duffy
2008年6年
joe@bluebytesoftware.com
在我看来,并发正在成为每个软件开发人员工作中的重要组成部分,而与本书类似的其他介绍并发的书籍也将变得更为重要和有用。仅仅2年后,这种影响开始从操作系统通过各种库延伸到了应用程序本身。
当时,我刚好完成了一个历时6个月的小型项目原型,叫做“并行的语言级集成查询”(Parallel Language Integrated Query,PLINQ), 我在PLINQ项目中深入分析了并发的复杂性以及如何在实际中使用并行。我将PLINQ作为一种工具用于找出Windows在并发方面的不足之处。这是我日常工作之外的研究,我在Microsoft的主要工作是研究“软件事务内存”(Software Transactional Memory,STM),这项技术已经成为业界的一个流行术语。无需多言,我在并发问题上已经投入了大量的研究工作。那么,能否通过编写一本介绍并发的书来使研究工作更进一步?
随着我在这些项目上不断工作,以及最终将PLINQ发展为.NET框架的并行扩展(Parallel Extension),令我感到吃惊的是,介绍Windows并发的书籍少之又少。我还记得自己一次又一次地对一些复杂且神秘的并发信息感到困惑,然后匆匆记录下来并把它们包含在本书中。我当时多么希望有人曾经在我之前记录了这些信息,这样我就不需要为收集它们费那么多周折: 例如,在走廊上和同事一起讨论,在夜晚琢磨Windows和CLR的源代码,以及反复阅读Microsoft员工撰写的博客。关于并发主题的最好书籍还要追溯到20世纪90年代早期,而且,尽管这些书中的内容仍然是有价值的,但却过分关注于各种并发机制,而对于如何设计并行程序结构,实现并行算法,应对并发带来的各种危害,以及介绍一些重要概念则显得有所不足。其他的一些文献则是以学术界和理论研究人员为目标,而不是以开发应用程序、系统和库的工程师们为目标。
于是,我决定以自己喜欢的方式来写一本书,采用一种有用的方式来描述我所收集的各种信息。虽然这本书花了我长达两年半的时间才完成,但由于在并发编程方面的技术发展较慢,因此本书介绍的各个主题仍然是非常适用的。我希望本书不仅实用,而且还能包含更多深入的技术信息。对于任何Windows或者.NET开发人员,如果他们相信并发将成为所有软件的一个重要需求,那么都会发现本书是非常有用的。
我从写作本书中获得了许多乐趣,并且我希望各位读者也同样在阅读中获得乐趣。
本书的结构
我将本书内容分为四个主要的部分。第一部分“概念”,从高层视角来介绍并发,对于每个主题并没有进行深入的分析。第二部分“机制”,重点介绍了一些基础的功能、内部工作机制以及各种API等。第三部分“技术”,介绍了一些常见的编程模式、最优方法、算法,以及在编写并发软件时需要使用的各种数据结构。第四部分“系统”,介绍了一些在系统架构和流程中经常出现的问题。这4个部分形成了一个系列。最开始是“概念”部分,这部分内容将为读者理解并发打下一个基础。如果没有透彻地理解“机制”部分的内容,那么在理解“技术”部分的内容时将遇到困难,同样,如果没有很好地理解其他部分,那么要构建实际的“系统”也是不现实的。本书的末尾还包括了两个附录。
代码要求
要运行本书中的代码,需要下载一些免费软件:
Microsoft Windows SDK。这包括Microsoft C++编译器以及相关的头文件和库。在编写本书时,最新的版本是Windows Vista和Server 2008 SDK。
Microsoft .NET框架SDK。这包括Microsoft C#和Visual Basic编译器,以及相关的框架库。在编写本书时,最新的版本是.NET框架3.5 SDK。
二者都可以在MSDN中找到,网址是http://msdn.microsoft.com。
此外,我还强烈建议你使用Visual Studio。虽然并非一定需要使用它(事实上,本书的大部分代码都是在emacs中编写的),但Visual Studio提供了更完备的开发环境和调试环境。 可以免费下载Visual Studio 2008精简版,不过它缺少了许多有用的功能,例如性能分析。
最后,还可以使用Windows调试工具集(Debugging Tools for Windows),尤其是在没有Visual Studio的情况下,这个软件包包含了调试工具WINDBG,可以从http://www.microsoft.com免费下载。同样,还可以从http://technet.microsoft.com/sysinternals下载Sysinternals工具,这个工具在分析Windows操作系统时将非常有用。
本书还有一个专门的网站:
http://www.bluebytesoftware.com/books
Joe Duffy
2008年6年
joe@bluebytesoftware.com
序言回到顶部↑
计算机业界再次走到了一个十字路口。以多核处理器为代表的硬件并发性的出现,以及不断增长的软件复杂性,都要求业界的人们重新思考现代计算机的架构以及软件开发模式。
在过去几十年中,计算机的性能和容量都发生了指数级的增长,但底层的计算模型却没有根本性的变革。硬件的发展遵循摩尔定律,时钟频率不断增加,而软件在发展过程中也充分利用了这种不断增长的硬件性能,并且通常要领先于硬件的发展。硬件与软件的这种共生关系一直延续到最近。 尽管摩尔定律仍然有效,但时钟频率却无法再继续线性地增长。
加州大学伯克利分校的David Patterson教授通过一个简单的等式总结了在硬件上发生这种变化的原因:
能耗障碍+内存障碍+ILP障碍=限制串行性能的障碍
CPU的能耗随着时钟频率的增加而增加,因此时钟频率存在着一个上限。目前,CPU的散热能力已经达到了一个物理临界点。因此,如果没有强大的(以及昂贵的)冷却功能(或者在材料技术上取得突破),那么将不可能在时钟速度上获得重大提升。这就是等式中的“能耗障碍”。内存性能的提升远远落后于处理器性能的提升,这使得在访问主存时需要的CPU时钟周期数量将持续增加。这就是等式中的“内存障碍”。硬件工程师们已经采取了猜测执行指令(Speculatively Executing Instruction)技术来提升串行软件的性能,这种技术也称为指令级并行(Instruction Level Parallelism,ILP)。ILP对程序性能的提升程度是很难确定的,并且ILP的复杂性还将提高能耗。因此,ILP带来的提升同样存在着局限性,这就是等式中的“ILP障碍”。
因此,我们目前到达了一个转折点。软件系统必须通过进一步的演变来更好地支持多核架构,而这种演变是需要时间的。为了充分利用提升的计算机硬件性能,并继续保持“只需编写一次,就可以在新硬件上运行得更快”这种模式,开发人员必须学习如何构造并发程序。 与并发的广泛使用相伴随的,还有异步性和松耦合、客户端并行以及服务器端云计算等,这些技术使得“软件+服务”的模式成为可能。
Windows和.NET框架平台对并发提供了丰富的支持。这种支持最初在Windows NT对多核处理器的支持中引入的,并且在过去十年中得到了不断的发展。Windows在线程调度性能、同步API以及内存层次结构等方面的持续改进,尤其是在Windows Vista中增加的一些新功能,使Windows操作系统能够最大限度地发挥硬件并发的优势。本书对所有这些领域都进行了介绍。当你在应用程序中开始大规模地使用多线程方式时,简单明了的架构设计将变得非常重要,因为这种架构可以有效地降低软件的复杂性并提高代码的可维护性。这就要求开发人员不仅要理解平台上的各项功能,而且还要关注新近出现的各种最优方法。 本书中,Joe不仅详尽地介绍各种并发机制,同时还提出了大量的最优方法。
毫无疑问,多核提升了现有应用程序的性能。不仅如此,它同样使我们可以从一个完全不同的角度来重新思考计算机为人们提供的各种功能。计算能力的不断增加,不仅将提升应用程序的质量从而使其变得更加有用,而且还可以实现一些在过去无法做到的事情。在这种演变过程中,软件将变得更加个性化和人性化。好好享受本书吧,它为你在Windows平台上迈出编写并发软件的第一步提供了完备的信息。
Craig Mundie,首席研究与战略官,就职于Microsoft公司,2008年6月
在过去几十年中,计算机的性能和容量都发生了指数级的增长,但底层的计算模型却没有根本性的变革。硬件的发展遵循摩尔定律,时钟频率不断增加,而软件在发展过程中也充分利用了这种不断增长的硬件性能,并且通常要领先于硬件的发展。硬件与软件的这种共生关系一直延续到最近。 尽管摩尔定律仍然有效,但时钟频率却无法再继续线性地增长。
加州大学伯克利分校的David Patterson教授通过一个简单的等式总结了在硬件上发生这种变化的原因:
能耗障碍+内存障碍+ILP障碍=限制串行性能的障碍
CPU的能耗随着时钟频率的增加而增加,因此时钟频率存在着一个上限。目前,CPU的散热能力已经达到了一个物理临界点。因此,如果没有强大的(以及昂贵的)冷却功能(或者在材料技术上取得突破),那么将不可能在时钟速度上获得重大提升。这就是等式中的“能耗障碍”。内存性能的提升远远落后于处理器性能的提升,这使得在访问主存时需要的CPU时钟周期数量将持续增加。这就是等式中的“内存障碍”。硬件工程师们已经采取了猜测执行指令(Speculatively Executing Instruction)技术来提升串行软件的性能,这种技术也称为指令级并行(Instruction Level Parallelism,ILP)。ILP对程序性能的提升程度是很难确定的,并且ILP的复杂性还将提高能耗。因此,ILP带来的提升同样存在着局限性,这就是等式中的“ILP障碍”。
因此,我们目前到达了一个转折点。软件系统必须通过进一步的演变来更好地支持多核架构,而这种演变是需要时间的。为了充分利用提升的计算机硬件性能,并继续保持“只需编写一次,就可以在新硬件上运行得更快”这种模式,开发人员必须学习如何构造并发程序。 与并发的广泛使用相伴随的,还有异步性和松耦合、客户端并行以及服务器端云计算等,这些技术使得“软件+服务”的模式成为可能。
Windows和.NET框架平台对并发提供了丰富的支持。这种支持最初在Windows NT对多核处理器的支持中引入的,并且在过去十年中得到了不断的发展。Windows在线程调度性能、同步API以及内存层次结构等方面的持续改进,尤其是在Windows Vista中增加的一些新功能,使Windows操作系统能够最大限度地发挥硬件并发的优势。本书对所有这些领域都进行了介绍。当你在应用程序中开始大规模地使用多线程方式时,简单明了的架构设计将变得非常重要,因为这种架构可以有效地降低软件的复杂性并提高代码的可维护性。这就要求开发人员不仅要理解平台上的各项功能,而且还要关注新近出现的各种最优方法。 本书中,Joe不仅详尽地介绍各种并发机制,同时还提出了大量的最优方法。
毫无疑问,多核提升了现有应用程序的性能。不仅如此,它同样使我们可以从一个完全不同的角度来重新思考计算机为人们提供的各种功能。计算能力的不断增加,不仅将提升应用程序的质量从而使其变得更加有用,而且还可以实现一些在过去无法做到的事情。在这种演变过程中,软件将变得更加个性化和人性化。好好享受本书吧,它为你在Windows平台上迈出编写并发软件的第一步提供了完备的信息。
Craig Mundie,首席研究与战略官,就职于Microsoft公司,2008年6月
媒体评论回到顶部↑
深入揭示Windows并发编程理论及实现
微软首席研究与战略官Craig Mundie作序推荐
微软首席研究与战略官Craig Mundie作序推荐








点击看大图






加载中...

