FE EXAM

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

OSが実行中のタスクを強制的に中断して別のタスクに切り替える方式。

INTERACTIVE VISUALIZATION
実行中
強制中断
実行可能
フェーズ
idle
実行中のタスク
タイマ割込み
シナリオ
ステップ1 / 6
STEP 1/6実行を待つタスクたちまだ何も始まっていない状態です。これからタスクA(=CPUに実行してほしい処理のかたまり)がCPU(=中央処理装置。計算を行う部品)で動き、後ろにタスクBが順番を待ちます。
OS(タイマ待機中)一定時間ごとに監視実行可能キューA実行可能B実行可能CPU空き
強制切替の流れ
① タスクAが 実行中
② タイムスライス満了 → タイマ割込み
③ OSがAを 強制中断(実行可能へ戻す)
④ 別タスクBを CPUへ割り当て
解説

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

A実行OSが強制中断切替B実行

プリエンプティブ方式(preemptive=先取り・横取りの意味)とは、OS(=コンピュータ全体を管理する基本ソフト)が主導権を持ち、実行中のタスクを強制的に中断して別のタスクに切り替える方式のことです。タスク自身の都合に関係なく、OSの判断で切り替えます。

身近な例で考えると、会議で1人が話しすぎたら司会者が「時間です、次の方どうぞ」と区切るのに似ています。話している人がまだ続けたくても、司会者(=OS)が時間で強制的に交代させます。これによって、全員に発言の順番が公平に回ってきます。

上のツールで▶ボタンを押すと、実行中のタスクAをOSが強制的に中断し、別のタスクBへ切り替える流れを確認できます。

強制切替の仕組み

強制切替のきっかけになるのがタイムスライス(=1つのタスクが連続でCPUを使える上限時間。例えば10ミリ秒など)です。これが満了すると、次の流れで切り替わります。
① タイムスライス満了:割り当てられた持ち時間を使い切る
② タイマ割込み:ハードウェアからOSへ「時間ですよ」という合図(割込み)が入る
③ OSが介入:実行中のタスクを実行可能状態へ強制的に戻す
④ 次のタスクへ:別のタスクをCPUへ割り当てる

ここで重要なのがタイマ割込みです。一定時間ごとに鳴る目覚まし時計のように、決まった間隔でOSへ合図を送ります。この合図があるおかげで、タスクが自分で手放さなくてもOSが必ず主導権を取り戻せます。

タイムスライス満了だけでなく、より優先度の高いタスクが到着したときにも切り替わります。例えば緊急の処理が現れたら、今動いているタスクを止めてでもそちらを先に実行します。上のツールのSTEP3で、タイマ割込みが発生してOSが介入する様子を確認できます。

⚖️
ノンプリエンプティブとの違い

対になる方式がノンプリエンプティブ方式です。プリエンプティブはOSが強制的に切り替えるのに対し、ノンプリエンプティブはタスクが自分から手放すまで切り替えない点が根本的に違います。

項目プリエンプティブノンプリエンプティブ
切替する主体OSが強制的に切替タスクが自発的に手放す
応答性良い悪くなりやすい
暴走タスク強制中断で独占を防げる全体が止まりうる

プリエンプティブはOSが横やりを入れられるので、反応が速く(応答性が良い)、1つのタスクが暴走してCPUを独占し続けるのを防げます。今の多くのOSはこの方式を採用しています。「司会者が時間で交代させる会議(プリエンプティブ)」と「話し手が自分でやめるまで待つ会議(ノンプリエンプティブ)」と対比すると整理しやすいです。

💡
なぜOSが主導権を持つ必要があるのか

タスクA(ずっと実行中)手放すまで独占B 待機C 待機ノンプリエンプティブ(独占の危険)A 実行B 実行A 戻るプリエンプティブ(公平に回る)

結論:タスク自身に任せると、いつまでもCPUを手放さない可能性があるからです。プログラムは「CPUをどのくらい使ったか」を自分で数えていません。悪意のあるプログラムや、設計ミスで無限ループに入ったプログラムが現れても、ノンプリエンプティブ方式では誰も止められません。

だからOSがタイマ割込み(=一定時間ごとに鳴る「時間ですよ」という合図)を使って、プログラムの意思に関係なく強制的に主導権を取り戻す仕組みが必要になります。これがプリエンプティブ方式の根本的な理由です。
ノンプリエンプティブ:A が終わるまでB・Cは永遠に待たされる可能性がある
プリエンプティブ:OSが時間で区切るので、B・CにもCPUが公平に回ってくる

現代のスマートフォンやパソコンでは、音楽を聞きながらブラウザを開き、LINEの通知も受け取れます。これはプリエンプティブ方式によって複数のタスクが非常に短い時間で交互にCPUを使い、人間の目には「同時に動いている」ように見えているからです。

🔄
タスクの3つの状態

実行可能実行中待機割当て強制中断I/O待ちI/O完了強制中断はOSが「実行中 → 実行可能」に戻す

プリエンプティブ方式を理解するには、タスク(プログラム)が取る3つの状態を知っておくと整理しやすいです。
実行可能(ready):CPUが空けばすぐ動ける状態。キューに並んで順番待ち
実行中(running):現在CPUを使って処理を進めている状態
待機(waiting):ファイル読み込みなど外部の処理(I/O=入出力)が終わるのを待っている状態

プリエンプティブ方式での強制中断とは、「実行中」のタスクを「実行可能」へ戻す操作のことです。タスクは終わってもなく、I/O待ちでもなく、ただ「一旦CPUを返してキューに戻る」状態になります。そして次の順番が来たときに再び「実行中」に移ります。

上のツールのインタラクティブ図では、実行可能キューと CPU 枠の間でタスクが行き来する様子がこの状態遷移そのものです。赤い「強制的に実行可能へ戻す」矢印が、まさに強制中断の瞬間を表しています。

練習問題

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

Q1.プリエンプティブ方式の説明として最も適切なものはどれか。
A.OSが実行中のタスクを強制的に中断して別のタスクに切り替える方式
B.実行中のタスクが自分から手放すまで切り替えない方式
C.タスクを1つずつ完了させてから次に進む方式
D.複数のCPUに同じ処理を同時にさせる方式
Q2.プリエンプティブ方式でタスクが強制的に切り替わるきっかけとして正しいものはどれか。
A.実行中のタスクが処理を完了したときだけ
B.タイムスライスの満了によるタイマ割込み、または高優先度タスクの到着
C.ユーザーがマウスを動かしたとき
D.メモリが不足したときだけ
Q3.プリエンプティブ方式とノンプリエンプティブ方式の違いとして正しいものはどれか。
A.プリエンプティブはタスクが自発的に手放すまで切り替えない
B.ノンプリエンプティブはOSが強制的に切り替える
C.プリエンプティブはOSが強制切替するため応答性が良く、暴走タスクの独占を防げる
D.両者に動作上の違いはない

関連コンテンツ