kernel:"process" (2) processの状態

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