閱讀843 返回首頁    go 阿裏雲 go 技術社區[雲棲]


AKKA文檔(java)——術語,概念

本章我們試圖建立一個通用的術語列表,用來定義有關並發和分布式係統的堅實的基礎,而這也是akka的目標。請注意,在這些術語當中許多並沒有一致的定義。我們簡單的尋求在akka文檔範圍內使用的工作定義。

並發與並行

並發與並行是相關的概念,但是也有很多細節上的差異。並發意味著兩個或更多的任務正在取得進展,即使它們不是同時執行的。例如,可以用時間片的方式實現這一點,每個任務在時間片內執行一小部分,並與其它任務的切片混合執行。並行的出現使任務實現了真正的同時執行。

異步與同步

如果方法的調用者在方法返回或拋出異常前不能有任何進展,這個方法調用就被認為是同步的。然而異步調用允許調用者可以取得有限的進展,調用的方法完成時會通過其它機製(可能是注冊的回調、Future對象或一條消息)向調用者發送信號。

一個同步API可能使用阻塞方式實現,但這不是必須的。對於一個CPU密集型任務可能有類似的阻塞行為。一般情況下,異步API是更好的選擇,因為它們確保任務可以取得進展。角色是天生異步的,一個角色能夠在發送一條消息後不用等待實際的傳輸行為而繼續執行。

非阻塞與阻塞

我們談論的阻塞是指一個線程的延遲可以無限期延遲其它一些線程。一個不錯的例子是一個線程以互斥的方式獨占一項資源。如果一個線程無限期的(比如不小心運行了一個無限循環)持有這項資源,而其它線程因等待該資源而無法繼續運行。與此相反,非阻塞意味著沒有線程可以無限期的延遲其它線程。

非阻塞操作比阻塞操作要優先選擇,當係統中包含阻塞操作時,係統整體的進度就不能得到一般性的保證。

死鎖、饑餓與活鎖

死鎖的出現是因為多個參與者同時互相等待對方到達某個特定狀態進而得以繼續,然而它們都因為其它參與者不能到達這個特定狀態(一個“第二十二條軍規”問題)而不能繼續,所有相關子係統都不能被中斷。死鎖與阻塞緊密相關,因為一個參與者線程有能夠無限期延遲其它線程的必要。

發生了死鎖時,沒有參數者可以繼續執行,而饑餓恰好與之相反,當有參與者可以執行時,可能會有一個或更多得不到執行機會。典型場景是一個簡單調度算法問題挑選高優先級任務。如果持續傳入足夠多的高優先級任務,低優先級任務永遠也不會執行。

活鎖類似死鎖,沒有參與者可以繼續執行。所不同的是,不是在等待其它參與者的進度,而是參與者自己不斷改變自己的狀態。一個示例場景是兩個參與者有兩個相同的可用資源。它們都試圖獲得資源,但是它們還會檢查是否有其它參與者也需要這個資源。當資源被其它參與者請求時,它們嚐試得到這個資源的其它實例。在不走運的時候,可能會發生兩個競爭者在兩個資源之間反彈,永遠也不占有它們,一直遷就於其它參與者。

競態條件

我們說的競態條件是指有關一組事件的順序的假設可能會受外部不確定性因素的影響。競態條件經常發生在多線程擁有一個共享可變狀態,而線程交替操作引發的意外行為。雖然這是一種常見情況,共享狀態也不必出現競態條件。一個例子是,客戶端向服務器發送無序數據包(UDP數據報就是這樣的例子) P1P2。數據包可能經由不同的網絡路徑,服務器可能先收到P2再收到P1。如果消息不包含有關它們的發送順序的信息,服務器就不能確定數據包的順序了。依賴於數據包的意義就可能引發競態條件。

注意

AKKA隻保證在一對給定角色之間傳遞的消息始終保持消息傳遞的順序。見消息傳遞的可靠性

非阻塞擔保(進展狀況)

在前麵的章節中,因為一些原因而不推薦阻塞,包括死鎖的危險,降低係統吞吐量。接下來的部分我們從不同程度上討論多種非阻塞屬性。

無等待

一個無等待的方法是指每次調用確保在有限步驟內結束。如果一個方法是有界無等待的,它的步數就有一個上限。

基於這個定義,無等待方法永遠不阻塞,因此也不會死鎖,因為每一部分都可以在有限步數以後繼續(當調用結束時),無等待方法也不會發生饑餓。

無鎖定

無鎖定屬性比無等待要弱。發生無鎖定的調用時,方法常常在有限步驟內完成。這一定義意味著無鎖定的調用不會發生死鎖。另一方麵,確保一些方法在有限步內完成不足以確保所有調用最終都會完成。換句話說,元鎖定不足以確保不會發生饑餓。

無阻塞

無阻塞是本文討論的比無鎖定還要弱的保證。一個無阻塞的方法調用是指如果有一個隔離執行的時間點(其它線程不執行任何步驟,比如掛起),它在有限步數內結束。所有無鎖定的對象都是無阻塞的,但是反過來通常不成立。

樂觀並發控製(OCC)方法通常是無阻塞的。OCC的做法是,每一個參與者試圖操作共享對象,但是如果一個參與者探測到與其它參與者衝突,它就回滾所有個性,並按照某些調度策略再次嚐試。如果某個時間點上有且隻有一個參與者在嚐試,操作就會成功。

推薦文獻

  • 多處理器編程的藝術(The Art of Multiprocessor Programming),M. Herlihy與N Shavit, 2008. ISBN 978-0123705914
  • Java並發編程實踐(Java Concurrency in Practice),B. Goetz, T. Peierls, J. Bowbeer, D. Holmes與D. Lea. 2006. ISBN 978-0321349606
  • 轉載自 並發編程網 - ifeve.com

最後更新:2017-05-23 17:02:15

  上一篇:go  爬下20萬份菜譜,數據解讀舌尖上的中國 | 饕餮文本大宴
  下一篇:go  2017年全球創新公司琅琊榜及10條成功啟示錄