並行処理と並列処理
混同されやすいが、別の概念。
| 並行 (concurrency) | 並列 (parallelism) | |
|---|---|---|
| 何の話か | 構造 | 実行 |
| 定義 | 複数の処理を扱う設計 | 複数の処理が同時に走る |
| 必要なもの | 1 コアでも成立する | 複数コアが必要 |
| 目的 | 応答性、設計の整理 | 速度 |
Rob Pike の言い方では、 並行は「複数のことを同時に扱う」、 並列は「複数のことを同時に行う」。
例#
並行だが並列でない … 1 コアで OS が複数プロセスを切り替える
並列だが並行でない … [[SIMD]] で配列を一括処理する
両方 … 4 コアで 4 スレッドが動くなぜ区別が重要か#
必要な対処が違う。
| 課題 | |
|---|---|
| 並行 | [競合状態](/コンピュータ/並行・並列処理/Race Condition)、デッドロック、状態の管理 |
| 並列 | 負荷分散、通信コスト、偽共有 |
JavaScript は単一スレッドで並行(イベントループ)だが 並列ではない。 競合状態は起きにくいが、 CPU バウンドな処理でブロックする。
タスクの性質#
| 性質 | 適する手段 |
|---|---|
| I/O バウンド | 並行で十分。async、イベントループ |
| CPU バウンド | 並列が必要。スレッド、プロセス、GPU |
I/O 待ちに CPU コアを増やしても意味がない。 どちらのボトルネックかを先に確かめるのが実務の出発点。
参考文献#
- Rob Pike. Concurrency is not Parallelism. Heroku Waza, 2012. https://go.dev/blog/waza-talk
- Maurice Herlihy, Nir Shavit. The Art of Multiprocessor Programming, 2nd ed. Morgan Kaufmann, 2020.
- Remzi H. Arpaci-Dusseau, Andrea C. Arpaci-Dusseau. Operating Systems: Three Easy Pieces. Arpaci-Dusseau Books, 2018.(全文公開) https://pages.cs.wisc.edu/~remzi/OSTEP/