FE EXAM

プロセスとスレッド(実行単位の入れ子関係)

プログラムの実行単位であるプロセスと、その中でさらに細かく並行実行されるスレッドの関係。

DIAGRAM
プロセススレッド共有メモリ
プロセスA(独立したメモリ空間)共有メモリ空間プロセス内のスレッドが共通で使えるデータ領域スレッド1実行の流れスレッド2実行の流れスレッド3実行の流れ3つのスレッドが同じメモリ空間を共有して並行実行メモリ空間は分離プロセスB(別の空間)別の共有メモリ空間Aからは直接見えないスレッド1実行の流れ別プロセスは互いに干渉しない
解説

📌
プロセスとスレッドとは

プロセスの中にスレッドが入るプロセススレッドスレッドスレッド

プロセスとは、実行中のプログラムのことです。独立したメモリ空間(=データを置く領域)とリソースを持ちます。一方スレッドとは、プロセス内の実行の流れのことで、1つのプロセスは複数のスレッドを持てます。

身近な例で考えると、1軒の家(プロセス)と、その中で働く家族(スレッド)に似ています。家には専用のキッチンや道具(メモリ空間)があり、家族はそれを共有しながら、それぞれ別の作業を同時に進められます。別の家(別プロセス)の道具は勝手には使えません。

上の図解のように、1つのプロセス(青い枠)の中に複数のスレッド(オレンジ)が並び、それぞれが処理を進めます。スレッドはあくまでプロセスの中の存在であることを押さえておきましょう。

📌
アドレス空間の共有の有無

プロセスA共有メモリプロセスB別の共有メモリプロセス間は分離 / 内部スレッドは共有

プロセスとスレッドの最大の違いはメモリ空間(アドレス空間)を共有するかどうかです。
プロセス同士:メモリ空間が独立している(互いに干渉しない)
同一プロセス内のスレッド:メモリ空間を共有する(データを直接やり取りできる)

プロセス同士が独立しているのは安全のためです。あるプロセスが誤って別のプロセスのデータを書き換えてしまうと大混乱になるので、OSは互いのメモリに勝手に触れないようにしています。一方、同じプロセス内のスレッドは同じ空間を共有するため、わざわざデータをコピーしなくても直接やり取りできます。家族なら冷蔵庫の中身を共有できるが、隣家の冷蔵庫は開けられない、というイメージです。

📌
それぞれの利点

プロセスとスレッドは、それぞれ違った強みを持っています。メモリ空間を分けるか共有するかの違いが、そのまま利点の違いになります。

項目プロセススレッド
メモリ空間独立している同一プロセス内で共有する
生成のコスト重い(独自の空間が必要)軽量
独立性・安全性高い(1つ落ちても影響しにくい)低い(同じ空間を共有するため)
データのやり取り手続きが必要で遅め直接できて速い

プロセスの利点は独立性・安全性が高いことです。メモリ空間が分かれているため、1つのプロセスが異常終了しても他のプロセスに影響しにくく、システム全体が巻き込まれにくくなります。

一方スレッドの利点は、生成が軽量で、メモリ空間の共有により高速に協調動作できることです。同じデータを直接読み書きできるので、たとえば「ファイルを読み込みながら同時に画面を更新する」といった連携をスムーズに行えます。安全性を取るならプロセス、軽さと協調を取るならスレッド、と覚えると整理しやすいです。

📌
なぜ2つに分けるのか

プロセス独立・安全スレッド軽量・高速クラッシュしても他を巻き込まない同じデータをすばやく共有

なぜプロセスとスレッドの2種類があるのか。それはコンピュータが解決したい2つの課題があるからです。
「クラッシュが波及しないようにしたい」→ プロセスを使う(メモリ空間を分けることで、あるプログラムが壊れても他を守る)
「素早く一緒に動きたい」→ スレッドを使う(メモリ空間を共有するので、データのやり取りが速い)

たとえばWebブラウザでは、複数のタブをそれぞれ別プロセスで動かしているものがあります。あるタブがフリーズしても他のタブが続けて使えるのは、この仕組みのためです。一方、同じタブの中で「画面の描画」と「データの読み込み」を同時にこなすときはスレッドが活躍します。安全さが優先ならプロセス、速さと連携が優先ならスレッド、という選び方です。

📌
OSがプロセスを管理する仕組み

OS(管理者)プロセスAプロセスBプロセスCCPUを順番に割り当てて並行実行

複数のプロセスが同時に動いて見えるのは、OS(基本ソフト)がCPU(計算の中心)の使用時間を素早く切り替えているからです。この切り替えをコンテキストスイッチ(=実行中の状態を一時保存して別のプロセスへ移ること)と呼びます。

OSはプロセスごとに次の情報を管理しています。
どこまで処理が進んでいるか(実行位置)
どのメモリ空間を使っているか(独立したアドレス空間)
今どんな状態か(実行中・待機中・停止中など)

スレッドも同様にOSが管理しますが、同じメモリ空間内にいるぶん切り替えのコスト(=かかる手間と時間)がプロセスより小さくなります。だから「大量の小さな並行処理」はスレッドのほうが効率的なのです。

✏️
練習問題

Q1. プロセスとスレッドの関係として正しいものはどれか。

Q2. アドレス空間(メモリ空間)の共有について正しいものはどれか。

Q3. スレッドの利点として最も適切なものはどれか。

関連コンテンツ