プリエンプション(英: preemption)は、マルチタスクのコンピュータシステムが実行中のタスクを一時的に中断する動作であり、基本的にそのタスク自体の協力は不要で、後でそのタスクを再実行するという意味も含む。このような動作をコンテキストスイッチと呼ぶ。通常、保護されたタスクか、システムの一部であるプリエンプティブスケジューラが行う。それらは、システム内の他のタスクに割り込み、後でそれらタスクを再開させることができる。「プリエンプト」とは「先取りする、差し替える」の意。 どんなシステム設計でも、プリエンプション不可能な操作が存在する。それは通常カーネルの機能や割り込み処理であり、それらを完了まで実行できるようにしておかないと、競合状態が発生しやすくなり、デッドロックを誘発する。タスクがカーネル機能を処理中は、スケジューラがプリエンプションできないようにすることで、システムの反応性を若干犠牲にするが、カーネル設計を簡略化することになる。システムの特権レベルを指定するCPUモード(ユーザモードとカーネルモード)も、タスクがプリエンプション可能かどうかを判断する基準のひとつとなる。 一部のシステムはプリエンプティブ・カーネル[1]であり、カーネルモードのタスクであってもプリエンプション可能となっている。例えば、Linuxカーネル 2.6 や一部のBSD系がある。 別のシステムは、マイクロカーネル設計で反応性を向上させ、場合によってはプロセスのプリエンプションの必要性そのものを実質的に削減している。実装例としてMach 3.0をリアルタイムに対応させたRT-Mach プリエンプティブ・マルチタスク[2]とは、協調的マルチタスクとプリエンプション可能なマルチタスクを区別するための用語である。協調的マルチタスクは、各タスクがシステムリソースを必要としないときにそれを自発的に解放するようプログラムされている方式である。 簡単に言えば、プリエンプティブ・マルチタスクは、割り込み機構を使って現在実行中のプロセスを中断させ、スケジューラを呼び出して次に実行すべきプロセスを決定させる。それによってある一定時間内で、CPU時間は全てのプロセスに(配分はどうであれ)分配される。 プリエンプティブ・マルチタスクでは、オペレーティングシステムのカーネルは優先順位に従ったスケジューリングがなされるようにコンテキストスイッチを自発的に行うこともでき、それが実行中タスクのプリエンプションとなる。高い優先順位のタスクが実行されるように現在実行中のタスクから権限を奪うのが、プリエンプティブ・スケジューリングである。 プリエンプティブ・マルチタスクは、各プロセスに処理時間の「スライス」が割り当てられることをより確実に保証することができる。また新たに重要なデータが到着して、即座にそれを処理するプロセスに通知しなければならないような場合に素早く対応できる。 プロセスは任意の時点で、2つに分類できる。1つは入出力を待っているプロセス(I/Oバウンド
ユーザーモードとカーネルモード
プリエンプティブ・マルチタスク
メインフレームからシングルユーザーのパーソナルコンピュータ、さらにはユーザーのいない制御システムまで、マルチタスクは様々な理由で便利であるため、オペレーティングシステムの機能として採用されている。マルチタスクは、シングルユーザーにとっては複数のアプリケーションを同時に実行可能とする。 「タイムスライス(time slice)」とは、プリエンプティブ・マルチタスクのシステムでプロセスが一度に実行される期間(時間)を意味する。スケジューラはタイムスライス間隔で起動され、次に実行すべきプロセスを選択する。タイムスライスが短すぎると、スケジューラが消費する時間の割合が大きくなるが、逆にタイムスライスが長すぎると、外部イベントに即座に反応できなくなる。 タイムスライスが経過したタイミングでプロセス間の切り替えを行うため、カーネルはタイマーまたはクロック割り込みをスケジュールする。
タイムスライス