タスク管理は、OSが実行する処理の状態を管理し、CPUをどの処理に割り当てるかを制御する仕組みです。この章では、実行・実行可能・待ちの違いから、スケジューリング、コンテキスト切替え、デッドロックまでを整理します。
ここでのタスクはOSが管理する実行単位を指します。OSによってプロセスやスレッドとの対応が異なるため、試験では問題文の定義に従います。
3つの状態:「何を待っているか」で見分ける
| 状態 | 意味 | 例 |
|---|---|---|
| 実行(Running) | CPUを割り当てられて処理している | 計算を進めている |
| 実行可能(Ready) | 実行できるがCPUの割当てを待っている | 実行可能キューに並ぶ |
| 待ち(Waiting/Blocked) | 入出力や資源などの条件を待つ | 未完了の読込みやロックの解放を待つ |
ReadyはCPU待ち、Waitingはイベントや資源待ちです。学習ではこの3状態を中心に扱いますが、生成・終了などを加えたモデルや、OS独自の細かな状態もあります。
状態遷移の主なきっかけ
- 実行可能→実行:選ばれたタスクにCPUを割り当てる(ディスパッチ)。
- 実行→実行可能:割当て時間の終了などで、CPUを取り上げる(プリエンプション)。
- 実行→待ち:必要な入出力や資源がまだ利用できず、処理を続けられない。
- 待ち→実行可能:入出力完了などで待ち条件が解消する。
基本モデルでは、入出力が完了しても直接「実行」へ飛ぶのではなく、実行可能になってからCPUを割り当てられます。また、非同期・非ブロッキングの入出力は、要求しただけで必ず待ち状態になるわけではありません。
スケジューリングとディスパッチ
スケジューリングは次に動かす対象を選ぶこと、ディスパッチは選んだ対象へCPUの制御を渡すことです。ここではCPUが同時に1タスクを実行する単純なモデルで考えます。
| 方式 | 選び方 | 注意点 |
|---|---|---|
| 到着順(FCFS) | 実行可能になった順に処理 | 長い処理が先だと後続が待つ |
| 優先度順 | 優先度が高い処理を先にする | 低優先度の処理が長く待つ飢餓に注意。プリエンプトの有無は条件次第 |
| ラウンドロビン | 時間の上限(タイムクォンタム)を決めて順に割り当てる | 短すぎる割当ては切替え負荷を増やす |
ラウンドロビンを時刻で追う
全タスクが0msに到着し、キューの順番はP1→P2→P3、必要CPU時間は順に5ms・3ms・1msとします。タイムクォンタムは2ms、入出力待ちと切替え時間は無視します。
| 時間帯 | 動くタスク | 処理後の残りCPU時間 |
|---|---|---|
| 0〜2ms | P1 | P1:3ms |
| 2〜4ms | P2 | P2:1ms |
| 4〜5ms | P3 | P3:完了 |
| 5〜7ms | P1 | P1:1ms |
| 7〜8ms | P2 | P2:完了 |
| 8〜9ms | P1 | P1:完了 |
上限まで必ず使い切るのではなく、処理が終わればCPUを手放します。実行順はP1→P2→P3→P1→P2→P1です。
コンテキスト切替え:途中の状態を保存する
コンテキスト切替えでは、実行中の処理を後で再開できるように、プログラムカウンタやレジスタなどを保存し、次の処理の状態を復元します。プロセスを切り替える場合は、アドレス空間などの管理情報の切替えも関係します。
毎回メモリ全体をコピーするという意味ではありません。切替え中はアプリケーションの本来の計算が進まないため、オーバーヘッドになります。システムコールや割込みによる実行モードの変更が、必ず別タスクへの切替えを伴うわけでもありません。
プリエンプティブとノンプリエンプティブ
- プリエンプティブ:OSが実行中の処理からCPUを取り上げられる方式。時間制限や優先度などに基づきます。
- ノンプリエンプティブ:処理の終了や待ち状態への移行、自発的な実行権の返却などをきっかけに切り替える方式。
プリエンプションだけで、他のタスクへの不具合の影響を全て防げるわけではありません。メモリ保護や資源の管理なども別途必要です。
ターンアラウンドタイムと応答時間
- ターンアラウンドタイム:到着から処理完了まで。完了時刻−到着時刻。
- 応答時間:要求から応答まで。スケジューリングの計算問題では、到着から最初にCPUを使うまで、と定義することがあります。
- 待ち時間:実行可能キューでCPUを待つ時間。
- スループット:単位時間当たりに完了する処理数。
先ほどの例では全て0ms到着なので、P1・P2・P3のターンアラウンドタイムは9ms・8ms・5ms、平均は22÷3≒7.33msです。「初回のCPU割当てまで」を応答時間とするなら、0ms・2ms・4ms、平均2msです。
排他制御とデッドロックも押さえる
共有データへ同時にアクセスすると、更新の消失などが起きる場合があります。ミューテックスなどで必要な範囲を保護しますが、資源の獲得順序によってはデッドロックが発生します。
デッドロックの必要条件は、相互排他・保持と待ち・非奪取・循環待ちの4つです。例えばAが資源Xを保持してYを待ち、BがYを保持してXを待つ状態です。資源の取得順序を統一するなどの対策を考えます。4条件が成立し得ることと、今まさにデッドロックが起きていることは区別します。
確認問題
入出力の完了を待っているタスクについて、入出力が完了した直後の基本的な状態遷移はどれでしょうか。
- 待ち→実行可能
- 待ち→実行(CPU割当ての判断なし)
- 実行可能→待ち
解答・解説を見る
正解は①です。待ち条件が解消すると実行可能になります。その後、選択とCPU割当てを経て実行します。
タスクの基礎から資源共有へ、noteで復習
プロセス・スレッドと共有資源の関係を、まとめて整理したい方へ。
関連noteでは、プロセスとスレッドの違い、資源共有、競合、排他制御、セマフォとミューテックス、デッドロックを扱っています。この章の実行単位と、共有データを安全に扱う仕組みをつなぐ復習に使えます。
教材の公開範囲・価格などはリンク先でご確認ください。

コメント