併發編程的基本概念

技術背景

Concurrency and Parallelism

Concurrency:併發是指任務之間可以併發執行,但是這並不能確保任務都在執行,它們之間很可能是交替執行的。 可併發說明兩個任務之間不需要共享狀態,或者沒有因果依賴關係
Parallelism:並行產生於多核計算機中,指兩個任務在兩(或以上)個CPU中同時執行。

併發是同一時間應對多件事情的能力;並行是同一時間動手做多件事情的能力。

舉例:六大門派圍攻光明頂,張無忌獻身解圍,當場放下豪言:六大門派,有和怨氣可找我張無忌發泄。
所有在場的六大門派之人本來是可以一塊向張無忌討教的。但是,顧忌自己是名門正派,決定和張無忌一一單挑。打了半晌,明教白眉鷹王內氣恢復,過來幫忙。六大門派見張無忌多了幫手,立馬再派一人挑戰。張無忌好比是CPU,六大門派好比是待處理的任務,誰先去和張無忌討教都行,這時併發的。但是張無忌一次只能和一個人過招。當白眉鷹王上去幫忙之後,他們可以同時應對兩人了。同時迎戰的兩人是並行的。

Asynchronous and Synchronous

Asynchronous:如果一個函數或者API是異步的,那麼當我們調用這個函數或者請求這個API時,不用等到函數或者API返回,發送請求完成即可完成。
對於函數我們可以通過註冊回調函數,當方法執行完畢時執行回調函數。
Synchronous:同步是指必須等到函數或者API執行完畢得到返回結果。

Blocking and Non-blocking

Blocking:當多個線程共享同一資源的時候,如果某個線程佔有資源遲遲不釋放則其他線程都會被阻塞。例如,一輛地鐵進站後遲遲不出站則其它地鐵都
被阻塞。在一段代碼邏輯中如果某一段需要訪問文件系統,或者請求外部API,這些一般都是耗時的請求,在它們執行完畢之前,後續邏輯都被阻塞。
Non-blocking:上邊說到的阻塞的情況都會導致線程掛起,但是無阻塞不會產生線程的忙等。當線程試圖請求資源時,應立即返回是否獲取的狀態。在代
碼邏輯中呢,我們就可以通過異步的方式處理耗時的操作,註冊回調函數,或者發送消息。

同步異步指的是一種協作方式;而阻塞和非阻塞指的是協作過程中出現的狀態。

舉一個"小王到書店買書"的例子:
一天,小王想要買一本編程書自學編程,於是來到了老王的書店。"老王,你這裏有最新出版的《21天精通XXX》嗎?"。於是發生瞭如下場景:

  1. 老王答道,"有,有,有,你稍微等一下,我給你找找"。兩個小時之後老王終於找到了這本書,小王掏錢帶書回家了。
  2. 老王答道,"有,有,有,你稍微等一下,我給你找找"。小王說,"行吧,你先找着,我去外邊擼會串兒"。期間小王不時的去店裏看看老王找到書沒有。兩個小時之後老王終於找到了這本書,小王掏錢帶書回家了。
  3. 老王答道,"有是有,不過你得給你找找,要不你先到外邊擼會串兒,等找到了叫你"。小王說,"沒事,我等着你吧老王"。兩個小時之後老王終於找到了這本書,小王掏錢帶書回家了。
  4. 老王答道,"有是有,不過你得給你找找,要不你先到外邊擼會串兒,等找到了叫你"。小王說,"好啊,等你找到了叫我"。兩個小時之後老王終於找到了這本書,小王掏錢帶書回家了。

場景1, 2, 3, 4分別對應:同步阻塞,同步非阻塞,異步阻塞,異步非阻塞。

在這個場景中,老王提供的賣書行爲是一種同步或異步的協作方式;而小王等書的過程具有阻塞或非阻塞的狀態。我們再爲上述例子添加兩個場景:這是小張過來買書了:"老王,你這裏有最新出版的《7天精通XXX》嗎?"

  1. 老王答道,"有,有,有,你先在小王后邊排隊等一會我給小張找完之後再給你找"。四個小時之後老王終於找到了這本書,小張掏錢帶書回家了。
  2. 老王答道,"有,有,有,不過你得給你找找,要不你先到外邊擼會串兒,等找到了叫你"。小張說,"好啊,等你找到了叫我"。兩個小時之後老王終於找到了這本書,小張掏錢帶書回家了。

同於同步的方式,當小王處於阻塞狀態時,小張也必須阻塞,直到小王把老王"釋放"出來。對於異步的方式,小張則不需要等待(意味着沒有阻塞),等老王找到了直接去取就OK了。

Deadlock:是指兩個或兩個以上的進程(或線程)在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。
Starvation:飢餓是指在多線程環境下,調度算法總是使某些線程總是無法得到資源,使其長時間處於等待狀態。
Live-lock:活鎖是指兩個線程在得到資源時都想讓對方使用資源,導致雙方都無法使用資源。

Race Condition:在多線程環境中,多個線程需要同時修改某一狀態,由於沒有對該共享狀態加鎖,不能保證每個線程進入順序,因而產生Race Condition。

無鎖算法:
Wait-free:是最有效的保證。每一次請求都在有限步驟內執行完成。
Lock-free:絕大多數都在有限步驟內完成,可以確保沒有死鎖,但是不能確保飢餓。
Obstruction-free(無干擾):一個方法在某一個時間點是隔離其他線程獨立執行的

http://www.zhihu.com/question/19732473
http://www.cnblogs.com/ktgu/p/3529143.html
http://en.wikipedia.org/wiki/Non-blocking_algorithm


發佈了41 篇原創文章 · 獲贊 17 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章