並行処理と並列処理

並行処理と並列処理

執筆済 コンピュータ並行処理

混同されやすいが、別の概念

並行 (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/
ノート一覧を閉じる