プリエンプションとは
プリエンプション(preemption)とは、
マルチタスクを実行する
コンピュータシステムにおいて、実行中のタスクを一時的に中断させる動作のことです。この中断はタスク自身の協力なしに、システム側が行う点が特徴です。中断されたタスクは、後で中断した時点から処理を再開します。この一連の動作は、
コンテキストスイッチと呼ばれます。
プリエンプションは、通常、システムの一部であるプリエンプティブスケジューラによって行われます。スケジューラは、システム内の他のタスクに割り込みをかけ、それらのタスクを後で再開させることができます。プリエンプションの「プリエンプト」とは、「先取りする」「差し替える」という意味を持ちます。
ユーザーモードとカーネルモード
どのようなシステム設計でも、プリエンプションが不可能な操作が存在します。これらは通常、
カーネル機能や割り込み処理であり、完了まで実行する必要がある操作です。もし中断を許可すると、競合状態やデッドロックを引き起こす可能性があります。
タスクが
カーネル機能を実行中は、スケジューラがプリエンプションをしないようにすることで、システム全体の反応性は多少犠牲になりますが、
カーネル設計は簡略化されます。CPUモード(ユーザーモードと
カーネルモード)も、タスクがプリエンプション可能かどうかを判断する基準の一つです。
一部のシステムでは、
カーネルモードのタスクであってもプリエンプションが可能な「プリエンプティブ
カーネル」を採用しています。例えば、
Linuxカーネル2.6や一部のBSD系OSが該当します。
一方で、マイクロ
カーネル設計を採用するシステムでは、反応性を向上させ、場合によっては
プロセスのプリエンプションの必要性そのものを削減します。例えば、
Mach 3.0をリアルタイムに対応させたRT-
Machがこの例です。
プリエンプティブ
マルチタスクは、協調的
マルチタスクと比較するための用語です。協調的
マルチタスクでは、各タスクがシステムリソースを必要としなくなったときに自発的に解放する必要があります。
プリエンプティブ
マルチタスクでは、割り込み機構を用いて実行中の
プロセスを中断させ、スケジューラを呼び出して次に実行する
プロセスを決定します。これにより、CPU時間がすべての
プロセスに分配されるようになります。
オペレーティングシステムの
カーネルは、優先順位に基づいて
コンテキストスイッチを行い、実行中のタスクをプリエンプトできます。高い優先度のタスクが実行されるように、現在実行中のタスクから権限を奪うのがプリエンプティブ
スケジューリングです。
プリエンプティブ
マルチタスクは、各
プロセスに処理時間の「スライス」が割り当てられることをより確実に保証します。また、重要なデータが到着した場合、それを迅速に処理する
プロセスに通知することも可能です。
プロセスは、入出力を待っている(I/Oバウンド)か、CPUを使い続けている(CPUバウンド)かのどちらかに分類できます。初期のシステムでは、入力を待っている
プロセスがビジーウェイト状態になり、CPUを無駄に使っていました。プリエンプティブ
マルチタスクと割り込みの導入により、I/Oバウンドな
プロセスはデータが到着するまで「ブロック」され、他の
プロセスがCPUを使用できるようになりました。データが到着すると、割り込みが発生し、ブロックされていた
プロセスが実行可能状態に戻ります。
タイムスライス
タイムスライスとは、プリエンプティブ
マルチタスクシステムにおいて、
プロセスが一度に実行される時間の長さのことです。スケジューラはタイムスライス間隔で起動し、次に実行する
プロセスを選択します。タイムスライスが短すぎると、スケジューラの処理時間が大きくなり、長すぎると外部イベントへの反応が遅れます。
カーネルは、
タイマーまたは
クロック割り込みをスケジュールして、タイムスライスが経過したタイミングで
プロセスを切り替えます。これにより、プロセッサの時間が複数のタスク間で共有され、同時並行的に実行されているように見えます。このような設計のOSを
マルチタスクOSと呼びます。
プリエンプティブマルチタスクをサポートするシステム
プリエンプティブな
オペレーティングシステムとしては、
AmigaOS、NEXTSTEP、
Windows NT系(XPやVistaなど)、Windows CE、
Linux、BSD系、macOS(iOSを含む)、
BeOS、Windows 95/98(32ビットアプリケーションのみ)などがあります。
UNIXやその系統のシステム、VMSなどの科学技術計算や大規模ビジネス用システムも古くからプリエンプティブ
マルチタスクをサポートしていましたが、高価なライセンスやハードウェアが必要でした。また、ユーザモードでのスレッドはプリエンプト可能でしたが、
カーネルモードのスレッドのプリエンプションは困難でした。
協調的な
オペレーティングシステムとしては、Windows 1.x, 2.x, 3.x、Windows 95/98(16ビットアプリケーションの場合)、NetWare、
Classic Mac OS(System 5.0以降)などがあります。
マルチタスクでないOSとしては、古い
Classic Mac OS、
MS-DOS、
コモドール64のOSなどがあります。
AmigaOSは、一般ユーザー向けに広く利用可能となった初期のプリエンプティブ
マルチタスクシステムです。初期の
IBM PC用
オペレーティングシステムである
MS-DOSは、
マルチタスクをサポートしていませんでした。Windowsは初期には協調的
マルチタスクを採用していましたが、後にプリエンプティブ
マルチタスクを導入しました。
Windows NT系は最初からプリエンプティブ
マルチタスクをサポートし、これは現在も引き継がれています。
Classic Mac OSでは、プリエンプティブ
マルチタスクへの移行計画がありましたが、Mac OS Xへの移行により立ち消えとなりました。Mac OS Xは、BSDの流れを汲むDarwin
カーネルをベースにしており、プリエンプティブ
マルチタスクをサポートしています。
UNIX系OSでは、
Solarisが初めて本格的なプリエンプティブ
カーネルを実現しました。これにより、
カーネルのほぼ全域でプリエンプションが可能になり、リアルタイム性が向上しました。これらの変更は、後に
Linuxや一部のBSD系OSにも実装されています。
リアルタイムOS(RTOS)は、
カーネル内を含め、いつでもタスクをプリエンプトできるように設計されており、優先度に従ってタスクがスケジュールされます。RTOSは、応答遅延の保証が目的であるため、汎用OSと比較して制約が多い場合があります。