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

選択肢
ア:2
イ:3(正解)
ウ:4
エ:5
タスクの優先度によるスケジューリングとCPU遊休時間の計算【午前2 解説】
要点まとめ
- 結論: 優先度方式(高優先度が常にCPUを奪うプリエンプティブ)で進めるとCPUの遊休時間は合計で3ミリ秒です。
- 根拠: 各タスクのCPU実行→I/O滞在→再CPU実行を時系列で追い、CPUが実行可能タスク不在の間を合算しました。
- 差がつくポイント: I/O待ちで全タスクがブロックする瞬間を見逃すと遊休時間を過少評価するミスが多発します。
正解の理由
正解は イ(3ミリ秒)です。理由は時系列シミュレーションで明確になります。全タスクが同時に実行可能になった時点を として、優先度順(高>中>低)でCPU割当てを行い、各CPU区間とI/O区間が重なり合うかを確認すると、CPUが実行可能タスクを欠く時間が (〜)と (〜)の合計 になります。
よくある誤解
- 「優先度方式=非プリエンプティブ」と考える誤解:本問は高優先度が優先されるためプリエンプティブと解釈して時系列で割当てるのが正解です。
- I/O が競合しないため「I/O完了が同時でもCPUは常に埋まる」と誤解する点:実際は全タスクがI/O中だとCPUは遊休になります。
- 各タスクの第2CPU実行が同時に来ると仮定して重複を数える誤り:CPUは1個なので先着・優先度で順次処理される点を忘れがちです。
解法ステップ
- 各タスク動作を時系列で書き出す(CPUとI/Oの開始・終了時刻を追う)。
- 優先度(高>中>低)に従い、CPUが空いた時点で最も高い実行可能タスクを割り当てる(プリエンプティブ可)。
- 全タスクがI/O中でCPUに実行可能タスクが無い区間を見つけ、その時間長を合計する。
- 最終的に全タスク終了までのCPU遊休時間を求め、選択肢と比較する。
(時系列の具体例)
- 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: 全タスクI/O中のためCPU遊休(2ms)
- t=8〜10: 高のCPU(2) 実行 → 高終了 t=10
- t=10〜11: 中・低はいまだI/O中のためCPU遊休(1ms)
- t=11〜13: 中のCPU(2) 実行 → 中終了 t=13
- t=13〜14: 低のCPU(1) 実行 → 低終了 t=14
遊休時間合計 =
選択肢別の誤答解説
- ア: 2 — 初めの遊休区間のみ(t=6〜8の2ms)を数え、t=10〜11の1msを見落としている誤り。
- イ: 3 — 正解。すべての遊休区間(t=6〜8 と t=10〜11)を合算すると3msになるため正しい。
- ウ: 4 — どこかで重複や余分な遊休区間を想定してしまった可能性。実際の遊休は2msと1msの合計で3ms。
- エ: 5 — 全I/O時間の合計などを誤って遊休時間と見なした誤り。I/O時間全体は遊休に直結しない(CPUが他タスクを実行できる場合がある)。
補足コラム
- プリエンプティブ優先度スケジューリングの計算では「I/Oによるブロック」がCPU遊休を生む主要因です。特に複数タスクのI/O終了時刻が重ならず、I/O終了の間隔でCPUが埋まらない場合、短時間の遊休が複数回生じます。
- 解く際はGanttチャート(ガント図)を手で描くと視認性が良くミスが減ります。簡単な表形式で「時刻/実行中タスク/I/O中タスク」を追うのが有効です。
FAQ
Q1: 「優先度方式」は必ずプリエンプティブですか?
A1: 問文の文脈では高優先度が常にCPUを得る想定で計算しています。非プリエンプティブなら解法が変わるので設問文の条件確認が必要です。
A1: 問文の文脈では高優先度が常にCPUを得る想定で計算しています。非プリエンプティブなら解法が変わるので設問文の条件確認が必要です。
Q2: I/Oが競合しないとはどういう意味ですか?
A2: 複数タスクのI/Oが同時に始まってもそれぞれ独立に動作し、I/Oの待ちによる追加の遅延は発生しないという意味です(I/O完了時刻は単純に開始+所要時間)。
A2: 複数タスクのI/Oが同時に始まってもそれぞれ独立に動作し、I/Oの待ちによる追加の遅延は発生しないという意味です(I/O完了時刻は単純に開始+所要時間)。
Q3: 全CPU時間の合計から全体時間を引くだけではダメですか?
A3: 総CPU時間や総壁時間を使うアプローチもありますが、優先度による実行順やI/Oタイミングを無視すると誤差が出ます。時系列でのシミュレーションが確実です。
A3: 総CPU時間や総壁時間を使うアプローチもありますが、優先度による実行順やI/Oタイミングを無視すると誤差が出ます。時系列でのシミュレーションが確実です。
関連キーワード: 優先度スケジューリング、プリエンプティブ、CPU遊休時間、ガントチャート、プロセススケジューリング、I/O待ち、スケジューリング解析

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

