プリエンプティブ方式でCPUを奪われたタスクはどの状態に移るか
基本情報技術者試験 平成29年度秋期 午前 問18 / ソフトウェア › オペレーティングシステム
過去問にチャレンジ
優先度に基づくプリエンプティブなスケジューリングを行うリアルタイムOSで,二つのタスクA,Bをスケジューリングする。Aの方がBよりも優先度が高い場合にリアルタイムOSが行う動作のうち,適切なものはどれか。
- ア
Aの実行中にBに起動がかかると,Aを実行可能状態にしてBを実行する。
- イ
Aの実行中にBに起動がかかると,Aを待ち状態にしてBを実行する。
- ウ
Bの実行中にAに起動がかかると,Bを実行可能状態にしてAを実行する。
- エ
Bの実行中にAに起動がかかると,Bを待ち状態にしてAを実行する。
会話形式の解説
講師今回はリアルタイムOSのタスク切替えの問題です。見るところは二つあります。一つ目は、どちらのタスクが実行中のときに、どちらが起動するのか。二つ目は、CPUを明け渡したタスクがどの状態に移るのか、です。
受験者プリエンプティブという言葉がまだはっきりしません。どういう意味ですか。
講師プリエンプティブは「横取りできる」という意味です。優先度の高いタスクが起動すると、OSが実行中の低優先度タスクを強制的に中断し、CPUを高優先度のほうへ割り当てます。
受験者では、優先度の高いAが動いているところに低いBが起動したら、どうなりますか。
講師それを先に確かめましょう。BはAより優先度が低いので、AがCPUを奪われる理由はありません。Aはそのまま実行を続け、Bは実行可能状態でCPUが空くのを待ちます。
受験者すると、Aの実行中にBが起動してBに切り替わるという二つの選択肢は、Aを実行可能状態にするものも待ち状態にするものも、どちらも外れるわけですね。
講師そのとおりです。待ち状態にするほうは、Aが入出力の完了などを待っているわけでもないので、二重に合いません。残るのは、Bの実行中にAが起動する二つの選択肢です。
受験者その二つはどちらもAに切り替わっていて、違いはBの移り先だけですね。私は、中断されたのだから待ち状態かと思ってしまいました。
講師そこがこの問題の引っかけです。待ち状態とは、入出力の完了などを待っていて、すぐには実行できない状態のことです。では、中断されたBは何かを待っているでしょうか。
受験者Bは何も待っていなくて、CPUさえもらえればすぐ続きを実行できます。
講師はい。CPUを奪われただけのBは、いつでも再開できる状態にあるので、実行可能状態に戻ってCPUの割当てを待ちます。だから、Bを実行可能状態にしてAを実行する選択肢が正解で、Bを待ち状態にする選択肢は誤りです。
受験者確認させてください。優先度の高いタスクが起動したら低いほうが中断されて実行可能状態へ、低いタスクが起動しても高いほうはそのまま実行を続ける、という理解でよいですか。
講師それで合っています。補足すると、実行可能状態のタスクにCPUを割り当てて実行状態に移すことをディスパッチといいます。「CPUを奪われること」と「入出力などの完了を待つこと」を区別しておけば、状態遷移の問題で迷いにくくなります。
まとめ
優先度に基づくプリエンプティブなスケジューリングでは、優先度の高いタスクが起動すると、OSが実行中の低優先度タスクを強制的に中断してCPUを割り当て直します。中断されたタスクは何かを待っているわけではないので、待ち状態ではなく実行可能状態に戻ります。一方、優先度の低いタスクが起動しても、実行中の高優先度タスクはそのまま実行を続けます。したがって、Bの実行中にAが起動したらBを実行可能状態にしてAを実行する、が正解です。待ち状態は入出力の完了などを待っていてすぐには実行できない状態だと押さえ、「CPUを奪われた」ことと区別するのがポイントです。
解答・解説
正解はウです
この問題のテーマ
優先度に基づくプリエンプティブなスケジューリングで、高優先度のタスクが起動したときと低優先度のタスクが起動したときに、各タスクがどの状態に移るかを問う問題です。
解き方の考え方
まず、優先度の高いAが実行中なのか、低いBが実行中なのかで場合を分けます。低優先度のBが起動しただけでは、実行中のAが止められることはありません。そのため、Aの実行中を扱うアとイは、この時点で外れます。残るウとエは、CPUを奪われたBがどの状態に移るかで判断します。Bは入出力の完了などを待っているわけではないので、待ち状態ではなく実行可能状態に移ります。
選択肢ごとの解説
- ×ア Aの実行中にBに起動がかかると,Aを実行可能状態にしてBを実行する。アは、Aの実行中にBが起動するとAを実行可能状態にしてBへ切り替える、という説明です。しかし、起動したBはAより優先度が低いので、AがCPUを奪われる理由はありません。Aはそのまま実行を続け、Bは実行可能状態でCPUが空くのを待つことになります。
- ×イ Aの実行中にBに起動がかかると,Aを待ち状態にしてBを実行する。イは、Bの起動をきっかけにAを待ち状態にする、という説明です。Aより優先度の低いBが起動しても、Aの実行は中断されません。それに加えて、Aは入出力の完了などを待っているわけではないので、待ち状態に移す理由もありません。
- ○ウ Bの実行中にAに起動がかかると,Bを実行可能状態にしてAを実行する。ウは、Bの実行中に優先度の高いAが起動すると、Bを実行可能状態にしてAを実行する、という説明です。プリエンプティブ方式では、OSが実行中のBを強制的に中断し、CPUをAに割り当てます。Bはいつでも実行を再開できる状態にあるので、実行可能状態に戻ってCPUの割当てを待ちます。
- ×エ Bの実行中にAに起動がかかると,Bを待ち状態にしてAを実行する。エは、Bの実行中にAが起動したときにBを待ち状態にする、という説明です。Aへ切り替わる点は正しいものの、Bは入出力の完了などを待っているわけではありません。Bは中断されただけなので、移る先は待ち状態ではなく実行可能状態です。
補足
「中断された」という言葉から待ち状態を連想しやすいですが、CPUを奪われることと、入出力などの完了を待つことは区別して考えます。実行可能状態から実行状態に移る遷移はディスパッチと呼ばれます。
POINT
- プリエンプティブ方式では、優先度の高いタスクが起動すると、OSが実行中の低優先度タスクを強制的に中断します。
- CPUを奪われたタスクは、待ち状態ではなく実行可能状態に戻ります。
- 待ち状態は入出力の完了などを待っていて、すぐには実行できない状態です。
- 優先度の低いタスクが起動しても、実行中の高優先度タスクはそのまま実行を続けます。
