🦺

「マルチスレッドとマルチプロセス」と「並行処理と並列処理」は別々で考えないといけないよ

2023/04/26に公開

たまたまチームで議論になったので備忘録で!
表題のとおりですが、「マルチスレッドって並列処理だっけ?」と会話を皮切りに知識がごちゃごちゃしたので整理!マルチスレッド -> 並列処理 といった関係性はないよという話をつらつらと。

結論

  • マルチスレッドかマルチプロセスかと、並行処理か並列処理かの間に関係性はない。マルチスレッドで並列処理、マルチスレッドで並列処理、マルチプロセスで並行処理、マルチプロセスで並列処理のどのパターンもありうる。
  • マルチスレッドを使う場合は並行処理か並列処理かによらずスレッドセーフかどうかを考える必要がある
  • 並列処理ができるかどうかはCPUのコア数に依存する。コア数が2以上であれば並列処理ができる

並行処理と並列処理とは?


図の参照元はこちら

並行処理と並列処理の違いは、タスクの分割・実行において、同時に行われるか否かで

並行処理は、
複数のタスクを同時に処理することを指し、処理Aと処理Bが交互に実行されるイメージ。
並列処理は、
複数のタスクを同時に実行することを指し、処理Aと処理Bが同時に実行されるイメージ。

プロセスとスレッドの違い

プロセスとは、メモリ空間やCPU時間など、システムリソースを割り当てられた実行単位。一方、スレッドとは、プロセス内で実行される、より小さな実行単位。
プロセスは複数のスレッドで構成されることがある。

プロセスは独立した実行環境を持っており、別のプロセスとは独立に動作する。一方で、スレッドは同じプロセス内で共有されるメモリ空間やファイルハンドル、その他のシステムリソースを共有している。つまり、スレッドはプロセス内での並行処理を行うための単位であり、複数のスレッドが同時に実行されることがあるもの。

マルチスレッドとマルチプロセスとは?

マルチスレッドとは、1つのプログラムを複数に分割し、同時に処理を進める技術のこと。つまり、1つのプログラム内で複数の処理を同時に実行することができる。スレッドは軽量で、同じプロセス内であるため、スレッド同士でのデータの共有が容易で、また、プロセスの生成や破棄が必要なく、プログラマの手間も少なくて済む。ただし、スレッド同士が同じデータにアクセスするときには、注意が必要で、スレッドの中で排他制御を行わなければ、データ競合が起こる可能性がある。(スレッドセーフの話)

一方、マルチプロセスとは、1つのプログラムを複数に分割し、複数のプロセスで同時に処理を進める技術のこと。つまり、別々のプログラム間(別々の実行環境)でデータをやりとりしながら処理を進めることができる。プロセスは重量で、まったく別のプロセスとして実行されるため、プロセス間でデータの共有には特殊な手法が必要であり、プロセスの生成や破棄には時間とリソースが必要。

スレッドセーフや競合状態(コンフリクト)について

マルチスレッドやマルチプロセスにおいては、複数のプロセスやスレッドが同時に実行されるため、1つのリソースに複数のアクセスがある可能性がある。これによって、競合状態(コンフリクト)が発生することがある。競合状態は、複数のスレッドが同時に同じ変数、オブジェクト、ファイル、データベースなどを変更しようとするときに起きる。

マルチスレッドでは、複数のスレッドが同一のプロセス内で実行される。1つのプロセス内のすべてのスレッドは、同じメモリ空間を共有している。このため、競合状態になることがあり、同時に変数に書き込むなどの競合を生じることがありる。そのため、マルチスレッドでは、スレッド間でリソースの共有や同期の方法について明確に定義されなければならない。また、そのコードはスレッドセーフ(関数やクラス、変数などが、複数のスレッドから同時にアクセスされても、正しく動作すること)でなければならない。

一方、マルチプロセスでは、各プロセスは独自のメモリ空間を持つ。
したがって、競合状態の発生は少なくなる。ただし、プロセス間通信を行う必要があるため、スレッドよりもオーバーヘッド(処理負荷)が大きくなる。

さらに、マルチスレッドでは、スレッドの数が多いほどスケーラビリティが向上し、複数のタスクを同時に処理するための効果的な方法になる。一方で、マルチプロセスでは、プロセスの数を多くすることでスケーラビリティを向上させることができるが、プロセス生成のオーバーヘッドが大きくなるため、一定の制限がある。

並列処理はコア数で決まる

コア数とは、1つのプロセッサに搭載された複数のCPUコアの数を表し、コア数が増えると、1つのプロセッサで同時に複数の処理を実行することができる。

例えば、2つのCPUコアを搭載したプロセッサでは、1つのプロセッサ内で同時に2つの処理を実行することができ、同様に、4つ、8つ、16つのCPUコアを搭載したプロセッサでは、より多くの処理を同時に行うことができる。逆にコア数が1つだと同時に1つの処理しかできないため、並列処理はできない。

結論(再掲)

  • マルチスレッドかマルチプロセスかと、並行処理か並列処理かの間に関係性はない。マルチスレッドで並列処理、マルチスレッドで並列処理、マルチプロセスで並行処理、マルチプロセスで並列処理のどのパターンもありうる。
  • マルチスレッドを使う場合は並行処理か並列処理かによらずスレッドセーフかどうかを考える必要がある
  • 並列処理ができるかどうかはCPUのコア数に依存する。コア数が2以上であれば並列処理ができる

Discussion