オペレーティングシステム 其の四 20170510
指定教科書で言うとp18~p28、p36~p39あたりだそうです.
プロセスを高速で切り替えることにより同時に複数のプロセスを実行しているように見せる.また、このことを「平行に実行する」といい、通常並列でないものを並列のように実行させることをいう.
そもそもレジスタがたくさんあるマシンでは最初から並列化が可能なので「平行」なんていう表現はせずに「並列に実行」と表現する.
この時に実行するプロセスの順番などはのちの講義で扱う「スケジューラ機能」を用いている.
プロセスの始まりと終わり
・生成:コマンド(popenコマンド)で、ダブルクリックでなどいろいろあるが実質同じ処理をしているのと同じなので、本質的には生成は一つの方法でしているといえる.
・終了:この方法には
①正常終了
②異常終了
③タスクマネージャー等の他アプリケーションによる強制終了
の3種類が存在する.
プロセスの親子関係
プロセスによってほかのプロセスを生成することができる.この時、生成したほうを「親」、されたほうを「子」と呼ぶ.
⇒プロセス間には樹形図(tree)的な関係が存在することがわかる.
プロセスとプログラム
実行ファイルそのものを「プログラム」.現在実行されているプログラムのことを「プロセス」と呼び分けている.
プロセスが処理を行うために必要なデータ、メモリなどの総称を「リソース」とする.
プロセスの提供する実行環境
・プロセスごとに仮想CPUがあるかのようにふるまう
⇒プロセスは仮想的に自分専用のレジスタとメモリを持っている
・割り込み処理の「退避・復帰」をプロセス間に適応することにより、仮想CPUを実現している.
・実行状態にあることを「コンテキスト」と呼ぶのにあやかって、プロセス間における「退避・復帰」のことを「コンテキストスイッチ」と呼ぶ.
⇒プロセス同士の分離を実現
プロセスの仮想メモリについて
「コード」「データ」「ヒープ(malloc関数で動的に確保する用のメモリ)」「スタック」領域に分けることができる.
コンテキストスイッチが発生するとプロセスAの仮想メモリとプロセスBのそれを総とっかえする.この仕組みについては第10回くらいの講義で説明.
ソースコードからプロセスになるまで
基本的な流れは
①ソースコードをコンパイルすることにより実行可能ファイルを生成
②実行可能ファイルをもとにプロセスに必要なメモリ領域を確保する
③プロセスになる(ここは詳しく講義では触れませんでした)
の3ステップ.
ローカル変数は新鮮さを保つためにスタック領域に格納される.
デバッガを利用することによって実行中のメモリを確認することができる.
今度はOS側からプロセスについて考えてみる
「プロセステーブル」というものの中に「プロセス構造体」がプロセスの数だけ存在し、その構造体の中にはプロセスを構成するための情報が入っている.
構造体についてはC言語のそれと大差ない.情報を馬鹿正直に上からならべたものがプロセス構造体.
プロセステーブル
⇒プロセス構造体1
→プロセス管理情報
→メモリ情報
→ファイル情報
⇒プロセス構造体2
…
のような構造になっている.
プロセス構造体について
①プロセス管理情報
・コンテキストスイッチでデータを退避させる先
・IDや親子関係
・スケジューリング
②メモリ情報
・データの場所やそのサイズ
③ファイル情報
・ファイルの読み込み位置
・開いているファイルの情報
上の情報はすべて「リソース」になっている.
プロセステーブルがプロセスを終了させるとき
①ファイル情報を見てファイルをすべて閉じる
②メモリ情報を見て、メモリを解放
③プロセス構造体を解放
の3ステップでプロセスは終了される.