プロセスとスレッドの違い:メモリ・切り替え・使い分けを比較

プロセスは、自分専用のアドレス空間と資源を持つ、実行中のプログラムです。スレッドは、プロセスの中の実行の単位です。同じプロセスのスレッドはメモリを共有するので、作るコストが小さく、通信も速いですが、1つのバグや異常終了がプロセス全体に影響します。別々のプロセスは互いに分離されていて、安全ですが、作るコストも、プロセス間で通信するコストも大きくなります。

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

数値は代表的な目安で、世代や製品によって異なります。

どんなときに使うか

プロセス
分離、堅牢性、安全性が欲しいとき。または、別々の作り手のソフトウェアが、メモリを共有してはいけないとき。
スレッド
処理どうしが素早くデータを共有する必要があり、1つのプログラムで複数のCPUコアを使いたいとき。
注意
スレッドがメモリを共有することは、強みであり、危険でもあります。共有データはロックやアトミック操作で守り、デッドロックにも注意が必要です。

よくある質問

スレッドはメモリを共有しますか?

はい。同じプロセスのスレッドは、そのプロセスのコード、ヒープ、グローバルデータを共有します。各スレッドが専用に持つのは、スタックとレジスタです。

なぜスレッドはプロセスより作るコストが小さいのですか?

新しいプロセスには自分専用のアドレス空間が必要ですが、スレッドはプロセスのアドレス空間を使います。スレッドの切り替えも、アドレス空間を変えずに済むので、コストが小さくなります。

1つのスレッドが異常終了するとどうなりますか?

スレッドはメモリを共有しているので、プロセス全体を巻き込むことがあります。1つのプロセスの異常終了は、通常、ほかのプロセスには影響しません。

スレッドでなくプロセスを使うべきなのはどんなときですか?

分離と堅牢性が欲しいとき(ブラウザのタブ、独立したサービスなど)、または、部品どうしが互いのメモリを壊せないようにしたいときです。

理解度チェック

プロセスを複製するときにコピーオンライトを使う利点として正しいものはどれか。

  1. A複製したプロセスと元のプロセスが、書き込んだ内容を常に共有できる
  2. B書き込まれたページだけを後で複製するので、速く省メモリになる
  3. C書き込みのたびにすべてのページを複製するので、データの安全性が高まる
答えと解説を見る

正解:B. 書き込まれたページだけを後で複製するので、速く省メモリになる

プロセスを複製するとき、全メモリをすぐにコピーすると時間もメモリもかかり、直後に別のプログラムを読み込むならそのコピーは無駄になります。コピーオンライトでは両方のページテーブルが同じ物理ページを読み出し専用で指すようにしておき、どちらかが書き込むとページフォルトが起き、OSがそのページだけを複製します。書き込んだ内容は共有されず、それぞれのプロセスに別に保たれます。全ページを複製するわけでもありません。

コンテキストスイッチで、切り替える前のプロセスについて保存しておく必要があるものはどれか。

  1. Aそのプロセスが使っているディスクのファイルの中身
  2. Bレジスタの値やプログラムカウンタなど、CPUの実行の状態
  3. Cそのプロセスの物理メモリの全内容
答えと解説を見る

正解:B. レジスタの値やプログラムカウンタなど、CPUの実行の状態

コンテキストスイッチでは、あとで同じ状態から再開できるように、汎用レジスタ、プログラムカウンタ、スタックポインタ、動作モードなどのCPUの状態を保存し、次に動かすプロセスの状態を読み込みます。プロセスを切り替える場合は、ページテーブルの場所を示すレジスタも切り替えます。メモリやファイルの中身はそのまま残っているので、切り替えのたびに保存する必要はありません。

プロセスのコンテキストスイッチが、レジスタの保存と復元にかかる時間よりも、実際には大きな性能の低下を招くことがある主な理由はどれか。

  1. A切り替えのたびに、CPUのクロック周波数が下がるから
  2. B切り替えのたびに、プログラムをディスクから読み直すから
  3. C切り替え後、キャッシュやTLBのミスが増えるから
答えと解説を見る

正解:C. 切り替え後、キャッシュやTLBのミスが増えるから

レジスタの保存と復元そのものは短時間で済みますが、切り替えたあとのプロセスにとって、キャッシュやTLBの中身は前のプロセスのもので、必要なデータや変換結果を読み込み直すまでミスが続きます。ASIDのないCPUでは、アドレス空間を切り替えるときにTLBを空にする必要もあります。この間接的なコストが、直接の切り替え時間より大きくなることがあります。クロックが下がったり、プログラムをディスクから読み直したりはしません。

  1. TLBの各項目にASID(アドレス空間識別子)を付ける利点として正しいものはどれか。
  2. ミューテックス(眠って待つロック)とスピンロックを比べた説明として正しいものはどれか。
  3. デッドロックの例として正しいものはどれか。

OSとハードウェアの練習問題へ

関連する用語の解説

コンテキストスイッチ
CPUで実行するプロセスやスレッドを切り替えること。レジスタやプログラムカウンタなどの状態を保存・復元し、プロセスの切り替えではアドレス空間も切り替える。
ミューテックス
同時に1つのスレッドだけが持てるロック。取れないときはスレッドを眠らせてCPUを譲り、解放されるとOSが起こす実装が一般的。
デッドロック
複数のスレッドがそれぞれ資源を持ったまま、ほかのスレッドが持つ資源を待ち合い、誰も先に進めなくなる状態。ロックを取る順番を全体で決めて防ぐ。

関連する比較