メインコンテンツへスキップ
  1. ノート/
  2. Linux/

マルチプロセスとマルチスレッド、並行と並列

·1708 文字·4 分· loading · loading · · ·
ICE345
著者
ICE345
CS Student | System | Linux | OCaml

1. マルチプロセス(Multiprocessing)
#

マルチプロセスは、複数のプロセスを作成して処理を分担する方法です。各プロセスは基本的に独立した仮想アドレス空間を持つため、あるプロセスのメモリ破壊が他のプロセスへ直接影響しにくいという特徴があります。

例:複数のファイルを処理する
#

大量のファイルを読み込み、加工して別のファイルへ書き出す処理を考えます。ファイルごとにプロセスを作成すれば、処理を分担できます。4コアのCPUなら、OSは実行可能なプロセスを異なるコアへ割り当て、計算処理を並列化できる場合があります。

画像処理、動画エンコード、科学計算など、タスク同士が独立した計算集約型の処理に向いています。一方、プロセス間でデータを共有する場合は、パイプ、ソケット、共有メモリなどのIPCが必要になります。

2. マルチスレッド(Multithreading)
#

マルチスレッドは、1つのプロセス内に複数の実行単位を作る方法です。スレッドは同じプロセスのメモリ空間やリソースを共有します。

例:Webサーバー
#

Webサーバーが複数の利用者から同時にリクエストを受け取る場合、リクエストごとにスレッドを割り当てる設計を考えられます。共有キャッシュなどを簡単に利用できる一方、同じデータを複数のスレッドが更新すると競合が起きるため、mutexやRWLockなどの同期機構が必要です。

ネットワークサービス、データベース接続、GUIアプリケーションなど、タスク間で頻繁にデータを共有する処理に向いています。マルチコア環境では、複数のスレッドが異なるコアで同時に実行されることもあります。

3. 並行(Concurrency)
#

並行処理は、複数のタスクが進行中である状態を、処理の切り替えによって実現する考え方です。必ずしも同じ瞬間に実行されるとは限りません。

例:I/Oを待つネットワーククライアント
#

CPUコアが1つしかなくても、タスク1がネットワーク応答を待っている間に、OSはタスク2へ切り替えてファイル処理を進められます。複数の処理が交互に進むため、利用者からは同時に進んでいるように見えます。

並行処理は、I/O待ちの多いネットワーククローラー、ファイルサーバー、非同期プログラムなどで効果を発揮します。

4. 並列(Parallelism)
#

並列処理は、複数のタスクを同じ時刻に異なるCPUコアや実行ユニットで処理することです。複数コアが必要になるため、並行処理よりもハードウェアの並列性に依存します。

例:画像処理
#

大量の画像へ同じフィルターを適用する場合、画像の集合を4つに分け、4コアでそれぞれ処理できます。深層学習、科学計算、動画レンダリングなど、計算量の大きい処理でよく使われます。

並行は複数のタスクを切り替えながら進行させる概念で、1コアでも実現できます。並列は複数のタスクを同時に実行する概念で、通常は複数の実行コアを使います。1つのプログラムが、並行と並列の両方を利用することもあります。

5. 4つの考え方を比較する
#

方式画像処理Webサーバーネットワーククローラー科学計算
マルチプロセス画像ごとに独立したプロセスで処理リクエストごとにプロセスを割り当てる設計も可能IPCのコストが大きくなりやすい独立した計算タスクの分散に向く
マルチスレッド共有データが必要な場合に有効リクエストをスレッドで処理し、キャッシュを共有スレッド間でI/O状態を共有しやすい共有メモリを使う計算分割に向く
並行画像処理を待ち時間付きで交互に進める1コアでも複数リクエストを進められる多数のI/Oリクエストを切り替えるI/O中心の処理に向く
並列複数コアで複数画像を同時処理複数コアでリクエストを同時処理複数コアでクローラーを動かす計算タスクの高速化に向く

まとめ
#

マルチプロセスは独立性と障害分離を重視する処理、マルチスレッドは同一プロセス内での共有を重視する処理に向いています。並行は複数タスクを進行させる方法、並列は複数の計算資源で同時実行する方法です。実際の設計では、CPU負荷、I/O待ち、共有データ、同期コスト、障害時の扱いを考えて選択します。


评论