プリエンプション

プリエンプションとは



プリエンプション(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 OSMS-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と比較して制約が多い場合があります。

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。