基本情報技術者 2018年 春期 午前(科目A) 問16
問題文
三つのタスクA~Cの優先度と、各タスクを単独で実行した場合のCPUと入出力(I/O)装置の動作順序と処理時間は、表のとおりである。A~Cが同時に実行可能状態になって3ミリ秒経過後から7ミリ秒間のスケジューリングの状況を表したものはどれか。ここで、I/Oは競合せず、OSのオーバヘッドは考慮しないものとする。また、表中の( )内の数字は処理時間を表すものとし、解答群の中の“待ち“は、タスクが実行可能状態にあり、CPUの割当てで待ちであることを示す。


選択肢
ア:
イ:
ウ:(正解)
エ:
🔒 解説は解答すると表示されます
優先度プリエンプト方式【午前解説】
正解の理由
同時に実行可能になった3タスクを「優先度の高いものがCPUを取得し、戻ってきたら低いものをプリエンプトする」前提で時刻0から順に追うと、観察区間(準備状態から3ms経過した時点=時刻3msから、その後7ms間=3–10ms)の各状態は次の通りになります。
- A(高優先):単独でCPU(2)→I/O(2)→CPU(2) のため、時刻0–2で最初のCPUを使い、2–4でI/O、4–6で最後のCPUを使って完了する。したがって観察区間の3–10msでは3–4がI/O、4–6がCPU、6ms以降は完了(CPU占有なし)。
- B(中優先):時刻2にCPUを取り2–4の間にCPUを実行(観察区間内では3–4がCPU)。時刻4にAが戻ってきてプリエンプトされ、4–6は待ち、6–7に残り1msのCPUを実行してから7–12でI/Oへ入る(観察区間では7–10がI/O)。
- C(低優先):A・Bの優先が上位のため観察区間の前半は待ち続け、時刻7–9にCPUを2ms使い、9–11でI/Oを行う(観察区間では7–9がCPU、9–10がI/O)。
この実際の時系列と、図中で「破線=待ち」「実線=実行」「破線注記や重なりはプリエンプトや部分実行を示す」と解釈したときに、選択肢ウの描き方(Aが3–4 I/O → 4–6 CPU、Bが3–4 CPU→4–6待ち→6–7 CPU→7–10 I/O、Cが3–7待ち→7–9 CPU→9–10 I/O(観察区間内))と一致します。したがって選択肢ウが正しい表現です。
解法ステップ
- 初期状態(時刻0)でA,B,Cが同時に実行可能とする。優先度はA>B>C、プリエンプトあり。
- 各タスクの単独実行パターンを確認:
- A: CPU2 → I/O2 → CPU2
- B: CPU3 → I/O5 → CPU2
- C: CPU2 → I/O2 → CPU3
- 時刻0から順に割り当てを決定:
- 時刻0–2: A(CPU)
- 時刻2–4: A(I/O)、CPUは空くのでBがCPUを開始(Bは3ms必要)
- 時刻4: AのI/O終了によりAがCPUを取り戻す(プリエンプト)。Bは残り1msを保持して待ちへ。
- 時刻4–6: A(CPU)で完了
- 時刻6: CPU空き → Bの残り1msを優先して割付(時刻6–7)
- 時刻7: BはI/O(7–12)、CPU空き → CがCPUを取得(7–9)
- 以降CはI/O(9–11)、Aは既に完了
- 観察区間(3–10ms)に該当する各タスクの状態を抜き出す(上の「正解の理由」参照)。
- 選択肢の図が「破線=待ち、重なり=プリエンプト表現」であることを考慮して突き合わせ、唯一一致するのが選択肢ウであることを確認。
選択肢別の誤答解説
- ア:AのCPUが3–6のように長く占有しているなど、AがI/O→CPU→CPUの時間配分を誤っている。Bを3–6でI/Oとするが、実際はBは最初にCPUを取り2–4のCPU実行があるため不適合。
- イ:Aを3–4 CPU、4–6 I/Oの順にしている(CPUとI/Oの順序が逆)。Aの個別動作順序を守っていないため不可。
- ウ:正答(上記参照)。
- エ:Aを3–4 I/O → 8–9 CPUのように大きく待たせているが、Aの総計処理時間やI/O終了時刻と矛盾する。Bを5–10 I/Oと長期間I/Oにしている点も実際のプリエンプト順序と一致しない。
よくある誤解
- 「図の横軸ラベルと実際の実行区間をそのまま読む」こと:図中の長方形や破線は描画の都合で端点がずれることがあるため、処理時間の合計や前後関係(プリエンプトの有無)で検証する必要があります。
- 「高優先度タスクはI/O中もCPUを占有する」と誤解する:I/O中はCPUを離れるため、他タスクがCPUを使えます。I/O完了時に再び高優先度がCPUを奪う(プリエンプト)点を常に確認してください。
補足コラム
プリエンプティブ優先度スケジューリングを解く際は「イベント駆動」で時刻順にイベント(CPU開始・CPU終了・I/O開始・I/O終了)を書き出すとミスが減ります。観察区間が問題に指定されている場合は、その区間の前に起きたイベントも計算して「区間開始時点の状態(誰がCPUを使っているか、誰が待ちか)」を確定することが重要です。
簡単なメモ化(イベント表)例:
時刻0: A開始(CPU残2), B待, C待
時刻2: A→I/O(2), B開始(CPU残3→実行)
時刻4: A I/O完了→AがCPUを取得(Bはプリエンプト)
時刻6: A終了、B残1でCPU獲得→6–7実行
時刻7: B→I/O、CがCPU獲得(7–9)…
時刻2: A→I/O(2), B開始(CPU残3→実行)
時刻4: A I/O完了→AがCPUを取得(Bはプリエンプト)
時刻6: A終了、B残1でCPU獲得→6–7実行
時刻7: B→I/O、CがCPU獲得(7–9)…
このようにイベントを列挙すると、観察区間3–10の状態が明確になります。
FAQ
Q. 「破線」が図に重なっているときはどう読めばよいですか?
A. 多くの試験図では、破線=待ち(実行可能でCPU割当待ち)、破線注記の重なりは「途中でプリエンプトされた」「その区間は部分的に実行されている/されていない」を示します。必ず処理の総時間と前後関係(いつI/Oに入るか、I/Oの長さ)で確認してください。
A. 多くの試験図では、破線=待ち(実行可能でCPU割当待ち)、破線注記の重なりは「途中でプリエンプトされた」「その区間は部分的に実行されている/されていない」を示します。必ず処理の総時間と前後関係(いつI/Oに入るか、I/Oの長さ)で確認してください。
Q. 観察区間の開始が「準備状態になって3ms経過後」とあるとき、どこから時間を数える?
A. 「準備状態になった瞬間」を時刻0とし、そこから3ms経過した瞬間を観察区間開始(時刻3ms)と考えます。したがって時刻0からのスケジュールを求めて、3ms時点の状態を導出する必要があります。
A. 「準備状態になった瞬間」を時刻0とし、そこから3ms経過した瞬間を観察区間開始(時刻3ms)と考えます。したがって時刻0からのスケジュールを求めて、3ms時点の状態を導出する必要があります。
関連キーワード: プリエンプティブスケジューリング、優先度割当、プリエンプト、CPUスケジューリング、イベント駆動解析、待ち状態、I/O同期、タイムライン解析

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

