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コアでそれぞれ処理できます。深層学習、科学計算、動画レンダリングなど、計算量の大きい処理でよく使われます。
5. 4つの考え方を比較する#
| 方式 | 画像処理 | Webサーバー | ネットワーククローラー | 科学計算 |
|---|---|---|---|---|
| マルチプロセス | 画像ごとに独立したプロセスで処理 | リクエストごとにプロセスを割り当てる設計も可能 | IPCのコストが大きくなりやすい | 独立した計算タスクの分散に向く |
| マルチスレッド | 共有データが必要な場合に有効 | リクエストをスレッドで処理し、キャッシュを共有 | スレッド間でI/O状態を共有しやすい | 共有メモリを使う計算分割に向く |
| 並行 | 画像処理を待ち時間付きで交互に進める | 1コアでも複数リクエストを進められる | 多数のI/Oリクエストを切り替える | I/O中心の処理に向く |
| 並列 | 複数コアで複数画像を同時処理 | 複数コアでリクエストを同時処理 | 複数コアでクローラーを動かす | 計算タスクの高速化に向く |
まとめ#
マルチプロセスは独立性と障害分離を重視する処理、マルチスレッドは同一プロセス内での共有を重視する処理に向いています。並行は複数タスクを進行させる方法、並列は複数の計算資源で同時実行する方法です。実際の設計では、CPU負荷、I/O待ち、共有データ、同期コスト、障害時の扱いを考えて選択します。

