現(xiàn)在硬件設(shè)備越來越強(qiáng)大,單單一個線程真的很難有效的利用。而且云計算的流行,更有效地利用云資源成為大勢所趨。并行計算帶來的對傳統(tǒng)編程模式革命,使更有效的挖掘機(jī)器資源成為可能。下邊就對并行計算做一些介紹:
1. 什么是并行計算?
并行計算的基本思想就是把復(fù)雜的工作進(jìn)行分解, 分解成可以同時進(jìn)行的多個子任務(wù), 來縮短任務(wù)的完成時間,提升系統(tǒng)的吞吐性能。 就如下圖所示, A, B, C 三個子任務(wù)同時進(jìn)行,當(dāng)然要比三個子任務(wù)串行要快的多了。
2.為什么要選擇并行計算?
·提升系統(tǒng)的吞吐量
處理單個任務(wù)的速度快了,單位時間相應(yīng)的請求就多了,當(dāng)然吞吐量也就就上去了。
·提升系統(tǒng)的相應(yīng)速度
系統(tǒng)處理快了, 就不會有太多的堵塞線程, 這樣系統(tǒng)就有富余的資源來響應(yīng)新的請求。
·更大的挖掘出單個機(jī)器的性能
單線程獨占模式下的程序需要等待一個任務(wù)完成, 才會啟動另一個任務(wù),如果一個任務(wù)在進(jìn)行大量的I\O操作,其他任務(wù)也沒有辦法開始,只能等待。而這時CPU可閑的發(fā)慌了,對高主頻的CPU閑著不用那 可以極大地犯罪。如果你要把你的服務(wù)架到云上,空閑著系統(tǒng)CPU, 那就不單單是犯罪,那可還是在浪費Money呀。所以多線程并發(fā)就表現(xiàn)出了很好的資源利用能力, 一個線程在I\O操作,另一個就可 以利用CPU資源。
3.并行子任務(wù)的載體
并行任務(wù)的載體可分為兩類:
·線程: 同時啟動啟動多個線程, 每個線程負(fù)責(zé)執(zhí)行一個或多個任務(wù), 通過線程并行來達(dá)到多個子任務(wù)的并行處理。當(dāng)選擇這種方式進(jìn)行并發(fā)處理時,并行程序的處理能力非常依賴機(jī)器的性能, 尤其是CPU 核的數(shù)量。
·進(jìn)程: 對于多進(jìn)程并行,現(xiàn)在應(yīng)用最多的就是基于網(wǎng)絡(luò)的分布式系統(tǒng)
4.是不是只要并行, 就可以提高系統(tǒng)性能
·提升性能的情況: 合理的把復(fù)雜任務(wù)進(jìn)行拆解, 需要考慮拆解后的并行子任務(wù)的個數(shù)和機(jī)器處理核的個數(shù)關(guān)系, 以及每個子任務(wù)處理的時間, 對之上的數(shù)據(jù)進(jìn)行平衡處理。提升比較明顯的是那種處理的數(shù)據(jù)量很大,或者要執(zhí)行的數(shù)據(jù)處理任務(wù)繁重,并且這些任務(wù)本身就可以分解為互不相關(guān)的子任務(wù)時,使用并行計算是合適的。
·降低性能的情況: 如果在一個單核的機(jī)器上跑多線程并行的程序,性能的提升是非常有限的,有時可能會降低性能。因為多個線程在爭搶一個CPU資源, 并且線程的開啟,初始化以及銷毀都有不小的性能消耗。但從最近幾年的計算機(jī)硬件發(fā)展來看, 已經(jīng)開始了多核趨勢, 現(xiàn)在隨便買個機(jī)器都是2核4核, 而主頻的提升已經(jīng)非常緩慢(硬件發(fā)展限制)。 所以最近幾年并行計算火了起來, 并行可以最大限度的應(yīng)用計算機(jī)資源。
5.并行的問題
·開發(fā)復(fù)雜性增高:這是一定的了,需要考慮子任務(wù)的協(xié)調(diào),以及彼此間的通信,而且還要基于機(jī)器性能考慮開線程個數(shù)
·死鎖:有并行,就必然存在死鎖的可能
·利用代碼覆蓋很難測試出系統(tǒng)隱藏的bug
·調(diào)試?yán)щy:盡管VS2010增加了對多線程調(diào)試的支持,但調(diào)試還是有一定的難度,常常會看的眼花繚亂。
6.NET 4.0 Parallel Framework
我們知道微軟在.NET 4.0里加入了對并行計算的支持, 引入了一些類庫可以讓開發(fā)人員更快更穩(wěn)定的編寫出并行代碼。 下面簡單介紹一下.NET 4.0 里對并行計算的支持:
·TPL: 以前開發(fā)并行程序, 開發(fā)人員通常會直接操作Thread, 并且利用lock機(jī)制和信號量機(jī)制。這種開發(fā)方式使程序變得復(fù)雜難懂。 TPL 是把開發(fā)人員從對Thread的關(guān)注提升到Task級別, 這樣開發(fā)人員不需要過分關(guān)注線程的創(chuàng)建以及同步問題。也不需要手動進(jìn)行多線程之間的調(diào)度, 以及線程數(shù)量等的管理, TPL會把一切在底層完成
·Scheduler: 任務(wù)調(diào)度器, 負(fù)責(zé)任務(wù)的調(diào)度\啟動\停止\暫停, 它是parallel framework 的核心
·Thread Pool: 4.0對threadPool作了很大的改進(jìn),并且和任務(wù)調(diào)度器進(jìn)行了集成
·PLINQ: 讓查詢操作可以并行執(zhí)行, 目前版本只支持linq to object
·Parallel.For\Parallel.Foreach: 可以非常簡單的把for 或foreach 子句里的代碼并行起來
總之,多線程并行計算絕對是有美好的前景的!