プロセスとスレッド — 作業部屋と、その中で働く作業員

概要 — まず全体をつかむ

パソコンやスマホは、たくさんの処理を同時に進めているように見えます。それを支えるのがプロセススレッドという2つの単位です。

詳細 — 1段階ずつ追う

これは何をする係?

  • プロセス実行中のプログラム1つ分です。アプリを起動すると、そのアプリ用のプロセスが生まれます。プロセスは自分専用のメモリ領域を持って動きます。
  • スレッド — プロセスの中で並行して走る、作業の筋です。1つのプロセスの中に、複数のスレッドを持てます。

たとえるなら、1つの作業部屋(プロセス)の中で、複数の作業員(スレッド)が同時に働くイメージです。部屋がプロセス、そこで手分けして働く一人ひとりがスレッドです。

登場人物メモ:

  • ※1 メモリ領域 — プログラムが計算に使う作業机のような場所
  • ※2 並行 — いくつもの作業を、同時進行で進めること
この部分をもっと深く(中級

同じ「同時に処理を進める」でも、プロセスとスレッドではメモリの扱いが正反対です。

  • プロセスは独立 — 互いにメモリが分離されています。他プロセスの領域は見えないので安全ですが、その分、切り替えや情報の受け渡しが重い
  • スレッドは共有 — 同一プロセス内では同じメモリを共有します。データの受け渡しが要らず速いが、同じ場所を同時にいじると競合が起きます。
アニメーション『プロセスとスレッド』を開く
プロセスA独立したメモリ空間スレッド1スレッド2スレッド3共有メモリ(ヒープ・グローバル変数など)↑ 同一プロセス内のスレッドが共有プロセスB独立したメモリ空間スレッド1スレッド2スレッド3共有メモリ(ヒープ・グローバル変数など)↑ 同一プロセス内のスレッドが共有隔離互いに見えないプロセスは独立(メモリを隔離)/スレッドは同一プロセス内でメモリを共有

つまり「分離=安全だが重い/共有=速いが危うい」という対の性質です。

登場人物メモ:

  • ※1 コンテキストスイッチ — CPUが処理対象を素早く切り替える動作。切り替えには手間(コスト)がかかる
  • ※2 排他制御 — 共有データを一度に1つだけが触れるようにする仕組み(ロックなど)

仕事の流れ

  1. アプリを起動すると、そのアプリのプロセスが生まれる
  2. プロセスは自分専用のメモリ領域を割り当てられる
  3. プロセスの中で、必要に応じてスレッドが作られる
  4. 複数のスレッドが手分けして並行に働き、処理を進める
この部分をもっと深く(中級
  1. CPUは、一度に扱える処理の本数に限りがある
  2. そこでコンテキストスイッチ※1 で、処理対象を高速に切り替える
  3. 人間から見ると、多数の処理が同時に進んでいるように見える
  4. 切り替えの判断(誰に、いつCPUを渡すか)はOSのスケジューラが行う

この「素早く切り替えて同時に見せる」土台は、CPU の動き方そのものです。

なぜ分けるの?

理由は、同時にいくつもの処理を進めたいからです。

たとえば動画アプリなら、「映像を表示する」「音を鳴らす」「操作を受け付ける」を同時に進めたい。1つの作業員が順番に全部やると、どれかで詰まると全体が止まります。複数の作業員(スレッド)で手分けすれば、1つが忙しくても他が動けます。

また、アプリごとに部屋(プロセス)を分けるのも大事です。部屋が分かれていれば、あるアプリが転んでも、隣のアプリの作業机を巻き込みにくくなります。

こうした部屋の割り当てや作業員の順番決めは、OSとアプリ の「世話役」であるOSが裏で管理しています。

この部分をもっと深く(中級

並行(concurrent)と並列(parallel)は違います。

  • 並行 — 1つのCPUが素早く切り替えて、複数の処理を代わる代わる進める(同時に見えるが、瞬間瞬間は1つ)
  • 並列 — 複数のCPUコアが、本当に同じ瞬間に別々の処理を実行する

なぜ共有メモリは便利で危険なのか。 スレッドが同じメモリを共有できると、データの受け渡しが速く便利です。しかし、2つのスレッドが同じデータを同時に読み書きすると、結果が実行の巡り合わせで変わってしまう——これが競合状態(レースコンディション)です。

防ぐには排他制御(ロック)※2 を使い、共有データを一度に1つのスレッドだけが触れるようにします。ただしロックの掛け方を誤ると、互いに相手のロックを待って止まるデッドロックを招くこともあります。速さと安全は、ここでも綱引きになります。

⚠️ うまくいかないとき

  • 1つのアプリが固まる — そのプロセスの作業が詰まり、応答しなくなる
  • 作業員の取り合い — スレッドが増えすぎて、かえって切り替えに手間取る
  • 同じ机を同時にいじる — 作業員たちが同じ場所を同時に書き換え、記録が壊れる
  • 部屋を閉じ忘れる — 使い終わったプロセスが残り、メモリを無駄に占有する

中級では、「部屋(プロセス)を分ける安全さ」と「作業員(スレッド)が机を共有する速さ」のトレードオフを詳しく見ます。

この部分をもっと深く(中級
  • 競合状態 — 共有データの同時書き換えで、結果が不定になる
  • デッドロック — 複数スレッドが互いのロックを待ち続けて止まる
  • 切り替えコスト過多 — スレッドを増やしすぎ、コンテキストスイッチばかりで遅くなる
  • 1プロセスの巻き添え — 共有メモリゆえ、あるスレッドの暴走が同プロセス全体を壊す

なお、プロセスごとにメモリを分離するこの隔離の考え方は、Linux のコンテナが「プロセスを箱に閉じ込めて独立させる」土台にもつながっています。独立と共有の使い分けは、OSの根っこにある設計思想です。

関連する知識

理解度チェック

そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。

1. 「スレッド」を一言でいうと?

2. このユニットのたとえで、「作業部屋」と「作業員」は何を表す?

3. アプリごとにプロセス(部屋)を分ける利点は?

4. プロセスへのメモリ割り当てや、スレッドの順番決めを裏で管理しているのは?

5. いくつもの作業を同時進行で進めることを、漢字2文字で何という?

6. プログラムが計算に使う「作業机のような場所」を、カタカナで何という?

7. 「プロセス」を一言でいうと?

8. プロセスとスレッドの関係として正しいのは?