プロセスとは?
実行されるプラグラムの単位。
例
- Webブラウザ
- 電子メールリーダー
- Excel
- テキストエディタ
並列処理と並行処理
- OSは、複数のプロセスの生成・実行・消滅を管理し、プロセスの「並行処理」を実現する。(マルチプログラミング、マルチタスク)
- 複数のプロセスを、複数のプロセッサで実際に同時に実行することを「並列処理」という。(ややこしい、、)
プリエンプション
プロセスは、入出力をもつものが多いので、入出力まち状態のときにプロセスを切り替えることで、上記の「並列処理」を実現できる。
しかしこれでは、入出力がないプロセスでは、そのプロセスが終わるまで他のプロセスにプロセッサを割り当てられない、、
↓
プロセスの「割り込み」によって解決。このOSの仕組みを「プリエンプション」という。
逆に、プロセス自身が明示的に「もういいよ、次の人(プロセス)に変わってあげる」とOSに制御を渡す仕組みのことを「ノンプリエンプティブ」という。
プロセスの構造
OSではプロセスをどのような構造で扱っているのか??
- プログラムを、コンパイラでプロセッサが理解できる機械語に変換
- 機械語に変換されたプログラム(オブジェクトプログラム)をもとにプロセスを生成
プロセスのメモリ構造
・コード領域 (静的)
オブジェクトプログラムに相当。
・データ領域(静的)
プログラムを実行する際にはじめから存在し、プログラム全体で利用されるデータを入れる領域。
プログラム全体で利用されるデータを入れる領域には、
- 初期化変数領域
- 未初期化変数領域 がある。
・ヒープ領域(動的)
プログラム実行中に、明示的に確保されるメモリ領域。
メモリ領域は、プログラムの実行状況によって動的に割り当てられる。
・スタック領域(動的)
関数の引数、ローカル変数、関数の戻り先の番地などが格納される。
ヒープ領域とスタック領域の使い方
ヒープ領域やスタック領域には上限はあるが、それぞれどの大きさが使用されるかわからない。
そこで、この2つの成長方向を逆にして、start位置を領域の両端におくことで、最大限効率的に使えるようにする。(ヒープ小さくてスタックめっちゃでかいときや、その逆で活躍する)
プロセス記述子(プロセス制御ブロック)
プロセス識別子、優先度等のスケジューリング情報、資源利用情報などが格納されている。
また、「プロセッサ」の状態も格納されている。
プロセッサの状態
・プログラムカウンタ
次に実行する機械語命令のアドレス
・スタックレジスタ
スタックの現在のアドレス(後入れ先出しなので、新しいのが入るたびに、その値に更新)
・フラグレジスタ
演算結果の状態を保持
プロセスの状態
状態の種類
以下の3つの状態のいずれかを取る
・実行可能状態
他のプロセスがプロセッサを使用しているために、一時的に中断している状態
・実行中状態
プロセッサ使用中の状態
・まち状態
外部事象の発生まちのために実行できない状態
実行するプロセスの切り替え
実行中のプロセスを実行中の状態から実行可能状態にうつし、他のプロセスを実行中状態にすることを「ディスパッチ」という。ディスパッチにより処理を切り替えることを「コンテキスト切り替え」という。
また、実行中のプロセスを強制的に実行可能状態に戻すことを「プリエンプション」という。(前でも出てたね)
スケジューリング
実行するプロセスを決めるプログラムを「スケジューラー」という。
スケジューリングアルゴリズムが満たすべき要件
・公平性
各プロセスになるべく公平にプロセッサを割り当てる
・プロセッサの利用率
CPUの動作時間をなるべく長くする
(切り替えやりすぎると落ちる)
・スループット
単位時間あたりに完了するプロセス数をなるべく大きくする
・ターンアラウンド時間
プロセス実行欲求から完了するまでの時間をなるべく短くする
アルゴリズムの例 (準備中)
・到着順
・処理時間順
・残余処理時間順
・ラウンドロビン
・優先度順
・多重フィードバック
スレッド
1つのプロセスの中に複数個存在する、並行処理の単位。
「ユーザーレベルスレッド(ユーザー空間で実現されるため、OSの介入はない)」と
「カーネルレベルスレッド(プロセスと同様、OSによってスケジュールングされる)」に分けられる。