2011年6月18日,國內著名的電子商務網站——京東商城(http://www.360buy.com/)在周年慶典之際舉辦大規(guī)模促銷活動,在搶購狂潮席卷而來時,京東的服務器無法及時處理數(shù)量龐大的并發(fā)訂單請求而癱瘓,結果京東CEO劉強東先生的新浪微博幾乎被消費者潮水般的抱怨所淹沒……。這個例子充分說明當今社會對高性能軟件系統(tǒng)的需求日益突顯,而本書所介紹的并行計算技術就可以應用于高性能的軟件系統(tǒng)開發(fā)。
再說另外一件事。2011年3月,蘋果公司發(fā)布iPad2,配備了A5 1.0GHz雙核處理器,這標志著平板電腦追隨臺式機和筆記本電腦一同進入“多核時代”。同樣在2011年,擁有雙核處理器的Android智能手機取得了驕人的銷售業(yè)績,表現(xiàn)相當搶眼……
處理器的“多核化”趨勢已經勢不可擋,這意味著硬件的計算能力在持續(xù)增強;很明顯,如果軟件不能充分應用這些新增的計算能力,計算機硬件技術進步所帶來的好處就無法顯現(xiàn)出來。
所有這一切都告訴我們:并行計算的時代已經來臨。
并行計算并非什么新鮮事物,歷史上人們在為擁有多個處理器的計算機系統(tǒng)開發(fā)軟件時,就已經深入研究了并行計算中的許多問題,并提出了相應的解決方案。
概括起來,可將并行計算技術領域大致分為以下三個比較活躍的子領域:
(1) 并行計算的理論研究,比如針對某類問題設計新的更高效的并行算法。
(2) 構建并行計算基礎架構,比如設計新的易于開發(fā)并行程序的程序設計語言、開發(fā)各種并行開發(fā)工具、構造并行組件庫等等。
(3) 基于并行計算基礎架構構建真實軟件系統(tǒng)。
本書介紹的.NET 4“并行擴展(Parallel Extensions)”,就屬于上述第2點所涉及的技術領域。
微軟于2010年發(fā)布的.NET 4包容眾多的技術亮點,本書作者為何單單選取.NET 4并行擴展來介紹?
筆者本人也曾仔細研究過.NET 4并行擴展這一技術領域,得到的結論與作者相同——.NET 4并行擴展有其獨到之處,并且具有廣泛的應用前景。
得到上述結論的依據(jù)是什么?這需要介紹一下并行計算軟件系統(tǒng)開發(fā)技術的發(fā)展現(xiàn)狀。
當前的并行計算軟件系統(tǒng),多使用操作系統(tǒng)所直接提供的線程來實現(xiàn)。開發(fā)人員編寫代碼“直接操縱”線程完成并行計算軟件系統(tǒng)的開發(fā)工作。更詳細一點說,在開發(fā)并行計算軟件系統(tǒng)時,開發(fā)人員要依據(jù)具體應用場景設計或選擇一種并行算法,將整個數(shù)據(jù)處理工作進行切分,然后創(chuàng)建并啟動合適數(shù)目的線程,并為每個線程分配特定的工作任務。由于一個算法通常會同時存在串行/并行的部分,因此要保證各工作線程之間滿足特定的執(zhí)行順序需求。除此之外,開發(fā)人員還需要確保各線程都能安全地存取共享資源,并妥善處理系統(tǒng)運行期間可能出現(xiàn)的各種異常,……,到了最后,在所有功能開發(fā)完畢并通過測試之后,還需要依據(jù)系統(tǒng)運行的真實軟硬件環(huán)境進行性能調優(yōu)。
與單線程程序相比,多線程程序的開發(fā)需要考慮的事項更多,另外,由于同時存在多個同時運行的線程,多線程程序的調試也變得復雜起來。有那么一句雖然不太精確卻十分形象的評論:“多線程程序的開發(fā)難度是完成同樣功能的單線程程序的10倍?!?/p>
必須設法提升并行程序的開發(fā)效率。為此,Java平臺和.NET平臺都針對多線程開發(fā)提供了功能完備的類庫,這使得多線程程序的開發(fā)難度降低了不少,但仍然相當麻煩。
在大量的軟件開發(fā)實踐中,人們發(fā)現(xiàn):在更高的抽象層次上開發(fā)是提升開發(fā)效率的有效途徑。.NET 4的并行擴展(Parallel Extensions)走的正是這條路。
.NET 4并行擴展的核心是“任務并行庫(TPL:Task Parallel Library)”,它將并行程序的“構造單元”從“線程(Thread)”提升到“任務(Task)”,將任務分派給線程的工作由TPL負責完成,有效降低了.NET平臺上并行計算程序的開發(fā)難度,提升了開發(fā)效率。
本書主要介紹基于.NET 4中的并行擴展開發(fā)高性能軟件系統(tǒng)所需的知識與技能,從并行計算理論到實際代碼再到輔助開發(fā)工具,娓娓道來,內容緊貼實際,詳盡實用。
以下是本人的閱讀建議。
不熟悉TPL的讀者需要通讀本書的第2章~第6章,這部分內容系統(tǒng)介紹了TPL的基本使用方法,為實際開發(fā)所必需。另外,在閱讀之前,不妨先看看附錄A以“統(tǒng)觀全局”。
以下是本書各章節(jié)中的一些值得重點關注的亮點:
第1章中有關并行計算的經驗之談很有價值,需要反復品味。
第7章對Visual Studio 2010 并行程序調試器進行了詳盡介紹,各種技巧一覽無余,是本人所看過的相關書中介紹得最清楚的。
第8章對線程池的介紹非常重要,它是理解TPL工作原理的關鍵。
第10章有關并行測試和調優(yōu)的介紹很精彩。
第11章介紹了如何集成Intel所提供的非托管函數(shù)庫提升軟件系統(tǒng)性能,很有參考價值。
附錄B展示了UML并發(fā)模型,從事“面向對象系統(tǒng)分析與設計(OOAD:Object Orient Analysis & Design)”的系統(tǒng)架構師們可能會對它感興趣。
附錄C介紹了微軟所提供的一組TPL附加示例,建議讀者好好地閱讀一下這些示例代碼,從中可以學到比較規(guī)范的并行編程技巧,很有參考價值。
下面向讀者介紹一下.NET 4并行擴展的主要應用領域。
作為.NET 基類庫的有機組成部分,.NET 4并行擴展可以用于傳統(tǒng)的桌面和服務器端應用程序。
需要特別指出的是:在微軟云計算平臺(Azure)中,同樣可以使用.NET 4并行擴展以充分利用“云”所提供的強大計算和數(shù)據(jù)處理能力,而且本人已經在互聯(lián)網上看到了先例,使用TPL開發(fā)能并行執(zhí)行SQL命令和啟動多個并行數(shù)據(jù)處理任務的組件庫。
.NET 4并行擴展的應用領域同樣延伸到了Windows Phone和XBox,比如在Codeplex網站上就有一個PortableTPL項目(http://portabletpl.codeplex.com/),使用它就可以在Windows Phone和XBox的游戲及應用開發(fā)中使用TPL。
閱讀完本書之后,我相信讀者也會同意我們的觀點,.NET 4并行擴展有著廣泛的應用前景,是一項值得認真學習的技術,而本書能為讀者掌握這一技術提供切實的幫助。
最后感謝兩位譯者的辛勤工作,將這本有很大實用價值的書奉獻給中國的讀者。在此也希望所有讀者都能讀有所獲。
金旭亮
2011年11月作于北京理工大學