基本情報技術者 2013年 秋期 午前(科目A) 問18
問題文
優先度に基づくプリエンプティブなスケジューリングを行うリアルタイムOSで、二つのタスクA, Bをスケジューリングする。Aの方がBより優先度が高い場合にリアルタイムOSが行う動作のうち、適切なものはどれか。
選択肢
ア:Aの実行中にBに起動がかかると、Aを実行可能状態にしてBを実行する。
イ:Aの実行中にBに起動がかかると、Aを待ち状態にしてBを実行する。
ウ:Bの実行中にAに起動がかかると、Bを実行可能状態にしてAを実行する。(正解)
エ:Bの実行中にAに起動がかかると、Bを待ち状態にしてAを実行する。
優先度に基づくプリエンプティブなスケジューリングの動作【午前2 解説】
要点まとめ
- 結論→プリエンプティブな優先度スケジューリングでは、高優先度タスクが起動すると低優先度の実行を中断して即時実行されます。
- 根拠→プリエンプションによりOSは実行中の低優先度タスクをコンテキスト保存して実行可能(レディ)状態に戻し、高優先度にCPUを割り当てます。
- 差がつくポイント→「待ち(ブロック)」と「実行可能(レディ)」の違いを押さえ、割り込みや同期でタスク状態がどう変わるかを判断すること。
正解の理由
正解は ウ です。
設問の条件ではタスクAがBより優先度が高く、Bが実行中にAが起動した場合を問いています。プリエンプティブな優先度スケジューリングでは、高優先度タスクが起動すると実行中の低優先度タスクは中断され(コンテキスト保存)、実行可能(レディ)状態に戻されます。OSはCPUを高優先度のAに切り替えてAを実行するため、ウの記述「Bの実行中にAに起動がかかると、Bを実行可能状態にしてAを実行する。」が正しい動作を表しています。
設問の条件ではタスクAがBより優先度が高く、Bが実行中にAが起動した場合を問いています。プリエンプティブな優先度スケジューリングでは、高優先度タスクが起動すると実行中の低優先度タスクは中断され(コンテキスト保存)、実行可能(レディ)状態に戻されます。OSはCPUを高優先度のAに切り替えてAを実行するため、ウの記述「Bの実行中にAに起動がかかると、Bを実行可能状態にしてAを実行する。」が正しい動作を表しています。
よくある誤解
- 「待ち状態=実行可能」と誤認する:待ち(ブロック)は資源待ちやI/O待ちでスケジューラから除外され、実行可能(レディ)はスケジューラ候補である点を混同しやすいです。
- 低優先度が高優先度に先に走り続けると思う:プリエンプションが有効なら高優先度の起動で即座に中断されます。例外は割込み禁止やクリティカルセクション保護中だけです。
- 「待ち状態にする=ブロックさせる」として選択肢を正しいとする誤り:プリエンプトで中断されたタスクは通常レディ(実行可能)になります。
解法ステップ
- 問題文からどのタスクが高優先度かを確認する(Aが高い)。
- 現在の実行状況を把握する(Bが実行中か、Aが実行中か)。
- 高優先度タスクが起動した際の状態遷移を思い出す(プリエンプトが起きれば実行中は中断→レディ)。
- 各選択肢が「中断→レディ」か「待ち(ブロック)」のどちらを述べているかで正誤を判定する。
選択肢別の誤答解説
-
ア: Aの実行中にBに起動がかかると、Aを実行可能状態にしてBを実行する。
→ 誤り。AはBより優先度が高いため、A実行中に低優先度Bが起動してもAが中断される理由がない。BはAを奪えません。 -
イ: Aの実行中にBに起動がかかると、Aを待ち状態にしてBを実行する。
→ 誤り。低優先度タスクが高優先度タスクを待ち(ブロック)させることは通常なく、プリエンプティブ環境では高優先度が優先されます。 -
ウ: Bの実行中にAに起動がかかると、Bを実行可能状態にしてAを実行する。
→ 正解。実行中の低優先度Bは中断されレディ(実行可能)状態になり、OSは高優先度AにCPUを割り当てます。 -
エ: Bの実行中にAに起動がかかると、Bを待ち状態にしてAを実行する。
→ 誤り。中断されたBは通常「待ち(ブロック)」ではなく「実行可能(レディ)」状態になります。待ち状態はI/Oや同期待ち等別の要因で発生します。
補足コラム
- 状態名称の整理:Running(実行中)、Ready(実行可能/レディ)、Blocked(待ち/ブロック)。プリエンプトではRunning→Readyへ遷移します。
- 優先度逆転問題:高優先度タスクが低優先度タスクが保持する資源を待つと優先度逆転が起きます。これを避けるため優先度継承や優先度上げ(priority inheritance)などの対策が利用されます。
- プリエンプティブと非プリエンプティブ:非プリエンプティブではタスクは自発的にCPUを離すまで実行を継続するため、本問題のような即時切替は起こりません。
FAQ
Q1: プリエンプトで中断されたタスクの「残り時間」はどうなるか?
A1: コンテキスト(レジスタやPC、スタックなど)を保存しておき、後で再スケジュールされたときに続きから実行されます。
A1: コンテキスト(レジスタやPC、スタックなど)を保存しておき、後で再スケジュールされたときに続きから実行されます。
Q2: 「実行可能」と「待ち」はどこで決まる?
A2: タスク自身の状態遷移(I/O要求、待ちイベント、タイマー、割り込み等)やOSのスケジューラが決定します。
A2: タスク自身の状態遷移(I/O要求、待ちイベント、タイマー、割り込み等)やOSのスケジューラが決定します。
Q3: 例外はあるか?高優先度でも即時実行されない場合は?
A3: 割込み禁止やクリティカルセクション、カーネルの一部処理中などでプリエンプトが遅延することがあります。
A3: 割込み禁止やクリティカルセクション、カーネルの一部処理中などでプリエンプトが遅延することがあります。
関連キーワード: プリエンプション、優先度スケジューリング、リアルタイムOS、レディ状態、待ち状態、優先度逆転、プリエンプティブ

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

