基本情報技術者 2017年 秋期 午前(科目A) 問18
問題文
優先度に基づくプリエンプティブなスケジューリングを行うリアルタイムOSで、二つのタスクA,Bをスケジューリングする。Aの方がBよりも優先度が高い場合にリアルタイムOSが行う動作のうち、適切なものはどれか。
選択肢
ア:Aの実行中にBに起動がかかると、Aを実行可能状態にしてBを実行する。
イ:Aの実行中にBに起動がかかると、Aを待ち状態にしてBを実行する。
ウ:Bの実行中にAに起動がかかると、Bを実行可能状態にしてAを実行する。(正解)
エ:Bの実行中にAに起動がかかると、Bを待ち状態にしてAを実行する。
##: 優先度に基づくプリエンプティブなスケジューリングを行うリアルタイムOSで、二つのタスクA,Bをスケジューリングする。Aの方がBよりも優先度が高い場合にリアルタイムOSが行う動作のうち、適切なものはどれか。【午前2 解説】
要点まとめ
- 結論:プリエンプティブな優先度スケジューリングでは高優先度タスクが起動すると即座に実行され、低優先度タスクはCPUを奪われて実行可能状態になります。
- 根拠:プリエンプションの定義上、高優先度タスクが「準備完了(実行可能)」になるとOSは直ちにCPUを再割当てし、低優先度を中断します。
- 差がつくポイント:選択肢中の「実行可能状態」と「待ち状態(ブロック)」の意味を正確に区別できるかが合否を分けます。
正解の理由
選択肢の中で正しいのは ウ です。理由は次の通りです。Bが実行中に高優先度のAが起動すると、プリエンプティブOSはBを中断してBを「実行可能状態(ready)」に戻し、CPUをAに渡してAを即時実行します。つまり、低優先度のBは「待ち(ブロック)」にはならず、実行再開を待つための実行可能状態になります。これがプリエンプション(強制割込みによる切替)の基本動作です。
よくある誤解
- 「待ち状態」と「実行可能状態」を混同する:待ち=ブロック(入出力待ち等)であり、実行可能=CPU割当てを待つ状態で違いがあります。
- 高優先度タスクでも低優先度が終了するまで待つと考える:プリエンプティブでは即時置換が起こるため、待たせる必要はありません。
- プリエンプションは常に起こると思い込む:実装やポリシーによっては非プリエンプティブ動作や同優先度の扱いが異なる場合があります。
解法ステップ
- 問題文から「プリエンプティブ」と「優先度に基づく」を確認する。
- 状況を整理する(どちらが実行中で、どちらが新たに起動したか)。
- プリエンプティブ動作を適用:高優先度が起動したら低優先度を中断して高優先度を実行。
- 用語確認:「実行可能状態(ready)」と「待ち状態(blocked)」の意味を照合して選択肢を評価する。
選択肢別の誤答解説
- ア: 「Aの実行中にBに起動がかかると、Aを実行可能状態にしてBを実行する。」
→ 誤り。Aは既に実行中であり、Bが起動してもAより優先度が低ければAを続行させる(Aを実行可能に戻すという表現は場面に合わない)。 - イ: 「Aの実行中にBに起動がかかると、Aを待ち状態にしてBを実行する。」
→ 誤り。優先度が高いのはAなので、Aを待ち状態(ブロック)にする根拠がない。プリエンプションの逆を述べている。 - ウ: 「Bの実行中にAに起動がかかると、Bを実行可能状態にしてAを実行する。」
→ 正解。高優先度のAが起動したため、低優先度のBは中断され実行可能(ready)に戻り、Aが即時実行される。 - エ: 「Bの実行中にAに起動がかかると、Bを待ち状態にしてAを実行する。」
→ 誤り。Bは入出力等でブロックされたわけではないため「待ち状態(blocked)」にするのは不適切。中断されて実行可能状態になるのが正しい。
補足コラム
- プリエンプティブとノンプリエンプティブ:プリエンプティブは実行中タスクを強制的に中断できるのに対し、ノンプリエンプティブではタスクが自発的にCPUを開放するまで切替が起きません。リアルタイム性を要求するシステムではプリエンプティブが一般的です。
- 優先度逆転(Priority Inversion):低優先度タスクが高優先度タスクが必要とする資源を保持していると、高→低の順でブロックが発生し逆転が生じます。対策としてプライオリティインヘリタンスなどがあります。
- 状態モデル簡易図(タイミング)
- 時刻 t0: B 実行中
- 時刻 t1: A 起動 → OS が B を中断(ready)して A を実行
- 時刻 t2: A 終了 → OS が ready にある B を再実行
FAQ
Q1: 実行可能状態と待ち状態はどう見分ければよいですか?
A1: 実行可能状態(ready)はCPUスケジューラが割当てれば実行できる状態、待ち状態(blocked)は外部イベント(I/Oや同期)を待っており直ちに実行できない状態です。
A1: 実行可能状態(ready)はCPUスケジューラが割当てれば実行できる状態、待ち状態(blocked)は外部イベント(I/Oや同期)を待っており直ちに実行できない状態です。
Q2: 同じ優先度のタスクが同時に準備完了になった場合は?
A2: 実装依存でFIFOやラウンドロビン、タイムスライスなどのポリシーにより選択されます。問題文に明記がなければ同優先度についての扱いは問われません。
A2: 実装依存でFIFOやラウンドロビン、タイムスライスなどのポリシーにより選択されます。問題文に明記がなければ同優先度についての扱いは問われません。
Q3: プライオリティインヘリタンスは必須ですか?
A3: 必須ではありませんが、優先度逆転が許容できないリアルタイムシステムでは導入が推奨されます。
A3: 必須ではありませんが、優先度逆転が許容できないリアルタイムシステムでは導入が推奨されます。
関連キーワード: プリエンプション、優先度スケジューリング、リアルタイムOS、実行可能状態、待ち状態、優先度逆転、プライオリティインヘリタンス

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

