processの状態
- processが生成されると、まず待ち状態となる
実行待ち | TASK_RUNNING | kernelからCPUリソースが割り当てられるまでprocessは待ち状態となる |
実行中 | TASK_RUNNING | kernelがCPUリソースを割り当てると、processは実行中の状態となる/割り当てられたCPU時間が経過すると、processは中断し再度待ち状態となる |
終了 | TASK_ZOMBIE | processは実行待ちと実行中の状態を繰り返し往復(中断/再開)し、処理が終了するとprocessは利用していたリソース(確保していたメモリ領域やレジスタ情報など)を解放して終了状態となる |
- 終了状態となったprocessはkernelによって消滅の処理がされる
イベント待ち | TASK_INTERRUPTIBLE, TASK_UNINTERRUPTIBLE, TASK_STOPPED | processが実行中にイベント待ち(ネットワークからのデータ待ちや、ディスクアクセスなど)となった場合には割り当てられているCPU時間を消費する前にprocessからCPUを解放してイベント待ち状態となる/イベント待ち状態となっているprocessに対してイベントが発生すると、processは再度 実行待ちの状態となる |
Linuxにおけるprocessの状態
状態 | 状態名 | STAT |
---|---|---|
実行中 | TASK_RUNNING | R |
実行待ち | TASK_RUNNING | R |
イベント待ち | TASK_INTERRUPTIBLE | S |
イベント待ち | TASK_UNINTERRUPTIBLE | D |
イベント待ち | TASK_STOPPED | T |
終了 | TASK_ZOMIE | Z |
- TASK_INTERRUPTIBLE:割り込みによる中断可能なイベント待ち状態
- TASK_UNINTERRUPTIBLE:割り込みによる中断不可能なイベント待ち状態
- TASK_STOPPED:デバッガによる停止のためのイベント待ち状態
processの状態は"ps"コマンドで確認することができる
[root@tkcent1 ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.3 0.0 10316 656 ? Ss 00:17 0:00 init [3] root 2 0.0 0.0 0 0 ? S< 00:17 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S< 00:17 0:00 [migration/0] root 4 0.0 0.0 0 0 ? S< 00:17 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S< 00:17 0:00 [watchdog/0] root 6 0.0 0.0 0 0 ? S< 00:17 0:00 [events/0] root 7 0.0 0.0 0 0 ? S< 00:17 0:00 [khelper] root 65 0.0 0.0 0 0 ? S< 00:17 0:00 [kblockd/0] root 68 0.0 0.0 0 0 ? S< 00:17 0:00 [kacpid] root 69 0.0 0.0 0 0 ? S< 00:17 0:00 [kacpi_notify] root 138 0.0 0.0 0 0 ? S< 00:17 0:00 [cqueue/0] root 140 0.0 0.0 0 0 ? S< 00:17 0:00 [ksuspend_usbd] root 146 0.0 0.0 0 0 ? S< 00:17 0:00 [khubd] root 149 0.0 0.0 0 0 ? S< 00:17 0:00 [kseriod] root 195 0.0 0.0 0 0 ? S 00:17 0:00 [pdflush] root 196 0.0 0.0 0 0 ? S 00:17 0:00 [pdflush] root 197 0.0 0.0 0 0 ? S< 00:17 0:00 [kswapd0] root 198 0.0 0.0 0 0 ? S< 00:17 0:00 [aio/0] (以下、省略)
- Linuxの実行には非常に多くのprocessが実行される
- Linuxではprocess同士を関連づけることによって管理性を確保している
- 関連づけには、「親子関係」と「プロセスグループ」の2種類がある
processの親子関係
- processには必ず自身を生成したprocessが存在し、そのprocessと親子関係を持つ
- processを生成した側を"親process"、生成された側を"子process"と呼ぶ
- 同じprocessから生成されたprocess同士は兄弟関係を持つ
- 親processが管理するのは最後に生成したprocessのみであり、process間のつながりは兄弟関係をたどることにより管理することができる
- すべてのprocessの大元となる親プロセスは"init"
processの親子関係を確認する
[root@tkcent1 ~]# pstree -p init(1)─┬─acpid(2762) ├─anacron(2899) ├─atd(2913) ├─auditd(2296)─┬─python(2298) │ └─{auditd}(2297) ├─automount(2739)─┬─{automount}(2740) │ ├─{automount}(2741) │ ├─{automount}(2744) │ └─{automount}(2747) ├─avahi-daemon(2944)───avahi-daemon(2945) ├─crond(2859) ├─cupsd(2777) ├─dbus-daemon(2608)───{dbus-daemon}(2609) ├─dhclient(1970) ├─dhclient(2179) ├─gpm(2844) ├─hald(2960)───hald-runner(2961)─┬─hald-addon-keyb(2972) │ └─hald-addon-stor(2980) ├─hcid(2624) ├─klogd(2319) ├─mcstransd(2354) ├─mingetty(3022) ├─mingetty(3023) ├─mingetty(3024) ├─mingetty(3025) ├─mingetty(3026) ├─mingetty(3027) ├─pcscd(2701)───{pcscd}(2714) ├─portmap(2376) ├─restorecond(2280) ├─rpc.idmapd(2443) ├─rpc.statd(2401) ├─sendmail(2819) ├─sendmail(2828) ├─smartd(3019) ├─sshd(2795)───sshd(3093)───sshd(3095)───bash(3096)───su(3124)───bash(3125)───pstree(3516) ├─syslogd(2316) ├─udevd(458) ├─vmware-guestd(2580) ├─xfs(2884) └─yum-updatesd(2928)
プロセスグループ
- 1つの処理を実行するためのprocessの集まりをプロセスグループと呼ぶ
- プロセスグループには、代表となるprocessとして"プロセスグループリーダー"が設定される
プロセスグループを確認する
- processをパイプ処理で実行して[Ctrl+Z]でprocessを停止、jobsコマンドで現在実行されているprocessのprocess idを確認しプロセスグループリーダーを確認する
[root@tkcent1 ~]# find * / | grep *.log install.log install.log.syslog [1]+ Stopped find * / | grep *.log [root@tkcent1 ~]# jobs -l [1]+ 3675 停止しました find * / 3676 | grep *.log [root@tkcent1 ~]# jobs -p 3675