架构之:并发和并行
文章目錄
- 簡介
- 并發(fā)和并行
- 并發(fā)concurrency
- 并行執(zhí)行Parallel Execution
- 并行并發(fā)執(zhí)行 Parallel Concurrent Execution
- 并行*parallelism*
- 總結(jié)
簡介
在現(xiàn)代程序中,我們經(jīng)常會使用到兩個關(guān)鍵詞:并發(fā)concurrency和并行parallelism,雖然兩者的英文單詞區(qū)別很大,但是翻譯成中文之后幾乎是一樣的。雖然中文以其優(yōu)美的語法和工整的寫法凌駕于英語之上,但是帶來的復(fù)雜性和翻譯的多意性往往會給技術(shù)工作者一點點煩惱。
沒關(guān)系,今天本文為大家解密一下并發(fā)和并行的聯(lián)系和區(qū)別。
注意,本文所講的并發(fā)和并行的概念都是指在同一個應(yīng)用程序中。
并發(fā)和并行
事實上除了并發(fā)concurrency和并行parallelism,還有2個狀態(tài):并行執(zhí)行Parallel Execution 和 并行并發(fā)執(zhí)行 Parallel Concurrent Execution。接下來我們來分別講解一下他們的區(qū)別。
并發(fā)concurrency
大家知道java中有一個非常有用的并發(fā)包叫做java.util.concurrent,里面有很多非常有用的類,用來處理多線程之間的資源競爭問題。根據(jù)并發(fā)包的作用,大家應(yīng)該就可以猜到并發(fā)和并行的最大區(qū)別在于是否有資源搶占的情況。
我們來舉個最近爆火的打新冠疫苗的例子,在本地沒有確診病例之前,大家都不慌著打疫苗,資源相對就比較多,不需要搶,所以不存在并發(fā)問題。
但是當(dāng)一個地方出現(xiàn)了確診病例之后,大家都慌了,于是搶著去打疫苗,造成了資源的緊張,于是產(chǎn)生了并發(fā)問題。
為了更好的描述這個并發(fā)問題,假設(shè)我們有10個人排成了兩支隊伍要去打疫苗,結(jié)果只有一個打疫苗的窗口。那么一個很可能的策略就是窗口交替給兩個隊伍的人打疫苗。我們做個圖來表示:
上圖表示的就是并發(fā)concurrency的情況,一個窗口同時只能處理一個任務(wù),所以兩個隊伍在爭奪窗口這個資源。
資源爭奪過程中會產(chǎn)生各種鎖的問題,從而需要特別小心。
并行執(zhí)行Parallel Execution
并行執(zhí)行的意思是兩個互相不干擾的任務(wù)同時進(jìn)行。也就是說任務(wù)之間并沒有資源的競爭關(guān)系,所以不會產(chǎn)生鎖的問題。如果用在打疫苗的問題上,并行執(zhí)行就是說現(xiàn)在有兩個窗口,每個隊列都可以分到一個窗口,不會產(chǎn)生競爭關(guān)系。
并行執(zhí)行是程序執(zhí)行中最理想的情況,這種情況下資源是充足的,只需要考慮具體的業(yè)務(wù)邏輯即可,并不需要考慮他們之間的交互和資源占用關(guān)系。
并行并發(fā)執(zhí)行 Parallel Concurrent Execution
并行并發(fā)執(zhí)行的的意思就是在并行的過程中還存在著并發(fā)。以打疫苗的例子就是,現(xiàn)在有兩個體育館,每個體育館都只有一個打疫苗的窗口,對于兩個體育館來說他們是并行的。但是對于每個體育館中的每個窗口來說,又是并發(fā)執(zhí)行的。
并行并發(fā)執(zhí)行狀態(tài)應(yīng)該是一般的應(yīng)用程序中的基本狀態(tài)。執(zhí)行不同任務(wù)的線程是并行執(zhí)行的,他們的資源是隔離的,所以互不影響。但是執(zhí)行同一個任務(wù)的多個線程之間又是并發(fā)的,他們之間會搶占資源,所以需要進(jìn)行并發(fā)控制。
并行parallelism
parallelism和Parallel翻譯起來好像沒有什么太大的區(qū)別,前面一個是專業(yè)的計算機名稱表示并行性,后面一個可以用在任何地方,表示并行。
那么在計算機中,parallelism指的是什么意思呢?
其實它是指一個任務(wù)的可并行程度。比如5個人的打疫苗的任務(wù),可以將5個人分成5個小組,每個小組都可以去爭取自己的資源來執(zhí)行,這其中可以并發(fā)也可以并行,這就是并行性parallelism的意思。我們用下面的圖來表示:
總結(jié)
講了這么多,大家明白他們之間的區(qū)別了嗎?
本文已收錄于 http://www.flydean.com/05-concurrency-parallelism/
最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發(fā)現(xiàn)!
歡迎關(guān)注我的公眾號:「程序那些事」,懂技術(shù),更懂你!
總結(jié)
- 上一篇: 密码学系列之:SAFER
- 下一篇: 架构之:软件架构漫谈