プログラムの実行単位であるプロセスと、その中でさらに細かく並行実行されるスレッドの関係。
プロセスとは、実行中のプログラムのことです。独立したメモリ空間(=データを置く領域)とリソースを持ちます。一方スレッドとは、プロセス内の実行の流れのことで、1つのプロセスは複数のスレッドを持てます。
身近な例で考えると、1軒の家(プロセス)と、その中で働く家族(スレッド)に似ています。家には専用のキッチンや道具(メモリ空間)があり、家族はそれを共有しながら、それぞれ別の作業を同時に進められます。別の家(別プロセス)の道具は勝手には使えません。
上の図解のように、1つのプロセス(青い枠)の中に複数のスレッド(オレンジ)が並び、それぞれが処理を進めます。スレッドはあくまでプロセスの中の存在であることを押さえておきましょう。
プロセスとスレッドの最大の違いはメモリ空間(アドレス空間)を共有するかどうかです。
・プロセス同士:メモリ空間が独立している(互いに干渉しない)
・同一プロセス内のスレッド:メモリ空間を共有する(データを直接やり取りできる)
プロセス同士が独立しているのは安全のためです。あるプロセスが誤って別のプロセスのデータを書き換えてしまうと大混乱になるので、OSは互いのメモリに勝手に触れないようにしています。一方、同じプロセス内のスレッドは同じ空間を共有するため、わざわざデータをコピーしなくても直接やり取りできます。家族なら冷蔵庫の中身を共有できるが、隣家の冷蔵庫は開けられない、というイメージです。
プロセスとスレッドは、それぞれ違った強みを持っています。メモリ空間を分けるか共有するかの違いが、そのまま利点の違いになります。
| 項目 | プロセス | スレッド |
|---|---|---|
| メモリ空間 | 独立している | 同一プロセス内で共有する |
| 生成のコスト | 重い(独自の空間が必要) | 軽量 |
| 独立性・安全性 | 高い(1つ落ちても影響しにくい) | 低い(同じ空間を共有するため) |
| データのやり取り | 手続きが必要で遅め | 直接できて速い |
プロセスの利点は独立性・安全性が高いことです。メモリ空間が分かれているため、1つのプロセスが異常終了しても他のプロセスに影響しにくく、システム全体が巻き込まれにくくなります。
一方スレッドの利点は、生成が軽量で、メモリ空間の共有により高速に協調動作できることです。同じデータを直接読み書きできるので、たとえば「ファイルを読み込みながら同時に画面を更新する」といった連携をスムーズに行えます。安全性を取るならプロセス、軽さと協調を取るならスレッド、と覚えると整理しやすいです。
なぜプロセスとスレッドの2種類があるのか。それはコンピュータが解決したい2つの課題があるからです。
・「クラッシュが波及しないようにしたい」→ プロセスを使う(メモリ空間を分けることで、あるプログラムが壊れても他を守る)
・「素早く一緒に動きたい」→ スレッドを使う(メモリ空間を共有するので、データのやり取りが速い)
たとえばWebブラウザでは、複数のタブをそれぞれ別プロセスで動かしているものがあります。あるタブがフリーズしても他のタブが続けて使えるのは、この仕組みのためです。一方、同じタブの中で「画面の描画」と「データの読み込み」を同時にこなすときはスレッドが活躍します。安全さが優先ならプロセス、速さと連携が優先ならスレッド、という選び方です。
複数のプロセスが同時に動いて見えるのは、OS(基本ソフト)がCPU(計算の中心)の使用時間を素早く切り替えているからです。この切り替えをコンテキストスイッチ(=実行中の状態を一時保存して別のプロセスへ移ること)と呼びます。
OSはプロセスごとに次の情報を管理しています。
・どこまで処理が進んでいるか(実行位置)
・どのメモリ空間を使っているか(独立したアドレス空間)
・今どんな状態か(実行中・待機中・停止中など)
スレッドも同様にOSが管理しますが、同じメモリ空間内にいるぶん切り替えのコスト(=かかる手間と時間)がプロセスより小さくなります。だから「大量の小さな並行処理」はスレッドのほうが効率的なのです。
Q1. プロセスとスレッドの関係として正しいものはどれか。
Q2. アドレス空間(メモリ空間)の共有について正しいものはどれか。
Q3. スレッドの利点として最も適切なものはどれか。