多处理器编程的艺术
The Art of Multiprocessor Programming
(美)Maurice Herilihy 布朗大学
(以)Nir Shavit 著 特拉维夫大学
金海 胡侃 译
前 言
本书可以作为高年级本科生的教材,也可以作为相关技术人员的参考书。
读者应具备一定的离散数学基础知识,能够理解“大-O”符号的含义,以及它在NP完全问题中所起的作用;熟悉计算机系统的基本组成部件,如处理器、线程、高速缓存等;为了能够理解书中的实例,还需要具备初步的Java知识。(在使用这些高级程序设计语言之前,本书阐述了语言的相关功能特征)。书中提供两处附录以供读者参考:附录A包含程序设计语言的相关知识,附录B给出了多处理器系统结构的相关内容。
本书前三分之一涵盖并发程序设计的基本原理,阐述并发程序设计的编程思想。就像掌握汽车驾驶、烹饪食物和品尝鱼子酱一样,并发思维也需要培养,需要适当的努力才能学好。希望立刻动手编程的读者可以跳过这部分的大多数内容,但仍需阅读第2章及第3章的内容,这两章包含了理解本书其他部分所必不可少的基本知识。
在原理部分中,首先讨论了经典的互斥问题(第2章),包括诸如公正性和死锁这样的基本概念,这对于理解并发程序设计的难点尤为重要。然后,结合并发执行和并发设计中可能出现的各种情形和开发环境,给出了并发程序正确性的定义(第3章);研究了对并发计算至关重要的共享存储器的性质(第4章);介绍了几种为实现高并发性数据结构而使用的同步原语(第5、6章)。
对于每一位渴望真正掌握多处理器编程艺术的程序设计人员来说,花上一定的时间去解决本书第一部分所提及的问题是很有必要的。虽然这些问题都是理想化的,但它们为编写高效的多处理器程序提供了非常有益的编程思想。尤为重要的是,通过在问题解决中获取的思维方式,能够避免出现那些初次编写并发程序的设计人员普遍易犯的错误。
接下来的三分之二讲述并发程序设计的具体实践。每章都有一个次主题,阐明一种特定的程序设计模式或者一种算法技巧。第7章从系统和语言这两个不同的抽象层面,讨论了争用及自转锁的概念,强调了底层系统结构的重要性,指出对于自旋锁性能的理解必须建立在对多处理器层次存储结构充分理解的基础上。第8章涉及等待及监视锁的概念,这是一种常用(特别是在Java中)的同步用语。第16章包括并行性及工作窃取问题,第17章则介绍了路障技术,这种技术往往在具有并发结构的应用中得以广泛地使用。
其他章节讲述各种类型的并发数据结构。它们均以第9章的概念为基础,因此建议读者在阅读其他章节之前首先阅读第9章的内容。该章节采用链表结构来阐明各种类型的同步模式,包括粗粒度锁、细粒度锁及无锁结构。第10章则借助于FIFO队列说明在使用同步原语时可能出现的ABA问题,第11章通过栈描述了一种重要的同步模式——消除,第13章通过哈希映射阐述如何利用自然并行性进行算法设计。高效率的并行查找技术则借助于跳表来阐述(第14章),而如何通过降低正确性标准以获得更高的性能则通过优先队列进行了阐述(第15章)。
最后,在第18章介绍了在并发问题的研究中新出现的事务方法,可以确信这种方法在不远的将来会变得越来越重要。
并发性的重要性还没有得到人们的广泛认可。在此,引用《纽约时报》1989年关于IBM PC中新型操作系统的一段评论:
真正的并发(当你唤醒并使用另一个程序时原来的程序仍继续运行)是非常令人振奋的,但对于普通使用者来说用处却很小。您能有几个程序在执行时需要花费数秒甚至更多的时间呢?
阅读本书,一切任由您选择。