OSが実行中のタスクを強制的に中断して別のタスクに切り替える方式。
プリエンプティブ方式(preemptive=先取り・横取りの意味)とは、OS(=コンピュータ全体を管理する基本ソフト)が主導権を持ち、実行中のタスクを強制的に中断して別のタスクに切り替える方式のことです。タスク自身の都合に関係なく、OSの判断で切り替えます。
身近な例で考えると、会議で1人が話しすぎたら司会者が「時間です、次の方どうぞ」と区切るのに似ています。話している人がまだ続けたくても、司会者(=OS)が時間で強制的に交代させます。これによって、全員に発言の順番が公平に回ってきます。
上のツールで▶ボタンを押すと、実行中のタスクAをOSが強制的に中断し、別のタスクBへ切り替える流れを確認できます。
強制切替のきっかけになるのがタイムスライス(=1つのタスクが連続でCPUを使える上限時間。例えば10ミリ秒など)です。これが満了すると、次の流れで切り替わります。
・① タイムスライス満了:割り当てられた持ち時間を使い切る
・② タイマ割込み:ハードウェアからOSへ「時間ですよ」という合図(割込み)が入る
・③ OSが介入:実行中のタスクを実行可能状態へ強制的に戻す
・④ 次のタスクへ:別のタスクをCPUへ割り当てる
ここで重要なのがタイマ割込みです。一定時間ごとに鳴る目覚まし時計のように、決まった間隔でOSへ合図を送ります。この合図があるおかげで、タスクが自分で手放さなくてもOSが必ず主導権を取り戻せます。
タイムスライス満了だけでなく、より優先度の高いタスクが到着したときにも切り替わります。例えば緊急の処理が現れたら、今動いているタスクを止めてでもそちらを先に実行します。上のツールのSTEP3で、タイマ割込みが発生してOSが介入する様子を確認できます。
対になる方式がノンプリエンプティブ方式です。プリエンプティブはOSが強制的に切り替えるのに対し、ノンプリエンプティブはタスクが自分から手放すまで切り替えない点が根本的に違います。
| 項目 | プリエンプティブ | ノンプリエンプティブ |
|---|---|---|
| 切替する主体 | OSが強制的に切替 | タスクが自発的に手放す |
| 応答性 | 良い | 悪くなりやすい |
| 暴走タスク | 強制中断で独占を防げる | 全体が止まりうる |
プリエンプティブはOSが横やりを入れられるので、反応が速く(応答性が良い)、1つのタスクが暴走してCPUを独占し続けるのを防げます。今の多くのOSはこの方式を採用しています。「司会者が時間で交代させる会議(プリエンプティブ)」と「話し手が自分でやめるまで待つ会議(ノンプリエンプティブ)」と対比すると整理しやすいです。
結論:タスク自身に任せると、いつまでもCPUを手放さない可能性があるからです。プログラムは「CPUをどのくらい使ったか」を自分で数えていません。悪意のあるプログラムや、設計ミスで無限ループに入ったプログラムが現れても、ノンプリエンプティブ方式では誰も止められません。
だからOSがタイマ割込み(=一定時間ごとに鳴る「時間ですよ」という合図)を使って、プログラムの意思に関係なく強制的に主導権を取り戻す仕組みが必要になります。これがプリエンプティブ方式の根本的な理由です。
・ノンプリエンプティブ:A が終わるまでB・Cは永遠に待たされる可能性がある
・プリエンプティブ:OSが時間で区切るので、B・CにもCPUが公平に回ってくる
現代のスマートフォンやパソコンでは、音楽を聞きながらブラウザを開き、LINEの通知も受け取れます。これはプリエンプティブ方式によって複数のタスクが非常に短い時間で交互にCPUを使い、人間の目には「同時に動いている」ように見えているからです。
プリエンプティブ方式を理解するには、タスク(プログラム)が取る3つの状態を知っておくと整理しやすいです。
・実行可能(ready):CPUが空けばすぐ動ける状態。キューに並んで順番待ち
・実行中(running):現在CPUを使って処理を進めている状態
・待機(waiting):ファイル読み込みなど外部の処理(I/O=入出力)が終わるのを待っている状態
プリエンプティブ方式での強制中断とは、「実行中」のタスクを「実行可能」へ戻す操作のことです。タスクは終わってもなく、I/O待ちでもなく、ただ「一旦CPUを返してキューに戻る」状態になります。そして次の順番が来たときに再び「実行中」に移ります。
上のツールのインタラクティブ図では、実行可能キューと CPU 枠の間でタスクが行き来する様子がこの状態遷移そのものです。赤い「強制的に実行可能へ戻す」矢印が、まさに強制中断の瞬間を表しています。