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