基本情報技術者 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同期、タイムライン解析

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

