担当:青木義満 yaoki@sic.shibaura-it.ac.jp 情報工学科 3年生対象 専門科目 システムプログラミング 第6回 システムプログラミング概要 プロセスの生成 担当:青木義満 yaoki@sic.shibaura-it.ac.jp
システムプログラミングへの準備 システムコールとは? システムコールの仕組み,働きの理解
システムコールの役割 システムコール ライブラリ関数の行き着く先 例 printf関数 → writeシステムコールを呼び出し 画面に文字を表示 HDDにデータを書き込み ネットワークにデータを伝送 etc…..
Unixシステムの構成
1.カーネル層 メモリに常駐しているプログラム,ハードウェアとの接点,システム層以上の上位層をハードウェアに依存しない独立したものとする役割 ハードウェアを抽象化して統一的に扱える機構を提供 システム資源の管理 メモリ,入出力,ファイル,プログラム
2.システム層 Unixが動くのに最低限必要となるプロセス,ディレクトリ,ファイルから構成 あらかじめ用意されているソフトウェア群 シェル(CLI), GUIもここに属する
3.ユーティリティ層 ユーザにより,必要に応じて導入されるソフトウェア群 ソフトウェア開発用コマンド,テキスト文書作成,データ処理 等
4.ユーザ層 下位のユーティリティ,システム又はカーネル層の機能を用いて実現されるアプリケーションプログラムやシェルスクリプト 利用者自身の作成したプログラム,フリーソフトなど
カーネル+システム層まで カーネル層からユーティリティ層まで → オペレーティングシステム(OS) カーネル最小化の傾向へ → システムソフトウェア カーネル層からユーティリティ層まで → オペレーティングシステム(OS) カーネル最小化の傾向へ カーネル内のほとんどの機能をプロセスとして実現,カーネルから追い出し カーネルを軽くする カーネライズド・カーネル(核化したカーネル)
システムコールの役割 システム層以上のソフトウェアがカーネル層の機能を呼び出す カーネルが管理しているシステムのリソース(資源)をアクセスする手段 システムコール関数 write()の例 write自身が機能提供するわけではなく,単にカーネルを呼び出している 呼ばれたカーネル内で対応する処理を実行,結果をwrite()に返す システム層以上のソフトウェアとカーネル層との情報伝達手段 カーネル層の機能を呼び出して結果を得る カーネル層と上位層との間でデータ交換を行う機能を提供
システムコールの仕組み 例)ファイルからのデータ読み出し 2つの実行モード ユーザプログラムから直接ファイルアクセスしない システムコールに対応するカーネル層のプログラム 2つの実行モード ユーザプログラム自身のコードの実行 ユーザモード 2.カーネル層のプログラムコードの実行 カーネルモード
ユーザモードとカーネルモード カーネルモード ユーザモード 割り込みなどの例外が発生したときに制御が移るモード。 ユーザ,ユーティリティ,システム層のプログラム 直接,あるいは間接的にライブラリ関数を用いてシステムコールを呼ぶと,システムコール関数内で実行モードをカーネルモードに変更する命令を発令(trap命令:ソフトウェア割り込み)
システムコールの実行過程 OSがシステムコールに番号を割当て,これによりシステムコールを識別 手順 システムコール関数内で自分自身に割り当てられた番号をCPU毎に規定されている方法に従ってカーネル層に渡す カーネル層では,受け取ったシステムコール番号をインデックスとし,切り替え表を検索,実行
図3.2
システムコールの種類と機能 機能 ファイルの入出力 端末入出力 プロセスの生成と実行 シグナル処理 プロセス間通信
システムプログラミング プロセスの生成
システムコールの種類と機能 機能 ファイルの入出力 端末入出力 プロセスの生成と実行 シグナル処理 プロセス間通信
プロセスとは? 「プログラム」:実行形式ファイル プログラムを実行するには? いわゆる「プログラム」のみでは実行不可能! ユーザプログラムは直接or間接的にシステムコールを呼ぶ → カーネル内関数が必要 CPUやメモリ,ディスクなど,ハードウェア資源を割り当ててもらう必要 いわゆる「プログラム」のみでは実行不可能!
プロセスとは? 「プロセス」 プロセスモデル =プログラム+ソフトウェア資源+ハードウェア資源 (プログラムを実行する環境) =プロセッサ+実行環境(イメージ)から構成 プロセスモデル P:プロセッサ I:イメージ P I P I P I 初期状態 終了状態 ※プロセッサと作用するイメージの行動状態が時間的に変移
ユーザリングとカーネルリング 1つのプロセス 「リング切り替え」が起こる2事象 ユーザプロセス⇔カーネルプロセス 両者の切り替え(リング切り替え) 「リング切り替え」が起こる2事象 システムコール及び内部割込み からなるトラップ命令の呼び出しと復帰 ユーザプロセスでの割り込み (インタラプト,タイマーやハードウェア)
プロセスの木構造 UNIXプロセス プロセスの区別 fork()システムコールにより生成 親プロセスと子プロセス 親から生成された子プロセスは親の分身 exec()システムコールにより,別のプロセスへ変身 プロセスの区別 カーネルは各プロセスをプロセスID(PID)により識別
プロセスの生成と変身
プロセスの木構造 プロセス0:カーネルプロセス プロセス1:init システム起動時に生成される特別なプロセス プロセス1をfork()で生成後,スケジューラとなる プロセス1:init システムにおけるすべてのプロセスの先祖 initから始まるプロセス生成の繰り返しにより,プロセスの木構造を形成
実際のUNIXプロセス木
プロセスの状態 生成プロセスの生涯 定められた規則に従い,5つの状態を遷移 実行状態:現在CPUで実行中の状態 休眠状態:入出力の終了待ちなどで実行を継続できない状態 生成状態:fork()システムコールにより生成された状態 ゾンビ状態:exit()システムコールにより終了した状態
プロセスの状態遷移図 入力待ちにより実行状態→休眠状態へ CPU占有時間経過による実行状態→実行可能状態への遷移 他のプロセスへ実行権を譲る 多重プログラミング機能の実現 CPU占有時間経過による実行状態→実行可能状態への遷移 OSのTSS(Time Sharing System)機能の実現
プロセスの管理 プロセスIDとプロセスグループID プロセスID プロセスグループID プロセスを一意に識別するための番号 共通のプロセスを先祖に持つ複数のプロセスを親族とし,プロセスグループとして管理 例) ログインシェル → ウインドウを開く → コマンドを実行 ・・・・・
プロセスの優先度 実行可能状態にあるプロセスに対して優先度を定義 スケジューラにより,優先度の高い順に選択されて実行 カーネル プロセス優先度を自律的制御で刻々と変化 プロセス実行の機会均等を実現 優先度を変更するシステムコール nice()
端末上で動いているプロセスを表示してみよう ps コマンドでプロセスを表示 様々なオプション ps –ef でプロセスを表示してみる
子プロセスの生成 int 親プロセスの分身が子プロセスとして生成(PID)は異なる Fork()終了後,全く同じプロセスが平行して実行
親プロセスと子プロセスの切り分け forkの戻り値 0: 子プロセスに返される。子プロセスの動作を記述 1以上:子プロセスのプロセスIDが親プロセスに返される。親プロセスの動作を記述 -1: 親プロセスに返される。エラー処理 execシステムコールにより, 他プロセスに変身!
子プロセス生成後,親プロセスはwait()を呼んで子プロセスの終了を待つ 子プロセスの終了ステータス情報を得るため,引数statusをアドレス渡し 子プロセスの終了ステータス情報が,statusの指すintの領域の下位16ビットに格納 ステータス情報でわかること ・子プロセスが終了したのか,停止したのか ・子プロセスが終了した場合の終了の原因