FE EXAM

ノンプリエンプティブ方式(non-preemptive)

実行中のタスクが自分からCPUを手放すまで、OSが切り替えを行わない方式。

INTERACTIVE VISUALIZATION
実行中
自発解放
実行可能
フェーズ
idle
実行中のタスク
CPUの解放
シナリオ
ステップ1 / 5
STEP 1/5実行を待つタスクたちまだ何も始まっていない状態です。これからタスクA(=CPUに実行してほしい処理のかたまり)がCPU(=中央処理装置。計算を行う部品)で動き、後ろにタスクBが順番を待ちます。
OS(割り込まない)強制中断はしない実行可能キューA実行可能B実行可能CPU空き
自発的切替の流れ
① タスクAが 実行中(OSは割り込まない)
② Aが処理完了、または I/O待ち に入る
③ Aが 自発的にCPUを解放
④ 次のタスクBへ 切替
解説

📌
ノンプリエンプティブ方式とは

A実行Aが自ら手放すB実行

ノンプリエンプティブ方式(non-preemptive=先取り・横取りをしない、の意味)とは、実行中のタスクが完了するか、I/O待ちなどで自発的にCPU(=中央処理装置。計算を行う部品)を手放すまで、OS(=コンピュータ全体を管理する基本ソフト)が強制的に切り替えない方式のことです。

身近な例で考えると、カラオケで1曲歌い終わるまでマイクを次の人に渡さないのに似ています。歌っている本人が「歌い終わった」「ちょっと休む」と自分でマイクを置くまで、周りは横から取り上げません。タスクが自分の区切りで手放すのを待つわけです。

上のツールで▶ボタンを押すと、実行中のタスクAが自分からCPUを解放し、次のタスクBへ切り替わる流れを確認できます。

🔄
自発的切替の仕組み

切り替えが起こるのは、実行中のタスクが自分からCPUを手放したときだけです。手放すきっかけは主に次のとおりです。
処理の完了:タスクがやるべき仕事を終え、もうCPUが要らなくなる
I/O待ちに入る:ディスクやネットワークの読み書きの完了を待つため、自らシステムコール(=OSへの機能の依頼)で待ち状態に入る

ここでのポイントは、OSが横から強制的に止めることをしない点です。タイマで時間切れにして取り上げる、ということがありません。あくまでタスク側が「もう使い終わった」と区切りをつけたタイミングで、初めて次のタスクへバトンが渡ります。

言い換えると、各タスクの「お行儀の良さ」に頼った方式です。タスクが適度に処理を区切ってCPUを手放してくれることを前提にしています。上のツールのSTEP3で、タスクAが自ら解放するタイミングを確認できます。

⚖️
利点と欠点

利点
・切替の制御が単純で分かりやすい
・コンテキストスイッチ(=作業状態の保存・復元)が少なく、その分の手間が小さい
欠点
・1つのタスクが長く占有すると他が待たされる(応答性が悪い)
・暴走したタスクがあると全体が止まりうる

ノンプリエンプティブ方式の良いところは仕組みの単純さです。OSが横やりを入れないので、切替の管理がシンプルで、状態の保存・復元の回数も少なく済みます。

一方の弱点は、1つのタスクがCPUを長く握りっぱなしにできてしまうことです。お行儀の悪いタスクや、無限ループに陥った暴走タスクがあると、他のタスクがいつまでも順番待ちのまま止まってしまいます。

これに対し、プリエンプティブ方式はOSがタイマ割込みで強制的に切り替えるため、1タスクの独占を防げて応答性が良くなります。「歌い終わるまで待つカラオケ(ノンプリエンプティブ)」と「持ち時間で司会者が交代させる発表(プリエンプティブ)」と対比すると、両者の長所短所が整理しやすいです。

練習問題

🎯
基本情報技術者 練習問題

Q1.ノンプリエンプティブ方式の説明として最も適切なものはどれか。
A.実行中のタスクが自分からCPUを手放すまで、OSが切り替えを行わない方式
B.OSがタイマ割込みで実行中のタスクを強制的に中断する方式
C.複数のタスクを同時に1つのCPUで並列実行する方式
D.タスクの優先度を時間とともに自動で上げていく方式
Q2.ノンプリエンプティブ方式でタスクが切り替わるタイミングとして正しいものはどれか。
A.一定時間ごとのタイマ割込みが入ったとき
B.実行中のタスクが処理を完了する、または自らI/O待ちなどに入ったとき
C.より優先度の高いタスクが到着した瞬間に必ず
D.OSが任意のタイミングで強制的に
Q3.ノンプリエンプティブ方式の利点と欠点として正しいものはどれか。
A.利点は切替制御が単純なこと、欠点は1タスクの長時間占有で応答性が悪くなること
B.利点は応答性が常に良いこと、欠点はコンテキストスイッチが多いこと
C.利点も欠点もプリエンプティブ方式とまったく同じ
D.利点は暴走タスクを必ず止められること、欠点は実装が複雑なこと

関連コンテンツ