你說的平行運算是哪種平行? Concurrency is NOT Parallelism
覺得我們的內容實用嗎? MyApollo 電子報讀者募集中!歡迎訂閱電子報!
「並行 / Concurrency 」與 「平行 / Parallelism 」是很多程式設計師會混淆的 2 個名詞。
p.s. 其實翻譯成並行與平行也確實容易讓人混淆
這導致我們在談「平行」運算時,經常會需要釐清 1 個點——那就是我們所指的「平行」是指 “Concurrency” 還是 “Parallelism” ?
這 2 者其實有很大的區別, ByteByteGo 用 1 張圖就解釋得淋漓盡致。
簡單來說:
- Concurrency 是 1 個 CPU 在執行多個任務時,各用很短的時間輪流切換執行。由於切換速度奇快,所以感受上就像多個任務同時執行一樣。而 CPU 在切換任務執行之前,會需要把當前的任務狀態記錄下來,然後載入將要執行的任務狀態,這個過程就叫 context switch 。
- Parallelism 就不一樣了,它是多個「運算單元」真的都在同時間做運算,沒有 Concurrency 那種共享運算資源的概念,此處使用「運算單元」一詞,是因為除了 CPU 之外,使用 GPU 或者透過網路建立叢集架構(cluster)等方式,譬如 Spark, Hadoop 等技術框架,也可以做到 Parallelism 。
- 最後, Concurrency 與 Parallelism 並不是互斥的概念, 2 個作法可以結合在一起使用。所以 ByteByteGo 的圖上才會有最後 1 種 — Concurrency + Parallelism, 這也是現代多核心 CPU 都具備的能力。
了解這 2 個名詞的差異之後,未來如果在其他技術文件上看到 Concurrency 與 Parallelism 的話,絕對可以更清楚知道文件想表達的意思!