基礎●●○○○

プロセス

実行中のプログラムを表すOSの管理単位。独立したメモリ空間を持つ。

概要

プロセスとは「実行中のプログラム」を表すOSの管理単位です。プログラムはディスク上ではただの実行ファイルにすぎませんが、起動されるとOSがメモリ空間・CPU時間・ファイルなどの資源を割り当て、「プロセス」として生きた存在になります。同じプログラムを2回起動すれば、独立した2つのプロセスができます。

プロセスの最大の特徴は「隔離」です。各プロセスは自分専用の仮想メモリ空間を持ち、他のプロセスのメモリを直接読み書きすることはできません。ブラウザがクラッシュしてもエディタは無事なのは、この隔離のおかげです。ターミナルで pstop を打ったときに並ぶ一行一行が、いままさに動いているプロセスたちです。

なぜ生まれたか

OSが複数のプログラムを同時に走らせようとしたとき、根本的な問題が2つありました。1つは「プログラムを切り替えるとき、実行途中の状態(CPUレジスタの値や作業中のメモリ)をどう保存・復元するか」。もう1つは「あるプログラムのバグや悪意が、他のプログラムやOS本体を壊さないようにどう守るか」です。

この2つを同時に解決する抽象が「プロセス」でした。実行状態を丸ごと1つの管理単位にまとめれば、OSは任意のタイミングで切り替え(コンテキストスイッチ)ができます。さらに各プロセスに独立した仮想メモリ空間を与えれば、他人のメモリには物理的に手が届かなくなります。「実行の単位」と「保護の単位」を一体にしたこの設計が、マルチタスクOSの安定性の土台になりました。

詳細

プロセスが持っているもの

プロセスは単なる「動いているコード」ではなく、資源の入れ物です。具体的には、プログラムコードとデータを載せた仮想メモリ空間(コード領域・ヒープ・スタックなど)、開いているファイルやソケットの一覧(ファイルディスクリプタ)、環境変数、実行ユーザーの権限、そしてプロセスID(PID)を持ちます。OSはこれらをまとめて管理し、プロセスの終了時に一括で回収します。プログラムがファイルを閉じ忘れても終了すればOSが後始末してくれるのは、この仕組みのおかげです。

プロセスのライフサイクル

プロセスには一生があります。親プロセスから生成され(UNIXでは fork/exec)、CPUを割り当てられて「実行中」と「待ち」を行き来し、終了すると終了コードを親に返します。この一生は状態遷移として整理すると見通しがよくなります。

親が fork で生成

スケジューラが CPU を割り当て

割り当て時間を使い切る

入出力の完了を待つ

入出力が完了

exit で終了コードを返す

親が wait で回収

実行可能

実行中

待機

ゾンビ

シェルでコマンドを打つたびに、実はこの流れが裏で起きています。シェル自身が親プロセスとなり、fork と exec でコマンドのプロセスを生み、終了を待って次のプロンプトを出しているのです。

プロセス間通信と並行処理

隔離されているがゆえに、プロセス同士が協力するには専用の通信手段(IPC: プロセス間通信)が必要です。パイプ(ls | grep|)、シグナル(kill コマンド)、共有メモリ、そしてソケットが代表です。ネットワーク越しの通信も突き詰めれば「別マシンのプロセスとのIPC」であり、マイクロサービスメッセージキューはプロセス間通信をシステム全体の設計原理にまで広げたものと見ることができます。

並行処理の単位としては、プロセスとスレッドの使い分けが古典的な設計判断です。プロセスは隔離が強く安全ですが、生成やコンテキストスイッチが重く、メモリも共有できません。かつてのApacheのように「リクエストごとにプロセスを割り当てる」モデルは堅牢ですが、大量接続には向きませんでした。現代のサーバソフトウェアは、複数プロセス+各プロセス内でスレッドやイベントループを併用するハイブリッド構成が主流です。

実務での顔: コンテナ、ワーカー、ゾンビ

実務でプロセスの概念が直接顔を出す場面は多くあります。コンテナの実体は「Linuxカーネルの機能で隔離を強化されたプロセス」であり、仮想マシンのような別物ではありません。だからこそ軽量で一瞬で起動します。また、GunicornやPM2のような本番運用ツールは「マスタープロセスが複数のワーカープロセスを管理し、死んだら再起動する」というプロセス管理そのものです。

落とし穴も知っておく価値があります。親が終了を回収しないまま子が死ぬと「ゾンビプロセス」としてプロセステーブルに残り続けます。メモリを確保しすぎたプロセスはLinuxのOOM Killerに強制終了させられ、「アプリが突然消えた」障害の定番原因になります。監視でプロセス数やメモリ使用量を追うのは、こうした事態を早期に察知するためです。