OK,如果你還在為并發(fā)(concurrency)和并行(parallelism)這兩個詞的區(qū)別而感到困擾庶灿,那么這篇文章就是寫給你看的纵搁。不論中文圈還是英文圈,即使已經(jīng)有數(shù)不清的文章在討論并行vs并發(fā)往踢,卻極少有能講清楚的腾誉。讓一個講不清楚的人來解釋,比不解釋更可怕峻呕。
回歸正題利职,Erlang 之父 Joe Armstrong 用一張5歲小孩都能看懂的圖解釋了并發(fā)與并行的區(qū)別
并發(fā)是兩個隊列交替使用一臺咖啡機,并行是兩個隊列同時使用兩臺咖啡機瘦癌。
我們來具體探究一下并行與并發(fā)的概念猪贪。
并行(parallelism)
這個概念很好理解。所謂并行讯私,就是同時執(zhí)行的意思热押。判斷程序是否處于并行的狀態(tài),就看同一時刻是否有超過一個“工作單位”在運行就好了斤寇。所以桶癣,單線程永遠無法達到并行狀態(tài)。要達到并行狀態(tài)抡驼,最簡單的就是利用多線程和多進程鬼廓。
并發(fā)(concurrency)
要理解“并發(fā)”這個概念肿仑,必須得清楚致盟,并發(fā)指的是程序的“結(jié)構(gòu)”。當我們說這個程序是并發(fā)的尤慰,實際上馏锡,這句話應當表述成“這個程序采用了支持并發(fā)的設計”。好伟端,既然并發(fā)指的是人為設計的結(jié)構(gòu)杯道,那么怎樣的程序結(jié)構(gòu)才叫做支持并發(fā)的設計?正確的并發(fā)設計的標準是:使多個操作可以在重疊的時間段內(nèi)進行(two tasks can start, run, and complete in overlapping time periods)责蝠。
并行指物理上同時執(zhí)行党巾,并發(fā)指能夠讓多個任務在邏輯上交織執(zhí)行的程序設計
我的理解:
可以一起出發(fā)的并發(fā)(concurrent)相對的是不可以一起出發(fā)的順序(sequential)
順序:上一個開始執(zhí)行的任務完成后萎庭,當前任務才能開始執(zhí)行
并發(fā):無論上一個開始執(zhí)行的任務是否完成,當前任務都可以開始執(zhí)行
與可以一起執(zhí)行的并行(parallel)相對的是不可以一起執(zhí)行的串行(serial):
串行:有一個任務執(zhí)行單元齿拂,從物理上就只能一個任務驳规、一個任務地執(zhí)行
并行:有多個任務執(zhí)行單元,從物理上就可以多個任務一起執(zhí)行
我們用大白話的方式就是:
你吃飯吃到一半署海,電話來了吗购,你一直到吃完了以后才去接,這就說明你不支持并發(fā)也不支持并行砸狞。
你吃飯吃到一半捻勉,電話來了,你停了下來接了電話刀森,接完后繼續(xù)吃飯踱启,這說明你支持并發(fā)。
你吃飯吃到一半撒强,電話來了禽捆,你一邊打電話一邊吃飯,這說明你支持并行飘哨。
并發(fā)的關鍵是你有處理多個任務的能力胚想,不一定要同時。
并行的關鍵是你有同時處理多個任務的能力芽隆。
所以我認為它們最關鍵的點就是:是否是『同時』浊服。
綜上,并發(fā)與并行并不是互斥的概念胚吁,并發(fā)設計讓并發(fā)執(zhí)行成為可能牙躺,而并行是并發(fā)執(zhí)行的一種模式。