Akka相關術語《fifteen》 譯

在本章中,咱們嘗試創建一個通用術語,以便爲Akka所針對的併發分佈式系統進行通訊奠基堅實的基礎。請注意,對於其中許多條款,沒有單一的商定定義。咱們尋求提供將在Akka文檔範圍內使用的工做定義。html

併發與並行算法

併發和並行是相關的概念,但存在細微差異。併發意味着兩個或多個任務正在取得進展,即便它們可能沒有同時執行。這能夠例如經過時間切片來實現,其中任務的各部分被順序執行而且與其餘任務的部分混合。另外一方面,並​​行性在執行能夠真正同時發生時出現。服務器

異步與同步網絡

若是調用方在方法返回值或拋出異常以前沒法進行,則方法調用被視爲同步。另外一方面,異步調用容許調用者在有限數量的步驟以後前進,而且能夠經過一些附加機制(它能夠是註冊的回調,Future或消息)來發信號通知方法的完成。併發

同步API可使用阻塞來實現同步,但這不是必需的。CPU密集型任務可能會產生與阻塞相似的行爲。一般,最好使用異步API,由於它們能夠保證系統可以進步。Actor本質上是異步的:Actor能夠在發送消息後繼續進行,而無需等待實際的傳遞發生。dom

非阻塞與阻塞異步

咱們討論阻塞,例如若是一個線程的延遲能夠無限延遲其餘一些線程。一個很好的例子是一個資源,它能夠由一個使用互斥的線程專門使用。若是線程無限期地保留資源(例如意外地運行無限循環),則等待資源的其餘線程沒法進行。相反,非阻塞意味着沒有線程可以無限期地延遲其餘線程。分佈式

非阻塞操做比阻塞操做更受歡迎,由於當系統包含阻塞操做時,系統的總體進度難以保證。ide

死鎖與飢餓與現場鎖定ui

當幾個Actor彼此等待達到特定狀態以便可以進展時,就會出現死鎖。因爲沒有其餘Actor達到某種狀態,全部受影響的子系統都會中止運轉。死鎖與阻塞密切相關,由於參與者線程可以無限延遲其餘線程的進展。

在死鎖的狀況下,沒有參與者能夠取得進展,而相反,當有參與者能夠取得進展時會發生飢餓,但可能有一個或多個不可能。典型狀況是天真調度算法的狀況,該算法老是選擇低優先級任務的高優先級任務。若是傳入的高優先級任務的數量始終足夠高,則不會完成任何低優先級任務。

Livelock相似於死鎖,由於沒有參與者取得進展。但不一樣的是,參與者不是在等待其餘人進步的狀態下被凍結,而是不斷改變他們的狀態。兩個參與者有兩個相同資源可用的示例場景。他們每一個人都試圖獲取資源,但他們也檢查對方是否也須要資源。若是資源是由其餘參與者請求的,則他們嘗試獲取該資源的另外一個實例。在不幸的狀況下,可能會發生這兩個參與者在兩種資源之間「反彈」,從未得到它,但老是屈服於另外一種資源。

競爭條件

當外部非肯定性效應可能違反關於一組事件的排序的假設時,咱們將其稱爲競爭條件。當多個線程具備共享可變狀態時,一般會出現競爭條件,而且狀態上的線程操做可能會交錯,從而致使意外行爲。雖然這是一種常見狀況,但共享狀態不必定具備競爭條件。一個示例能夠是客戶端將無序分組(例如UDP數據報)P1,P2發送到服務器。因爲數據包可能經過不一樣的網絡路由傳輸,所以服務器可能先接收P2,而後接收P1。若是消息中不包含有關其發送順序的信息,則服務器沒法肯定它們是以不一樣的順序發送的。根據數據包的含義,這可能會致使競爭條件。

非阻塞保證(進展條件)

正如前面部分所討論的那樣,阻塞是不可取的,緣由有多種,包括死鎖的危險和系統中的吞吐量下降。在如下部分中,咱們將討論具備不一樣強度的各類非阻塞特性。

Wait-freedom

wait-free方法表示若是保證每一個調用都以有限的步數完成。若是方法是無限制的,則步數具備有限的上限。

從這個定義能夠看出,無等待方法永遠不會阻塞,所以不會發生死鎖。此外,因爲每一個參與者能夠在有限數量的步驟以後(當呼叫結束時)進展,所以無等待方法沒有飢餓。

Lock-freedom

Lock-freedom是一種比wait-free更弱的。在無鎖調用的狀況下,無限次地某些方法在有限數量的步驟中完成。此定義意味着無鎖調用不會出現死鎖。另外一方面,某些呼叫在有限數量的步驟中完成的保證不足以保證全部呼叫最終完成。換句話說,Lock-freedom不足以保證缺少飢餓。

Obstruction-freedom
Obstruction-freedom是這裏討論的最弱的非阻礙保證。若是一個方法在一個時間點以後被隔離執行(其餘線程沒有任何步驟,例如:被暫停),則該方法被稱爲無障礙,它以有限的步數完成。全部無鎖物體都是無障礙的,但相反的狀況一般是不正確的。

樂觀併發控制(OCC)方法一般是無障礙的。OCC方法是每一個參與者都嘗試在共享對象上執行其操做,但若是參與者檢測到其餘參與者的衝突,則會回滾修改,並根據某些計劃再次嘗試。若是有一個時間點,其中一個參與者是惟一嘗試的參與者,則操做將成功。

推薦文獻:

  • The Art of Multiprocessor Programming, M. Herlihy and N Shavit, 2008. ISBN 978-0123705914
  • Java Concurrency in Practice, B. Goetz, T. Peierls, J. Bloch, J. Bowbeer, D. Holmes and D. Lea, 2006. ISBN 978-0321349606

下節再續!

原文:https://doc.akka.io/docs/akka/2.5/guide/tutorial_5.html

相關文章
相關標籤/搜索