プロセス ぷろせす
簡単に言うとこんな感じ!
プロセスは「実行中のプログラムの1インスタンス」のことだよ!レシピ(プログラム)を実際に料理している状態(プロセス)、って感じ。同じレシピで複数の鍋を同時に使えるように、同じプログラムを複数同時に動かすこともできるんだ!
プロセスとは
プロセス(Process) とは、OSが管理する「実行中のプログラムの単位」のことです。ファイルとして保存されているプログラム(実行ファイル)は、あくまで「命令書」にすぎません。それをOSが読み込んでCPUやメモリを割り当て、実際に動き出した状態がプロセスです。
プロセスには、プログラムのコードだけでなく、現在の実行状態(レジスタ値)・割り当てられたメモリ領域・開いているファイルの情報など、プログラムが動くために必要な一切がセットになっています。いわばプログラムに「魂を吹き込んだもの」です。
現代のOSでは、複数のプロセスが同時に動いています(マルチプロセス)。ブラウザを開きながらメール、音楽再生……これらはそれぞれ別のプロセスとして管理されており、OSがスケジューリングによってCPUの処理時間を公平に割り振ることで、見かけ上「同時に動いている」ように見せています。
プロセスの構造と状態
プロセスは、OSによって以下の要素を持つ実行単位として管理されます。
| 構成要素 | 説明 |
|---|---|
| PID(プロセスID) | OSがプロセスを識別するための番号。ユニークに割り当てられる |
| メモリ空間 | コード領域・データ領域・スタック・ヒープなど、プロセス専用の仮想メモリ |
| プログラムカウンタ | 次に実行する命令の場所(CPUレジスタに格納) |
| ファイルディスクリプタ | 開いているファイルやネットワーク接続の情報 |
| プロセス状態 | 現在の動作フェーズ(下表参照) |
プロセスの5つの状態
プロセスは生まれてから終わるまで、以下の状態を遷移します。
┌─────────┐ 生成 ┌─────────┐ スケジュール ┌─────────┐
│ 新規 │ ────────> │ 準備 │ ─────────────> │ 実行 │
│ (New) │ │ (Ready) │ <───────────── │(Running)│
└─────────┘ └─────────┘ 割り込み └────┬────┘
^ │
│ イベント発生 │ I/O待ちなど
│ v
┌────┴────┐ ┌─────────────┐
│ 終了 │ <────────── │ 待機 │
│(Exit) │ 終了要求 │ (Waiting) │
└─────────┘ └─────────────┘
覚え方:「新・準・実・待・終」
「新規作成 → 準備完了 → 実行中 → 待機 → 終了」と流れると覚えると、状態遷移が頭に入りやすいですよ!
歴史と背景
- 1960年代:IBMのOS/360などで「ジョブ(job)」という概念が登場。バッチ処理が主流で、1度に1つのプログラムを順番に動かしていた
- 1970年代:UNIXの登場により「プロセス」という概念が確立。
fork()システムコールでプロセスを複製する仕組みが生まれ、マルチプロセスの基礎が整う - 1980年代:パーソナルコンピュータの普及。MS-DOSはシングルタスクだったが、MacOSやWindows(初期)がマルチタスクを目指し始める
- 1990年代:Windows NTやLinuxが本格的なマルチプロセス・マルチタスクを実現。プロセス管理がOSの中核機能として確立
- 2000年代以降:マルチコアCPUの普及で真の並列実行が可能に。プロセスをより軽量に扱うスレッドやコンテナ(DockerなどのLinux名前空間)の技術が重要性を増す
プロセスとスレッドの違い
プロセスと混同しやすいのがスレッドです。スレッドは「プロセスの中でさらに分割できる実行単位」で、同じプロセス内ではメモリ空間を共有します。
| 比較項目 | プロセス | スレッド |
|---|---|---|
| メモリ空間 | 完全に独立 | プロセス内で共有 |
| 生成コスト | 重い(メモリ確保が必要) | 軽い |
| 独立性・安全性 | 高い(クラッシュが他に影響しにくい) | 低い(バグが全体に波及しやすい) |
| 通信方法 | IPC(パイプ、ソケット等) | 共有メモリ(直接アクセス) |
| 代表例 | Chromeの各タブ(マルチプロセス設計) | Webサーバの同時リクエスト処理 |
コンテナとの関係
Dockerなどのコンテナ技術は、Linuxの「名前空間(namespace)」という機能を使って、プロセスの見える範囲を分離したものです。仮想マシンとは異なり、ホストOSのカーネルを共有しているため「軽量な仮想化」とも呼ばれます。本質的にはプロセスの分離技術の延長線上にあります。
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| RFC 8194 | YANG モデルを使ったプロセス管理インタフェースの定義 |
関連用語
- スレッド — プロセス内の軽量な実行単位。メモリを共有して並行処理を行う
- OS(オペレーティングシステム) — プロセスの生成・スケジューリング・終了を管理するソフトウェア
- マルチタスク — 複数のプロセスやスレッドを見かけ上同時に実行する仕組み
- コンテキストスイッチ — CPUが別のプロセスに切り替わる際に現在の状態を保存・復元する処理
- メモリ管理 — OSがプロセスにメモリを割り当て・回収する仕組み
- コンテナ — プロセスの名前空間を分離して軽量な仮想実行環境を実現する技術
- IPC(プロセス間通信) — 独立したプロセス同士がデータをやり取りするための仕組み
- デーモン — バックグラウンドで常駐して動き続けるプロセスの一種