2010-05-09 61 views
3

我不太瞭解關於哪種模式更好的討論的狀態,所以我想問一個非常直接的問題:它是否看起來像是兩個相反的觀點,真的有爭議?例如。像原型/類基於面向對象或動態與靜態打字「Holywar」是否具有「消息傳遞/共享狀態」困境(併發和分發)?

(雖然這些都是真的不多擬合的例子,我只是不知道如何更清楚地表達我的問題)

+2

我在這裏看不到神聖的戰爭。消息傳遞是更清潔,更安全的解決方案,但有時它太慢了。一些計算模型受益於共享狀態,一些來自消息傳遞。這完全取決於你的問題。 – liori 2010-05-09 13:51:22

回答

7

From Wikipedia

在一些併發計算系統,併發組件之間的通信對程序員來說是隱藏的(例如,通過使用期貨),而在其他組件中則必須明確處理。顯式通信可以分爲兩類:

共享存儲器通信 併發部件通過改變共享存儲器位置的內容傳遞(由Java和C#爲例)。這種併發編程風格通常需要應用某種形式的鎖定(例如,互斥鎖,信號量或監視器)來在線程之間進行協調。

消息傳遞通信 併發部件通過交換消息(由Erlang和奧卡姆例舉)進行通信。消息交換可以異步執行,也可以使用發件人阻塞直到收到消息的集合點樣式。異步消息傳遞可能是可靠或不可靠的(有時稱爲「發送和祈禱」)。消息傳遞併發往往比共享內存併發更容易推理,並且通常被認爲是更健壯的併發編程形式。用於理解和分析消息傳遞系統的各種數學理論是可用的,包括Actor模型和各種過程計算。消息傳遞可以有效地在對稱多處理器上實現,有或沒有共享連貫內存。

共享內存和消息傳遞併發具有不同的性能特徵;通常(雖然不總是),消息傳遞系統中的每進程內存開銷和任務切換開銷較低,但消息傳遞本身的開銷大於過程調用的開銷。這些差異常常被其他性能因素所淹沒。上面的文章說異步通信可能是不可靠的,但可以通過使用事務性排隊系統(JMS over MQSeries,OpenMQ等...)來避免異步通信。

我的兩美分價值。
這兩個範例不競爭它們的目的不同,我們正在討論異步通信與同步通信。對於可伸縮性,通常最好是在可能的情況下執行異步操作,因爲無論何時您有額外的帶寬,您都可以隨時遵從另一個進程或處理結果。將算法分解爲異步工作並不總是可能的。

相關問題