一、什么是并行計(jì)算
并行計(jì)算或稱平行計(jì)算是相對于串行計(jì)算來說的。所謂并行計(jì)算可分為時間上的并行和空間上的并行。 時間上的并行就是指流水線技術(shù),而空間上的并行則是指用多個處理器并發(fā)的執(zhí)行計(jì)算。
并行計(jì)算(Parallel Computing)是指同時使用多種計(jì)算資源解決計(jì)算問題的過程。為執(zhí)行并行計(jì)算,計(jì)算資源應(yīng)包括一臺配有多處理機(jī)(并行處理)的計(jì)算機(jī)、一個與網(wǎng)絡(luò)相連的計(jì)算機(jī)專有編號,或者兩者結(jié)合使用。并行計(jì)算的主要目的是快速解決大型且復(fù)雜的計(jì)算問題。
并行計(jì)算具備3個基本條件:
?。?)并行計(jì)算機(jī)。并行計(jì)算機(jī)至少包含兩臺或兩臺以上處理機(jī),這此處理機(jī)通過互聯(lián)網(wǎng)絡(luò)相互連接,相互通信。
?。?)應(yīng)用問題必須具有并行度。也就是說,應(yīng)用可以分解為多個子任務(wù),這些子任務(wù)可以并行地執(zhí)行。將一個應(yīng)用分解為多個子任務(wù)的過程,稱為并行算法的設(shè)計(jì)。
(3)并行編程。在并行計(jì)算機(jī)提供的并行編程環(huán)境上,具體實(shí)現(xiàn)并行算法,編制并行程序并運(yùn)行該程序,從而達(dá)到并行求解應(yīng)用問題的目的。
并行計(jì)算特征:
(1)將工作分離成離散部分,有助于同時解決;
?。?)隨時并及時地執(zhí)行多個程序指令;
?。?)多計(jì)算資源下解決問題的耗時要少于單個計(jì)算資源下的耗時。
二、什么是分布式計(jì)算
所謂分布式計(jì)算就是在兩個或多個軟件互相共享信息,這些軟件既可以在同一臺計(jì)算機(jī)上運(yùn)行,也可以在通過網(wǎng)絡(luò)連接起來的多臺計(jì)算機(jī)上運(yùn)行。
分布式計(jì)算優(yōu)點(diǎn):
1、稀有資源可以共享。
2、通過分布式計(jì)算可以在多臺計(jì)算機(jī)上平衡計(jì)算負(fù)載。
3、可以把程序放在最適合運(yùn)行它的計(jì)算機(jī)上。其中,共享稀有資源和平衡負(fù)載是計(jì)算機(jī)分布式計(jì)算的核心思想之一。
分布式計(jì)算的基本原理:
我們先看一下分布式的最簡模型:
在傳統(tǒng)的方法中,調(diào)用一個對象的函數(shù)很簡單:創(chuàng)建這個對象,然后調(diào)用它的函數(shù)就行了。而在分布式的環(huán)境中,對象在另外一個進(jìn)程中,完全在不同的地址空間里,要調(diào)用它的函數(shù)可能有點(diǎn)困難了。
看看傳統(tǒng)的C/S模型的請求方式,客戶端把參數(shù)通過網(wǎng)絡(luò)發(fā)給服務(wù)器,服務(wù)器根據(jù)參數(shù)要求完成相應(yīng)的服務(wù),然后把結(jié)果返回給客戶端,客戶端拿到結(jié)果了,一次請求算完成。由此看來,調(diào)用遠(yuǎn)程對象似乎并不難,問題在于這種方式不是網(wǎng)絡(luò)透明的,每一個細(xì)節(jié)你都要自己處理,非常復(fù)雜。
要簡化軟件的設(shè)計(jì),當(dāng)然是網(wǎng)絡(luò)操作透明化,調(diào)用者和實(shí)現(xiàn)者都無需關(guān)心網(wǎng)絡(luò)操作。要做到這一點(diǎn),我們可以按下列方法:
在客戶端要引入一個代理(Proxy)對象。它全權(quán)代理實(shí)際對象,調(diào)用者甚至都不知道它是一個代理,可以像調(diào)用本地對象一樣調(diào)用這個對象。當(dāng)調(diào)用者調(diào)用Proxy的函數(shù)時,Proxy并不做實(shí)際的操作,而是把這些參數(shù)打包成一個網(wǎng)絡(luò)數(shù)據(jù)包,并把這個數(shù)據(jù)包通過網(wǎng)絡(luò)發(fā)送給服務(wù)器。
在服務(wù)器引入一個樁(Stub)對象,Stub收到Proxy發(fā)送的數(shù)據(jù)包之后,把數(shù)據(jù)包解開,重新組織為參數(shù)列表,并用這些參數(shù)就調(diào)用實(shí)際對象的函數(shù)。實(shí)際對象執(zhí)行相關(guān)操作,把結(jié)果返回給Stub,Stub再把結(jié)果打包成一個網(wǎng)絡(luò)數(shù)據(jù)包,并把這個數(shù)據(jù)包通過網(wǎng)絡(luò)發(fā)送給客戶端的Proxy。
Proxy收到結(jié)果數(shù)據(jù)包后,把數(shù)據(jù)包解開為返回值,返回給調(diào)用者。至此,整個操作完成了。怎么樣,簡化吧。
Proxy隱藏了客戶端的網(wǎng)絡(luò)操作,Stub隱藏了服務(wù)器端的網(wǎng)絡(luò)操作,這就實(shí)現(xiàn)了網(wǎng)絡(luò)透明化。你也許會說,根本沒有簡化,只是把網(wǎng)絡(luò)操作隔離開了,仍然要去實(shí)現(xiàn)Proxy和Stub兩個對象,一樣的麻煩。
沒錯。不過仔細(xì)研究一下Proxy和Stub的功能,我們會發(fā)現(xiàn),對于不同對象,這些操作都差不多,無非就是打包和解包而已,單調(diào)重復(fù)。單調(diào)重復(fù)的東西必然有規(guī)律可循,有規(guī)律可循就可以用代碼產(chǎn)生器自動產(chǎn)生代碼。
像DCOM和CORBA等也確實(shí)是這樣做的,先用IDL語言描述出對象的接口,然后用IDL編譯器自動產(chǎn)生Proxy和Stub代碼,整個過程完全不需要開發(fā)人員操心。
打包和解包的專業(yè)術(shù)語叫做marshal和unmarshal,中文常用翻譯為列集和散集。不過這兩個詞太專業(yè)了,翻譯成中文之后更加讓人不知所云。我想還是用打包和解包兩個詞更通俗一點(diǎn)。
在以上模型中,調(diào)用對象的方法,確實(shí)做到了網(wǎng)絡(luò)透明化。讀者可以會問,我要訪問對象的屬性怎么辦呢?對象的屬性就是變量,變量就一塊內(nèi)存區(qū)域,內(nèi)存區(qū)域在不同的進(jìn)程里完全是獨(dú)立的,這看起來確實(shí)是一個問題。還記得很多關(guān)于軟件設(shè)計(jì)書籍里面講過的嗎:不要暴露對象屬性,調(diào)用者若要訪問對象的屬性,通過get/set方法去訪問。這樣不行了嗎,對屬性的訪問轉(zhuǎn)換為對對象方法的調(diào)用。
OK,調(diào)用對象的方法和訪問對象的屬性都解決了。還有重要的一點(diǎn),如何創(chuàng)建對象呢。因?yàn)閷?shí)際的對象并不固定在某臺機(jī)器上,它的位置可能是動態(tài)的。甚至Proxy本身也不知道Stub運(yùn)行在哪里。如果要讓調(diào)用者來指定,創(chuàng)建對象的過程仍未達(dá)到網(wǎng)絡(luò)透明化。通常的做法是引入一個第三方中介,這個第三方中介是固定的,可以通過一定的方法找到它。第三方中介負(fù)責(zé)在客戶端的Proxy和服務(wù)器的Stub之間穿針引線。第三方中介通常有兩種:一種是只負(fù)責(zé)幫客戶端找到服務(wù)器,之后客戶端與服務(wù)器直接通信。另外一種就是不但負(fù)責(zé)找到服務(wù)器,而且負(fù)責(zé)轉(zhuǎn)發(fā)所有的請求。
以上的模型仍然不完整,因?yàn)楝F(xiàn)實(shí)中的對象并不是一直處理于被動的地位。而是在一定的條件下,會主動觸發(fā)一些事件,并把這些事件上報給調(diào)用者。也就是說這是一個雙向的動作,單純的C/S模型無法滿足要求,而要采用P2P的方式。原先的客戶端同時作為一個服務(wù)器存,接受來自己服務(wù)器的請求。像COM里就是這樣做的,客戶端要注冊對象的事件,就要實(shí)現(xiàn)一個IDispatch接口,給對象反過來調(diào)用。
自己實(shí)現(xiàn)時還要考慮以下幾點(diǎn):
1.傳輸抽象層。分布可能是跨進(jìn)程也可能是跨機(jī)器。在不同的情況下,采用不同的通信方式,性能會有所不同。做一個傳輸抽象層,在不同的情況下,可選用不同的傳輸方式,是一種好的設(shè)計(jì)。
2.文本還是二進(jìn)制。把數(shù)據(jù)打包成文本還是二進(jìn)制?打包成文本的好處是,可移植性好,由于人也可以看懂,調(diào)試方便。壞處是速度稍慢,打包后的數(shù)據(jù)大小會明顯變大。采用二進(jìn)制的好處是,速度快,打包后的數(shù)據(jù)大小與打包前相差不大。壞處是不易調(diào)試,可移植性較差。
3.字節(jié)順序和字節(jié)對齊。若采用二進(jìn)制方式傳輸,可移植性是個問題。因?yàn)椴煌臋C(jī)器上,字節(jié)順序和字節(jié)對齊的方式都有些差異,在數(shù)據(jù)包中要加入這些說明,以提高可移植性。
三、并行計(jì)算和分布式計(jì)算的區(qū)別聯(lián)系
1、應(yīng)用的場合和解決的問題不一樣。分布式計(jì)算比較傾向于在計(jì)算尋找模式的東西,窮舉暴力之類的計(jì)算。分布式的計(jì)算被分解后的小任務(wù)互相之間有獨(dú)立性,節(jié)點(diǎn)之間的結(jié)果幾乎不互相影響,實(shí)時性要求不高。而并行計(jì)算則比較傾向于一些海量數(shù)據(jù)進(jìn)行分析處理的場合,每個節(jié)點(diǎn)的每一個任務(wù)塊都是必要的,計(jì)算的結(jié)果相互影響,要求每個節(jié)點(diǎn)的計(jì)算結(jié)果要絕對正確,并且在時間上做到同步。舉例來說,像MD5破解,就比較適合使用大規(guī)模的分布式計(jì)算來窮舉,但對海量日志數(shù)據(jù)進(jìn)行處理來分析用戶行為就比較適合并行計(jì)算處理。
2、實(shí)現(xiàn)方式區(qū)別比較大。分布式計(jì)算會是一個比較松散的結(jié)構(gòu),并行計(jì)算則是各節(jié)點(diǎn)之間通過高速網(wǎng)絡(luò)或其它總線之類的東西連接。因此并行計(jì)算一般在企業(yè)內(nèi)部進(jìn)行,而分布式計(jì)算可能會跨越局域網(wǎng),或者直接部署在互聯(lián)網(wǎng)上,節(jié)點(diǎn)之間幾乎不互相通信。很多公益性的項(xiàng)目,就是的使用分布式計(jì)算的方式在互聯(lián)網(wǎng)上實(shí)現(xiàn),比如以尋找外星人為目的的SETI項(xiàng)目。
評論