這是一本論述多處理器編程理論與實踐的綜合巨著!
看這本書的讀者應具備一定的離散數(shù)學基礎知識,能夠理解“大O”符號的含義,以及它在NP完全問題中所起的作用;熟悉計算機系統(tǒng)的基本組成部件,如處理器、線程、高速緩存等;為了能夠理解書中的實例,還需要具備初步的Java知識(在使用這些高級程序設計語言之前,闡述了語言的相關功能特征)。書中提供兩處附錄以供讀者參考:附錄A包含程序設計語言的相關知識,附錄B給出了多處理器體系結(jié)構(gòu)的相關內(nèi)容。
圖書的前三分之一,講述并發(fā)程序設計原理,介紹并發(fā)程序設計人員的一般編程思路。就像掌握汽車駕駛、烹飪和品嘗魚子醬一樣,并發(fā)思維需要培養(yǎng),需要適當?shù)呐Σ拍軐W好。對于那些希望立刻動手編程的讀者可以跳過這一部分的大多數(shù)內(nèi)容,但需要閱讀第2章及第3章的內(nèi)容,因為這兩章包含了理解本書其他部分必不可少的基本知識。首先,討論了經(jīng)典的互斥問題(第2章),提到了諸如公正和死鎖這樣的基本概念,這對于理解并發(fā)程序設計的難點尤為重要。隨后,結(jié)合并發(fā)執(zhí)行和并發(fā)設計中可能出現(xiàn)的情形和開發(fā)環(huán)境,提出了并發(fā)程序正確性的定義(第3章);研究了對并發(fā)計算至關重要的共享存儲器的性質(zhì)(第4章);介紹了幾種為獲得高并發(fā)性數(shù)據(jù)結(jié)構(gòu)而使用的同步原語(第5、6章)。
對于每一位渴望真正掌握多處理器編程技術的程序設計人員來說,花上一定的時間去解決本書第一部分所提及的問題是很必要的。雖然這些問題都是理想化的,但它們?yōu)榫帉懜咝У亩嗵幚砥鞒绦蛱峁┝朔浅S幸娴木幊趟枷搿S葹橹匾氖?,通過問題解決中提取的思維方式,能夠避免出現(xiàn)那些初次編寫并發(fā)程序的設計人員普遍易犯的錯誤。
本書接下來的三分之一講述并發(fā)程序設計的實踐部分,每章都有一個次主題,闡明一種特定的程序設計模式或者一種算法技巧。第7章從系統(tǒng)級和語言級兩個不同的抽象層面,討論了競爭及自旋轉(zhuǎn)鎖的概念,強調(diào)了底層系統(tǒng)結(jié)構(gòu)的重要性,指出對于自旋轉(zhuǎn)鎖性能的理解必須建立在對多處理器層次存儲結(jié)構(gòu)充分理解的基礎上。第8章討論了等待及監(jiān)控鎖的概念,這是一個常用(特別是在Java中)的同步用語。第16章討論了工作竊取及并行性問題,第17章則介紹了設計并發(fā)應用程序時經(jīng)常使用的路障技術。
本書其他章節(jié)主要講述并發(fā)數(shù)據(jù)結(jié)構(gòu)。它們均以第9章為基礎,因此建議讀者在閱讀其他章節(jié)前先閱讀第9章的內(nèi)容。第9章使用鏈表結(jié)構(gòu)說明了不同的同步模式,包括粗粒度鎖、細粒度鎖及無鎖結(jié)構(gòu)。第10章使用先進先出隊列說明了使用同步原語時可能出現(xiàn)的ABA同步問題,第11章使用堆棧描述了一種重要的同步模式——消除;如何利用算法固有的并行性則運用哈希表來描述(第13章),高性能的并行搜索技術借助跳表來闡述(第14章),而如何通過降低正確性標準來提高性能則通過優(yōu)先隊列進行了闡述(第15章)。
最后,在第18章介紹了目前并發(fā)問題中新出現(xiàn)的事務方法,這種方法在今后的研究中會越來越重要。
并發(fā)的重要性并沒有被人們廣泛認可,這里有一段引用1989年紐約時報關于IBM PC中新型操作系統(tǒng)文章的評論:
真正的并發(fā)(當你喚醒并使用另一個程序時原來的程序仍繼續(xù)運行)是非常令人振奮的,但對普通的使用者來說用處很小。您能有幾個程序在執(zhí)行時需要花費數(shù)秒甚至更多的時間呢?
閱讀本書,一切由您選擇。