プロセスの状態遷移

プロセスは以下の状態のいずれかをとる。CPU上で実行可能なプロセスはTASK_RUNNING状態になっている。複数あるTASK_RUNNING状態のプロセスのうち最も高いプライオリティを持つタスクにCPUが与えられる。

TASK_INTERRUPTIBLE、TASK_UNINTERRUPTIBLEは、共にある条件の成立を待って実行を中断している状態である。ディスクへのI/O要求を発行した後にI/Oが完了するのを待っている状態などである。この待ち状態に二つの状態が用意されているのは、待っている間にシグナルを送られたとき待ちを解除するか否かを制御するためである。TASK_INTERRUPTIBLE状態で待ちに入っているの場合は、強制的に起床される。

TASK_STOPPED状態は、サスペンドシグナル(SIGSTOPやSIGTTINなど〕を送られて実行中断状態になった状態を示す。この状態のプロセスはスケジューリングの対象とならない。リジュームシグナル(SIGCONT)が送られると、TASK_RUNNING状態に戻され、スケージューリングの対象となる。

TASK_ZOMBIE状態は、exitしてから消滅するまでの間のプロセス状態である。プロセスは死んだ後も親プロセスにwaitを実行してもらうまでは、TASK_ZOMBIE状態としてシステム内に存在し続ける。

linuxヘッダには定義されているがTASK_SWAPPINGという状態は、存在しない。linuxではページング処理のみ実装されており、プロセス全体をswapへ追い出す処理は存在しない。

状態 説明
TASK_RUNNING 実行可能状態
TASK_INTERRUPTIBLE 待ち状態。シグナル受信可能
TASK_UNINTERRUPTIBLE 待ち状態。シグナル受信不可
TASK_ZOMBIE ゾンビ状態。exit後の状態
TASK_STOPPED サスペンド状態
TASK_SWAPPING (swap状態は未実装)

linuxで定義されているプロセス状態に直行性がなく、実は待ち状態でかつサスペンド中という状態は存在しない。

linuxでは待ち状態のプロセスに、SIGSTOPなどを送るとサスペンド要求があったことを記録(保留)しておき、プロセスがTASK_RUNNINGになったときに、記録していた要求に従って、プロセスをTASK_STOPPEDに変化させる。

img3.gif

(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST
1