プロセスとスレッドの違い:メモリ・切り替え・使い分けを比較
プロセスは、自分専用のアドレス空間と資源を持つ、実行中のプログラムです。スレッドは、プロセスの中の実行の単位です。同じプロセスのスレッドはメモリを共有するので、作るコストが小さく、通信も速いですが、1つのバグや異常終了がプロセス全体に影響します。別々のプロセスは互いに分離されていて、安全ですが、作るコストも、プロセス間で通信するコストも大きくなります。
| 項目 | プロセス | スレッド |
|---|---|---|
| 何か | 自分専用のアドレス空間、ファイルなどの資源を持つ、実行中のプログラム | プロセスの中の実行の流れ。自分のスタックとレジスタを持つ |
| メモリ | 別々の仮想アドレス空間。ほかのプロセスと分離されている | プロセスのコード、ヒープ、グローバルデータを共有する。専用なのはスタックだけ |
| 作成のコスト | 重い。新しいアドレス空間を用意する必要がある(コピーオンライトでコストを減らせる) | 軽い。新しいアドレス空間は不要 |
| コンテキストスイッチ | 高い。アドレス空間が変わり、変換結果のキャッシュ(TLB)が失われることがある | 安い。アドレス空間とキャッシュはそのまま |
| 通信 | パイプ、ソケット、共有メモリなどのプロセス間通信が必要 | 共有メモリを直接読み書きできて速い |
| 分離と障害 | 異常終了は、多くの場合そのプロセスの中にとどまる | 1つのスレッドの異常終了が、プロセス全体を巻き込むことがある |
| 同期 | プロセス間でメモリやファイルを共有するときに必要 | 共有データには常に必要。ミューテックスやアトミック操作がないと、データ競合やデッドロックが起きる |
| スケジューリング | 1つ以上のスレッドを含む | OSが実際にCPUコアへ割り当てる単位 |
| 主な用途 | 分離と安全のため。ブラウザのタブ、サービス、シェルのパイプライン | 1つのプログラム内の並列処理。多数の接続を扱うサーバー、バックグラウンドの処理、並列計算 |
数値は代表的な目安で、世代や製品によって異なります。