プロセス基礎
PID、fork/exec、プロセスのライフサイクル
PID(プロセスID)
各プロセスには一意のPID(Process ID)が割り当てられます。 PID 1はinit/systemd、PID 0はスワッパー(カーネル)です。
PID
プロセス自身のID
PPID
親プロセスのID
PGID
プロセスグループID
SID
セッションID
1 # 自プロセスのPID 2 echo $$ 3 4 # プロセス情報確認 5 ps -p $$ -o pid,ppid,pgid,sid,comm
fork/exec モデル
親プロセス
↓ fork()
親(継続)
子(コピー)
↓ exec()
新プログラム
fork()
- • プロセスを複製
- • 子はメモリの完全コピー(CoW)
- • 親は子のPIDを、子は0を返す
exec()
- • 現プロセスを新プログラムで置換
- • PIDは変わらない
- • メモリイメージを入れ替え
Copy-on-Write(CoW)
fork時に実際にメモリをコピーせず、書き込みが発生した時点でコピーする最適化。 読み取り専用ページは親子で共有され、メモリ効率と性能が向上します。
プロセスのライフサイクル
- 1生成: fork()で親プロセスからコピー
- 2実行準備: exec()で新プログラムをロード
- 3実行: スケジューラによりCPU時間を取得
- 4終了: exit()または致命的シグナル
- 5回収: 親がwait()で終了状態を取得
ゾンビプロセスとオーファンプロセス
ゾンビプロセス(Z)
- • 子が終了したが親がwaitしていない
- • プロセステーブルのエントリのみ残る
- • 親のバグまたは設計ミス
- • 親終了でinit/systemdが回収
オーファンプロセス
- • 親が先に終了した子プロセス
- • init/systemd(PID 1)が養子に
- • 正常にwaitされる
- • デーモン化で意図的に作成
1 # ゾンビプロセス検出 2 ps aux | awk '$8=="Z"' 3 4 # ゾンビの親プロセス特定 5 ps -eo pid,ppid,stat,cmd | grep 'Z'
プロセス操作コマンド
1 # プロセス詳細 2 ps aux 3 # USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 4 5 # 特定プロセス 6 ps -p 1234 -o pid,ppid,%cpu,%mem,cmd 7 8 # プロセスツリー 9 pstree -p 10 11 # /proc からプロセス情報 12 ls /proc/1234/ 13 cat /proc/1234/status 14 cat /proc/1234/cmdline 15 16 # ファイルディスクリプタ 17 ls -l /proc/1234/fd/ 18 19 # メモリマップ 20 cat /proc/1234/maps
SRE/インフラ観点
プロセス数制限(ulimit)
- •
ulimit -u: ユーザーあたりの最大プロセス数 - •
/etc/security/limits.confで永続設定 - • fork爆弾対策として重要