ゾンビ状態

プロセスの実行とプロセスの状態
プロセスの実行とプロセスの状態











OSによるプロセス抽象化機構
OSが実現するプロセス抽象管理層
OSの内部機構から見たプロセス生成
プロセステーブル
プロセスのスケジューリングと割込み
カーネルのタスク管理フロー
プロセスのスケジューリングと保護メカニズム
プロセスの実行時間の計測
プロセスの状態遷移モデル
ゾンビ状態
ゾンビ状態の発生
プロセスの実行とプロセスの状態
OSによるプロセス抽象化機構
プロセス抽象
アドレス
空間
仮想 ・・・
CPU
プロセス抽象
アドレス
空間
仮想
CPU
アプリケーション層
OS
プロセス抽象化機構
ハードウェア層
主メモリ
CPU
プロセスの実行とプロセスの状態
OSが実現するプロセス抽象管理層



アプリケーション層
 アドレス空間は仮想マシンのメモリ。
 仮想マシンのCPUは、システム
コールによって拡張されたユーザ
モード命令
プロセス管理層
 プロセスを構成するためのメカニ
ズム、データ構造の集合
 単一物理マシン上で複数の仮想マ
シンの実行を多重処理する
 プロセスの生成(fork)、削除(exit)、
同期(wait)、保護ができる機能を提
供する
ハードウェア層
 PC(プログラムカウンタ)のアドレ
スで指定されたメモリ位置から命
令をフェッチし、実行する繰返し
プロセス抽象
プロセス抽象
アドレス 仮想 ・・・アドレス 仮想
空間
空間
CPU
CPU
アプリケーション層
タイマ、 保護
IPC
割込み メカニズム
スケジ
ューラ
プロセス管理層
ハードウェア層主メモリ
CPU
プロセス
構造体
プロセスの実行とプロセスの状態
OSの内部機構から見たプロセス生成






プロセス記述子(構造体オブジェクト)の作成
カーネル空間にスタック生成
親の記述子を子へコピー
記述子を子固有の値に修正(PID,子、親、兄弟との
リンク、プロセス生成時間)
(必要に応じて)親が参照していたデータ構造のコ
ピー(オープンファイル記述子、データセグメント、シ
グナル、仮想メモリテーブル)
子の状態を実行可能状態にする
プロセスの実行とプロセスの状態
プロセステーブル



プロセス記述子の集合
プロセス状態に依存して
いくつかのリストとリンク
を持つ
(例)入出力完了待ちの
プロセスは、デバイスか
らの割込み待ちリストに
入る
プロセス1,2,3,…
プロセス記述子
state
struct task_struct
Next_task
pid
fs
files
mm
sig
nice
….
プロセステーブル
プロセスの実行とプロセスの状態
プロセスのスケジューリングと割込み
スケジューラ

実行可能プロセスの中
で最も優先度の高いプ
ロセスにCPUを割当てる
カーネル関数
schedule()

ret_from_sys_callコードブ
ロックの一部として実行
される
割込み処理
ハード
ウェア
プロセス
アイドル
プロセス
スケジューリ
ング
CPU時間
カーネル
ISR
プロセス プロセス
2
1
プロセスの実行とプロセスの状態
カーネルのタスク管理フロー
タスクの実行
トラップ(システムコール)時


対応するカーネルタスク実行
復帰時に累積ジョブの割振り
( ret_from_sys_callコード)

ペンディングのシグナル処理

ペンディングの割込み処理(ボ
トムハーフ)

他のタスクのスケジューリング
割込み時



IRQに対応するISRを実行
速い割込み

処理時間が短い。

処理中は他の割込みは無効
遅い割込み

ボトムハーフを持つ

ret_from_sys_callコードを実行
トラップ
IRQ
システムコール
ISR
速い
遅い
必要であれば
ボトムハーフを
スケジュール
カーネルタスク
(システム関数)
を実行
システムコール
からの復帰
タスクの実行を継続
新しいタスクを
スケジュール
プロセスの実行とプロセスの状態
プロセスのスケジューリングと保護メカニズム
アドレス空間の分離


プロセス独自のアドレス空
間
他プロセスから読み書き出
来ない
ファイルの保護


各ファイルは、ユーザ(uid)、
グループ(gid)を持つ
読取り、書込み、実行の権
限が設定される
ハード
ウェア
プロセス
割込み処理
アイドル
プロセス
カーネル
ISR
プロセス プロセス
2
1
スケジュー
リング
CPU時間
プロセスのスケジューリングと割込み
プロセスの実行とプロセスの状態
プロセスの実行時間の計測
#include <stdio.h>
#include <stdlib.h>
time_t start, end;
int main()
{
elapse_time.c
$ gcc elapse_time.c -o elapse_time
$ ./elapse_time
elapsed time= 5 seconds
$
time(&start); // start
sleep(5);
time(&end); // stop
printf("elapsed time= %d seconds\n",end-start);
return EXIT_SUCCESS;
}
プロセスの実行とプロセスの状態
プロセスの状態遷移モデル
ユーザモード
実行中
システムコール
割込み
実
行
カーネルモード 終
了 ゾンビ状態
実行中
スリープ状態
実行可能状態
ユーザモード
実行中
システムコール
割込み
実
行
カーネルモード 終
了 ゾンビ状態
実行中
スリープ状態
実行可能状態
OSによるプロセス管理と時間多重化、
メモリ管理と空間の多重化
プロセスの実行とプロセスの状態
ゾンビ状態
親
start
ゾンビ
子

start
fork()

exit()
ゾンビ状態
wait()
end

プロセス自体は消滅している
が、プロセステーブルが開放
されていない状態
子プロセスは、実行終了後、
親プロセスに終了したことを通
知するシグナルを送りゾンビ
状態になる。
親プロセスは、waitシステム
コールを実行すると、子プロセ
スは完全になくなる
プロセスの実行とプロセスの状態
ゾンビ状態の発生
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
zombie.c
% ./zombie &
% ps l
F UID PID …
000 1000 … ./zombie
044 1000 … [zombie <defunct>]
…
% return code=1
+Done ./zombie
if (fork()==0) {
exit(EXIT_FAILURE);
} else {
sleep(10);
wait(&i);
printf("return code=%d\n",WEXITSTATUS(i));
}
return EXIT_SUCCESS;
}