一、什么是并行計算
并行計算或稱平行計算是相對于串行計算來說的。所謂并行計算可分為時間上的并行和空間上的并行。 時間上的并行就是指流水線技術,而空間上的并行則是指用多個處理器并發(fā)的執(zhí)行計算。
并行計算(Parallel Computing)是指同時使用多種計算資源解決計算問題的過程。為執(zhí)行并行計算,計算資源應包括一臺配有多處理機(并行處理)的計算機、一個與網絡相連的計算機專有編號,或者兩者結合使用。并行計算的主要目的是快速解決大型且復雜的計算問題。

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















評論