並行処理と並列処理の違い
Go言語による並行処理より
“この2つの用語はしばしば「何かが動作してる時に同時に別の何かが動作している」という意味で区別されずに使われています。”
確かに。Goroutineを使えば、複数の関数を同時に実行できるぐらいの認識でいた。
筆者の単純な区別としては
“並行性はコードの性質を指し、並列性は動作しているプログラムの性質をさす。”
つまり、コードは並行に動作するように書かれるが、並列に実行されるとは限らないということだ。
例えば、1コアのマシンで2つの領域を並列に動作させたい場合、複数のタスクが並列に実行されているように見えるが、実際は素早く逐次実行をしているので並列に実行されていない。(2コアであれば2つの領域は実際に並列に動作している)
Goroutineは並行処理か並列処理か
Goroutineはruntime.NumCPU()の値(論理コアの数)が複数だった場合、並列処理である。
論理コアごとにGorotineと紐づくカーネルスレッドが実行されるので、同時に複数の処理が起こっている。
Goroutineの特徴(おまけ)
- Goroutineは高速に実行される
M:Nモデルを使用し、ユーザスレッドであるGoroutineはコンテクストスイッチするが、カーネルスレッドはコンテクストスイッチしないから。
- Goroutineはメモリ使用量が少ない
Goroutineのスタックはガードページを使わない&初期サイズが2KBだから。