ジョブ管理
ジョブ管理はカーネルがもつ機能のひとつ。
ジョブ管理において利用者との間を橋渡しするのがマスタスケジューラで、マスタスケジューラはジョブスケジューラにジョブ実行を依頼する。
ジョブ実行の流れ
- リーダ
依頼されたジョブをジョブ待ち行列に追加 - イニシエータ
優先度の高いジョブをジョブステップに分解(実行はジョブステップ単位で行う) - ターミネータ
実行完了したジョブに割り当てられた資源を開放し、結果を出力待ち行列に追加 - ライタ
優先度の高いものからジョブ結果を出力
スプーリング
低速な装置とのデータのやりとりを高速な磁気ディスクを介して行うことで処理効率を高める方法。
入力データや出力データを磁気ディスクに蓄えておくことで、CPUの待ち時間を削減できる。スプーリングはスループット(単位時間あたりの仕事量)の向上に役立つ。
タスク管理
タスク管理によってCPUの使用権をタスク間で効率よく持ち回りしたり、割り込み処理を優先させたりしている。
タスクの状態は次の3つ。
- 実行可能状態(READY):CPUの使用権が来るのを待っている状態
- 実行状態(RUN):CPUの使用権が与えられて実行中の状態
- 待機状態(WAIT):入出力処理が発生し、その終了を待っている状態
※ 「待機状態」になったタスクは、再度「実行可能状態」になったのち「実行状態」に移る。「待機状態」→「実行状態」とはならない
タスクスケジューリング
タスクスケジューリング(どのタスクにCPU使用権を与えるか)の代表的な方式は次の3つ。
到着順方式
実行可能状態になったタスク順にCPU使用権を割り当てる方式。
実行途中でCPU使用権を剥奪されることはない。(ノンプリエンプション)
優先順(プライオリティ順)方式
タスクに優先度を設定し、優先度が高い順にCPU使用権を割り当てる方式。
実行中のタスクよりも優先度の高いタスクが待ち行列に追加されると、実行途中でもCPU使用権が奪われる。(プリエンプション)
ラウンドロビン方式
CPU使用権を一定時間ごとに切り替える方式。
実行可能状態になった順にCPU使用権を割り当てるが、規定時間内に完了しなかったタスクは待ち行列の最後に回され、次のタスクにCPU使用権が割り当てられる。
実記憶管理
マルチプログラミング環境では、複数のプログラムが主記憶装置(メモリ)上にロードされるが、メモリの容量は限られているので、どのように配置するかが重要になってくる。
実記憶管理の役割は、限られたメモリを効率よく使えるようにプログラムに割り当てること。
固定区画方式
主記憶に固定長の区画(パーティション)を設けて、そこにプログラムを読み込む方式。全体を単一の区画とする「単一区画方式」と複数の区画に分ける「多重区画方式」がある。
単純だが、区画内に生じた余りスペースは使用できないし、区画サイズ以上のプログラムを読み込むことができないので効率は良くない。
可変区画方式
最初から固定長で区画を作っておくのではなく、プログラムをロードするタイミングで必要なサイズで区画を作る方式。
余剰スペースが生まれないため、固定区画方式よりも効率が良い。
しかし、
プログラムを主記憶上に隙間なく読み込んで実行したとしても、プログラムの終了後には虫食い状態になってしまう。これをフラグメンテーション(断片化)という。
フラグメンテーションを解消するために、ロードされているプログラムの再配置して虫食い状態の空き領域を連続したひとつの領域にする必要がある。この操作をメモリコンパクション、ガベージコレクションと呼ぶ。
オーバーレイ方式
プログラムをセグメントという単位に分割して、そのときに必要なセグメントのみを主記憶上にロードして実行する方式。この方式だと、そもそも主記憶の容量を超えているプログラムにも対応できる。
スワッピング方式
割り込み処理が発生したが、主記憶領域に空きがない場合に優先度の低いプログラムが使っている領域を補助記憶装置に退避させて空きを作る方式。
退避させられたプログラムにCPU使用権が与えられたときには、補助記憶装置から主記憶上にロードされる。
補助記憶装置に退避することをスワップアウト、補助記憶装置から再び主記憶上にロードすることをスワップインという。
仮想記憶管理
主記憶装置と補助記憶装置を合わせて作った仮想的なメモリ空間のことを仮想記憶という。プログラムから見ると膨大なメモリ空間があるように見える。
仮想記憶は仮想的な記憶領域なので、実際のデータは主記憶装置や補助記憶装置に読み込まれる。
要は、主記憶として使うことができる見かけ上の容量を拡大する仕組み。
仮想記憶の実装方式には、仮想アドレス空間を固定長の領域に区切って管理するページング方式と可変長の領域に区切って管理するセグメント方式がある。
ページング方式
- プログラムを「ページ」という単位に分割し、仮想アドレス空間もページで分割されている
- 1ページのサイズは4キロバイトが一般的
- 現在のOSでは、実行に必要なページのみを実記憶に読み込ませる
- 実行に必要になるまでは仮想記憶に割り当てるだけで、実際には読み込まない
- 実行しようとすると実記憶上にページが無いので「ページフォルト」が発生 → 対象ページを実記憶に読み込む
- 「ページフォルト」は必要なページが実記憶に無いときに発生する割り込み
- 仮想記憶と実記憶の対応は「ページテーブル」で管理される
- 仮想ページ番号と実記憶のアドレスとの対応表
- 補助記憶から実記憶へページ読み込み(ページイン)するとき、実記憶に空きがなかったら、いずれかのページを補助記憶へ追い出す(ページアウト)する
- 実記憶の容量が少ないとこのようなページの置き換えが頻繁に発生し、処理効率が低下する。これをスラッシングという。
ページの置き換えアルゴリズム
何をページアウトするかのアルゴリズム。(普段のプログラミングで使われる)
- FIFO(First In First Out)
最初にページインしたページを追い出す - LIFO(Last In First Out)
最後にページインしたページを追い出す - LRU(Least Recently Used)
もっとも長い間参照されていないページを追い出す - LFU(Least Frequently Used)
もっとも参照回数の少ないページを追い出す
おすすめ参考書
分厚いのでKindle版が良いです。(試験が終われば頻繁に開く本でもないですし)
キタミ式イラストIT塾 基本情報技術者 令和03年は読みやすいので1番オススメ。