プロセス基礎

PID、fork/exec、プロセスのライフサイクル

PID(プロセスID)

各プロセスには一意のPID(Process ID)が割り当てられます。 PID 1はinit/systemd、PID 0はスワッパー(カーネル)です。

PID

プロセス自身のID

PPID

親プロセスのID

PGID

プロセスグループID

SID

セッションID

1# 自プロセスのPID
2echo $$
3
4# プロセス情報確認
5ps -p $$ -o pid,ppid,pgid,sid,comm

fork/exec モデル

親プロセス
↓ fork()
親(継続)
子(コピー)
↓ exec()
新プログラム

fork()

  • • プロセスを複製
  • • 子はメモリの完全コピー(CoW)
  • • 親は子のPIDを、子は0を返す

exec()

  • • 現プロセスを新プログラムで置換
  • • PIDは変わらない
  • • メモリイメージを入れ替え

Copy-on-Write(CoW)

fork時に実際にメモリをコピーせず、書き込みが発生した時点でコピーする最適化。 読み取り専用ページは親子で共有され、メモリ効率と性能が向上します。

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

  1. 1生成: fork()で親プロセスからコピー
  2. 2実行準備: exec()で新プログラムをロード
  3. 3実行: スケジューラによりCPU時間を取得
  4. 4終了: exit()または致命的シグナル
  5. 5回収: 親がwait()で終了状態を取得

ゾンビプロセスとオーファンプロセス

ゾンビプロセス(Z)

  • • 子が終了したが親がwaitしていない
  • • プロセステーブルのエントリのみ残る
  • • 親のバグまたは設計ミス
  • • 親終了でinit/systemdが回収

オーファンプロセス

  • • 親が先に終了した子プロセス
  • • init/systemd(PID 1)が養子に
  • • 正常にwaitされる
  • • デーモン化で意図的に作成
1# ゾンビプロセス検出
2ps aux | awk '$8=="Z"'
3
4# ゾンビの親プロセス特定
5ps -eo pid,ppid,stat,cmd | grep 'Z'

プロセス操作コマンド

1# プロセス詳細
2ps aux
3# USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
4
5# 特定プロセス
6ps -p 1234 -o pid,ppid,%cpu,%mem,cmd
7
8# プロセスツリー
9pstree -p
10
11# /proc からプロセス情報
12ls /proc/1234/
13cat /proc/1234/status
14cat /proc/1234/cmdline
15
16# ファイルディスクリプタ
17ls -l /proc/1234/fd/
18
19# メモリマップ
20cat /proc/1234/maps

SRE/インフラ観点

プロセス数制限(ulimit)

  • ulimit -u: ユーザーあたりの最大プロセス数
  • /etc/security/limits.confで永続設定
  • • fork爆弾対策として重要