TL;DR

OS が CPU の割り当てを管理し、状況の変化に応じてタスクを切り替える方式。

なぜ必要か

Wikipedia によると、タスクが自分から CPU を手放す協調的マルチタスクでは、手放さないタスクがプロセッサを使い続けてしまう。プリエンプティブなら、どのプロセスにも定期的に CPU の時間が回り、外部からのイベントにもすぐ応答できる。I/O を待つプロセスはビジーウェイトせずに待機状態になれるので、その間は他のプロセスが CPU を使える。

仕組み

Wikipedia によると、プリエンプションとは、外部のスケジューラが実行中のタスクを、そのタスクの協力なしに一時的に中断し、後で再開することである。割り込みで実行中のプロセスを止めてスケジューラを呼び出し、スケジューラが次に動かすプロセスを選ぶ。各プロセスはタイムスライス(クォンタム)と呼ばれる一定の時間だけ動き、時間が切れるとコンテキストスイッチで別のプロセスに切り替わる。

注意点

Wikipedia によると、タイムスライスが短すぎるとスケジューラが処理時間を食い、長すぎると入力への応答が遅くなる。カーネル内の処理には、中断すると競合状態やデッドロックを起こしうるものがある。多くの現代的な OS は、カーネルモードでもタスクを中断できるプリエンプティブカーネルを採用している。

関連

出典