原文連結:https://www.bughui.com/2017/08/23/difference-between-concurrency-and-parallelism/
很多年前,上作業系統課的時候,老師告訴我們「並行是指同一時刻同時做多件事情,而並發是指同一時間間隔內做多件事情」。這裡的差別初看確實簡單明了,不過較真的我表示不同意。老師們說的話,貌似並不嚴謹。時刻是指時間軸上的一個點,一個瞬間,這是個不可再分的量。如果在時間這個維度上沒有增量,何來「做事」一說!也就是說,老師們口中的「時刻」與時間間隔(時間段)其實是等價的。那老師們說的那個「區別」有什麼區別嗎?多年過去,今天偶然又討論起這個話題。。。
正是因為當初老師給同學們灌輸了這種模稜兩可的概念,所以每次提起這個話題的時候,總是免不了要有一番口水仗。關於這個問題,我在不同的場合與不同的小夥伴爭論過無數次了,厭煩了。所以,今天我想把我自己理解的概念寫下來,終結關於這個話題的爭論。
首先,我們來看看前輩的看法:
Concurrency is when two tasks can start, run, and complete in overlapping time periods. Parallelism is when tasks literally run at the same time, eg. on a multi-core processor.
Concurrency is the composition of independently executing processes, while parallelism is the simultaneous execution of (possibly related) computations.
Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.
An application can be concurrent – but not parallel, which means that it processes more than one task at the same time, but no two tasks are executing at same time instant.
An application can be parallel – but not concurrent, which means that it processes multiple sub-tasks of a task in multi-core CPU at same time.
An application can be neither parallel – nor concurrent, which means that it processes all tasks one at a time, sequentially.
An application can be both parallel – and concurrent, which means that it processes multiple tasks concurrently in multi-core CPU at same time.
Vipin Jain. Differences between concurrency vs. parallelism
翻譯成中文:
並發是兩個任務可以在重疊的時間段內啟動,運行和完成。並行是任務在同一時間運行,例如,在多核處理器上。
並發是獨立執行過程的組合,而並行是同時執行(可能相關的)計算。
並發是一次處理很多事情,並行是同時做很多事情。
應用程式可以是並發的,但不是並行的,這意味著它可以同時處理多個任務,但是沒有兩個任務在同一時刻執行。
應用程式可以是並行的,但不是並發的,這意味著它同時處理多核CPU中的任務的多個子任務。
一個應用程式可以即不是並行的,也不是並發的,這意味著它一次一個地處理所有任務。
應用程式可以即是並行的也是並發的,這意味著它同時在多核CPU中同時處理多個任務。
看完前輩的話有何感想呢?好像理解了些什麼是不?o(∩_∩)o 哈哈!這個翻譯可能稍微有那麼一些彆扭,因為這位前輩的話也是比較隨意的。在stackoverflow發言,比較的口語化。
雖然他的話略羅嗦,不夠精煉,但是已經比較全面的闡述了這兩個概念的區別了。
我再來用我自己的話分析一下:
並行才是我們通常認為的那個同時做多件事情,而並發則是在線程這個模型下產生的概念。並發表示同時發生了多件事情,通過時間片切換,哪怕只有單一的核心,也可以實現「同時做多件事情」這個效果。根據底層是否有多處理器,並發與並行是可以等效的,這並不是兩個互斥的概念。舉個我們開發中會遇到的例子,我們說資源請求並發數達到了1萬。這裡的意思是有1萬個請求同時過來了。但是這裡很明顯不可能真正的同時去處理這1萬個請求的吧!如果這臺機器的處理器有4個核心,不考慮超線程,那麼我們認為同時會有4個線程在跑。也就是說,並發訪問數是1萬,而底層真實的並行處理的請求數是4。如果並發數小一些只有4的話,又或者你的機器牛逼有1萬個核心,那並發在這裡和並行一個效果。也就是說,並發可以是虛擬的同時執行,也可以是真的同時執行。而並行的意思是真的同時執行。結論是:並行是我們物理時空觀下的同時執行,而並發則是作業系統用線程這個模型抽象之後站在線程的視角上看到的「同時」執行。
再回過頭去看看老師們的那句話,似乎也並沒有什麼不對的,只是不夠嚴謹,容易被誤導。這個問題,如果路過的同學沒有意見的話,就到此為止了。沒問題的話,以後,我就不再參與關於這個話題的爭論了。(ーー゛)
以上就是我對並發與並行的理解,如有偏差,歡迎指正。