プロセスの実行とプロセスの状態 プロセスの実行とプロセスの状態 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; }
© Copyright 2024 ExpyDoc