OSのタスク管理と記憶管理
要点と定義
OSは、タスクの実行や主記憶の利用などを管理して、プログラムが動く環境を提供するソフトウェアです。この節では、タスクの状態とスケジューリング、ジョブと出力、共有データの排他制御、実記憶・仮想記憶の管理を扱います。
タスクは、OSが実行を管理する処理の単位です。実行可能状態はCPUの割当てを待つ状態、実行状態はCPUを使用している状態、待ち状態は入出力の完了などを待つ状態です。待っていた事象が起きると、タスクは実行可能状態に戻ります。ディスパッチャは実行可能なタスクから次に実行するものを選び、CPUを割り当てます。
優先度方式では、実行可能なタスクのうち優先度の高いものから実行します。プリエンプティブ方式では、実行中のタスクより優先度の高いタスクが実行可能になると、実行中のタスクを中断して切り替えられます。中断されたタスクは、入出力などを待っているわけではないため、待ち状態ではなく実行可能状態に戻ります。
複数のタスクがCPUと入出力装置を交互に使う場合、あるタスクが入出力を待っている間に、別のタスクがCPUを使えることがあります。指定された期間のCPU遊休時間は、全タスクの完了時刻からCPUが実際に処理した時間の合計を引いて求められます。例えば完了まで14ミリ秒、CPU処理の合計が11ミリ秒なら、遊休時間は14−11=3ミリ秒です。これは、期間中に他の処理がない条件での計算です。
ジョブは、処理する仕事をまとめた単位です。ジョブの実行後に印刷などの出力処理を行うことがあります。スプーリングは、出力データをいったん蓄えて、装置が使えるようになってから処理する仕組みです。CPUとプリンタは別々に動けるため、次のジョブの実行と前のジョブの印刷が重なる場合があります。例えば実行時間が順に50、30、20、40秒、印刷時間が50、40、30、20秒なら、CPUは140秒で実行を終えます。プリンタは実行後のジョブを順に印刷し、最後の印刷が終わるのは190秒です。
共有データを複数のタスクが読み、変更して書き戻すと、処理の順序で最終値が変わることがあります。初期値100に30を加える処理と50を引く処理があり、両方が先に100を読んでから書き戻すと、最後に書いた値の50または130が残ります。先に一方が書き戻した後、もう一方がその値を読み直して更新すれば80になります。排他制御は、更新中に他のタスクが同じ共有データを変更しないようにし、こうした競合を防ぎます。
二値セマフォは、共有資源が解放中か確保中かを表す仕組みです。ここでの値は、1が解放中、0が確保中を表します。P操作では、値が1なら0にして資源を確保し、0なら解放されるまで待ってから確保します。V操作では、処理後に値を1にして資源を解放します。確保と値の変更が一体として割り込まれずに実行されることが、複数タスクによる同時確保を防ぐ前提です。
複数の資源を使う処理では、確保の順序が異なるとデッドロックが起きることがあります。例えばタスクAが資源1を確保して資源2を待ち、タスクBが資源2を確保して資源1を待つと、互いに相手の解放を待ち続けます。全タスクで資源を同じ順序で確保することは、この形の相互待ちを避ける方法です。
適用条件と例
実記憶の可変区画方式では、プロセスの大きさに応じて主記憶領域を割り当てます。確保と解放を繰り返すと、空き領域が離れて分散し、合計では足りていても必要な大きさの連続領域を確保できないことがあります。コンパクションは使用中の領域を移動して、空き領域をまとめる方法です。
この節の続き
- 誤りやすい点
ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。
アプリでこの節を読む