並行処理と並列処理の違い

おざなりにしがちな言葉の定義の話

Yu Kato
2 min readSep 1, 2019

Go言語による並行処理より

“この2つの用語はしばしば「何かが動作してる時に同時に別の何かが動作している」という意味で区別されずに使われています。”

確かに。Goroutineを使えば、複数の関数を同時に実行できるぐらいの認識でいた。

筆者の単純な区別としては

“並行性はコードの性質を指し、並列性は動作しているプログラムの性質をさす。”

つまり、コードは並行に動作するように書かれるが、並列に実行されるとは限らないということだ。

例えば、1コアのマシンで2つの領域を並列に動作させたい場合、複数のタスクが並列に実行されているように見えるが、実際は素早く逐次実行をしているので並列に実行されていない。(2コアであれば2つの領域は実際に並列に動作している)

Goroutineは並行処理か並列処理か

Goroutineはruntime.NumCPU()の値(論理コアの数)が複数だった場合、並列処理である。

論理コアごとにGorotineと紐づくカーネルスレッドが実行されるので、同時に複数の処理が起こっている。

Goroutineの特徴(おまけ)

  • Goroutineは高速に実行される

M:Nモデルを使用し、ユーザスレッドであるGoroutineはコンテクストスイッチするが、カーネルスレッドはコンテクストスイッチしないから。

  • Goroutineはメモリ使用量が少ない

Goroutineのスタックはガードページを使わない&初期サイズが2KBだから。

--

--

Yu Kato

Japanese web developer/1998’s/ i wiill write about my project(Go/React) https://github.com/yutify