基本情報技術者 2013年 春期 午前(科目A) 問18
問題文
三つのタスクの優先度と、各タスクを単独で実行した場合のCPUと入出力装置(I/O)の動作順序と処理時間は、表のとおりである。三つのタスクが同時に実行可能状態になってから、全てのタスクの実行が終了するまでの、CPUの遊休時間は何ミリ秒か。ここで、I/Oは競合せず、OSのオーバヘッドは考慮しないものとする。また、表の()内の数字は処理時間を示す。

選択肢
ア:1
イ:2
ウ:3(正解)
エ:4
🔒 解説は解答すると表示されます
タスク優先度とCPU遊休時間【午前解説】
正解の理由
全タスク同時に実行可能状態でスタートすると、プリエンプティブな優先度(高→中→低)で CPU が割り当てられます。各タスクの動作は以下の通りであり、I/O は独立で並列に処理されるため、I/O 中の CPU の割当て状況を時系列で追えば CPU の遊休時間が求まります。計算の結果、CPU の遊休時間は合計で 3ms となるため、正解は ウ(3)です。
解法ステップ
- 各タスクを時刻 0 に並べ、優先度高→中→低で CPU を割り当て開始。
- 各タスクの最初の CPU バースト終了時刻と、その後の I/O 終了時刻を計算する。
- CPU が他のタスクに割り当てられない時間帯(全タスクが I/O 中、かつまだ次の CPU バーストが到着していない時間)を合算する。
- 最後に全区間の遊休時間を合計して選択肢と比較する。
具体的な時刻表(ms 単位):
- t=0–3: 高優先度 CPU(3) 実行 → 高は t=3 で I/O(5) に移行(完了 t=8)
- t=3–5: 中優先度 CPU(2) 実行 → 中は t=5 で I/O(6) に移行(完了 t=11)
- t=5–6: 低優先度 CPU(1) 実行 → 低は t=6 で I/O(5) に移行(完了 t=11)
- t=6–8: CPU に実行可能タスクがなく遊休(2ms)
- t=8–10: 高の第2 CPU(2) 実行(高終了 t=10)
- t=10–11: 再び CPU に実行可能タスクがなく遊休(1ms)
- t=11–13: 中の第2 CPU(2) 実行
- t=13–14: 低の第2 CPU(1) 実行(全タスク終了)
合計遊休時間 = 2 + 1 = 3 ms
(上記より正解は ウ)
選択肢別の誤答解説
- ア: 1 — おそらく t=6–8 の 2ms のみを見て、t=10–11 の 1ms を見落としたケース。I/O 復帰のタイミングを最後まで追えていない。
- イ: 2 — 中央の 2ms 区間(t=6–8)だけを合算した誤り。最終の高の第2 CPU 終了後の短時間の遊休を忘れがち。
- ウ: 3 — 正答。上の全時刻を正確に追跡した結果。
- エ: 4 — 過剰に遊休を見積もったケース(例えば、I/O の並列性を誤って扱い、余分に待ち時間を加算した)。
よくある誤解
- 「I/O が並列なら CPU は常に稼働する」と思い込む誤解:I/O が並列でも、全タスクが同時に I/O に入っている期間は CPU に実行するタスクがなくなり遊休が発生します。
- 「優先度順だけ考えていればよい」と考える誤解:優先度だけでなく各段の処理時間(I/O の終了時刻)が CPU の空き時間を決めるため、時刻追跡が重要です。
- 「最後の I/O が終わるまで CPU は働く」と誤認:I/O 終了と CPU バーストの到着時刻のずれが遊休時間を生みます。
補足コラム
本問は「優先度スケジューリング」と「CPU/I/O バーストの時刻追跡」を組み合わせた典型問題です。ポイントは「I/O が競合しない=同時に複数の I/O が進行する」ため、I/O の終了タイミングが CPU の有無を決める点です。実務的には、CPU 利用率を上げるために I/O バウンドと CPU バウンドの混在を活用したスケジューリングが行われますが、試験では時刻を正確に追う練習が重要です。
簡単な Python によるシミュレーション(参考)
tasks = {
'H': [(3,'CPU'),(5,'IO'),(2,'CPU')],
'M': [(2,'CPU'),(6,'IO'),(2,'CPU')],
'L': [(1,'CPU'),(5,'IO'),(1,'CPU')],
}
# 上の擬似データを基に時刻追跡すれば遊休 3ms を確認できます(省略)。
FAQ
Q1: I/O が並列なら CPU は遊休にならないのでは?
A1: I/O が並列でも「全タスクが同時に I/O にいる期間」は CPU に実行可能なプロセスが存在せず遊休が発生します。
A1: I/O が並列でも「全タスクが同時に I/O にいる期間」は CPU に実行可能なプロセスが存在せず遊休が発生します。
Q2: プリエンプトがないスケジューリングならどうなる?
A2: 非プリエンプティブなら一度 CPU を取ったタスクは I/O に入るまで続行するため、順序が変わり遊休時間が異なる可能性があります。本問は優先度割当と同時開始が前提です。
A2: 非プリエンプティブなら一度 CPU を取ったタスクは I/O に入るまで続行するため、順序が変わり遊休時間が異なる可能性があります。本問は優先度割当と同時開始が前提です。
Q3: I/O の競合があったら結果は変わる?
A3: はい。I/O が競合し待ち列が発生すると I/O の完了時刻が遅延し、CPU の遊休時間や完了順序が変わります。
A3: はい。I/O が競合し待ち列が発生すると I/O の完了時刻が遅延し、CPU の遊休時間や完了順序が変わります。
関連キーワード: プロセススケジューリング、プリエンプティブ優先度、CPU遊休時間、I/O待ち時間、スケジューリング解析

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

