コンピューティングにおいて、プリエンプションとは、外部スケジューラがタスクの支援や協力なしに、実行中のタスクを一時的に中断し、後で再開することを意図して行う行為である。 [ 1 ] : 153このプリエンプティブスケジューラは通常、最も特権の高い保護リングで実行されるため、中断とその後の再開は非常に安全なアクションとみなされる。プロセッサの現在実行中のタスクに対するこのような変更は、コンテキストスイッチングとして知られている。
どのようなシステム設計においても、システムが実行する操作の中には、プリエンプションできないものがある。これは通常、カーネル関数やサービス割り込みに当てはまる。これらの処理が完了まで実行されない場合、デッドロックにつながる競合状態が発生する傾向がある。スケジューラがカーネル関数の処理中にタスクをプリエンプションできないようにすることで、システムの応答性を犠牲にしてカーネル設計を簡素化できる。また、システム内の特権レベルを決定するユーザーモードとカーネルモードの区別も、タスクが現在プリエンプション可能かどうかを区別するために使用できる。
ほとんどの最新のオペレーティングシステムはプリエンプティブカーネルを備えており、カーネルモードであってもタスクをプリエンプトできるように設計されています。このようなオペレーティングシステムの例としては、Solaris 2.0/SunOS 5.0、[ 2 ] Windows NT、Linuxカーネル(2.5.4以降)、[ 3 ] AIX、および一部のBSDシステム(NetBSD、バージョン5以降)などがあります。
プリエンプティブ・マルチタスクという用語は、タスクのプリエンプションを可能にするマルチタスクオペレーティングシステムと、プロセスやタスクがシステムリソースを必要としない場合に明示的にリソースを譲るようにプログラムする必要がある協調型マルチタスクシステムを区別するために使用されます。
簡単に言うと、プリエンプティブマルチタスクとは、割り込みメカニズムを用いて現在実行中のプロセスを一時停止させ、スケジューラを呼び出して次にどのプロセスを実行するかを決定する方式です。そのため、どのプロセスも常に一定量のCPU時間を確保できます。
プリエンプティブマルチタスクでは、オペレーティングシステムカーネルがコンテキストスイッチを開始してスケジューリングポリシーの優先度制約を満たし、アクティブなタスクをプリエンプトすることもあります。一般に、プリエンプションとは「優先的なタスクの奪取」を意味します。その時点で優先度の高いタスクが現在実行中のタスクを奪取する場合、それはプリエンプティブスケジューリングと呼ばれます。
「プリエンプティブ・マルチタスク」という用語は、本来の意味がより具体的で、タイムシェアリング・スケジューリング、またはタイムシェアリングと呼ばれるスケジューリング方式を指す場合に、誤って使用されることがあります。
プリエンプティブマルチタスクにより、コンピュータシステムは各プロセスに一定の稼働時間をより確実に保証できます。また、受信データなど、特定のプロセスによる即時対応が必要となる可能性のある重要な外部イベントにも迅速に対応できます。
特定の時点において、プロセスは大きく2つのカテゴリに分類できます。入力または出力を待っているプロセス(「I/Oバウンド」と呼ばれる)と、CPUを完全に利用しているプロセス(「CPUバウンド」)です。初期のシステムでは、プロセスは要求された入力(ディスク、キーボード、ネットワーク入力など)を待っている間、「ポーリング」または「ビジーウェイト」を行うことがよくありました。この間、プロセスは有用な作業を行っていませんでしたが、CPUを完全に制御していました。割り込みとプリエンプティブマルチタスクの登場により、これらのI/Oバウンドプロセスは、必要なデータが到着するまで「ブロック」または保留状態にすることができ、他のプロセスがCPUを利用できるようになりました。要求されたデータが到着すると割り込みが発生するため、ブロックされたプロセスはタイムリーに実行に戻ることが保証されました。
マルチタスク技術はもともと、複数のユーザーが1台のコンピュータを共有できるようにするために開発されたものですが、ユーザー数に関わらずマルチタスクが有用であることが明らかになりました。メインフレームからシングルユーザーのパーソナルコンピュータ、さらにはロボット宇宙船のようなユーザー制御システムに至るまで、多くのオペレーティングシステムが、さまざまな理由からマルチタスク機能の有用性を認識しています。マルチタスクによって、1人のユーザーが複数のアプリケーションを同時に実行したり、コンピュータの制御を維持しながら「バックグラウンド」プロセスを実行したりすることが可能になります。
プリエンプティブマルチタスクシステムでプロセスが実行できる期間は、一般にタイムスライスまたはクォンタムと呼ばれます。[ 1 ] : 158スケジューラは、タイムスライスごとに1回実行され、次に実行するプロセスを選択します。各タイムスライスの長さは、システムのパフォーマンスとプロセスの応答性のバランスを取る上で重要になる場合があります。タイムスライスが短すぎると、スケジューラ自体が処理時間を過剰に消費しますが、タイムスライスが長すぎると、プロセスが入力に応答するのに時間がかかります。
割り込みは、オペレーティングシステムカーネルがタイムスライスの期限が切れた際にプロセスを切り替えるためにスケジュールされており、これによりプロセッサの時間を複数のタスク間で共有することが可能になり、あたかもこれらのタスクを並列(同時)で処理しているかのような錯覚を生み出します。このような設計を制御するオペレーティングシステムは、マルチタスクシステムと呼ばれます。
現在では、 Windows、Linux(Androidを含む)、Darwin(macOSおよびiOSを含む)の最新バージョンなど、ほぼすべてのオペレーティングシステムがプリエンプティブマルチタスクをサポートしています。
プリエンプティブ マルチタスクを提供する初期のマイクロコンピュータ オペレーティングシステムは、MicrowareのOS-9で、 Motorola 6809ベースのコンピュータで利用可能でした。これには、ディスク ドライブを構成した場合にTRS-80 Color Computer 2などのホーム コンピュータも含まれ、オペレーティングシステムは Tandy からアップグレードとして提供されました。[ 4 ] Sinclair QDOS [ 6 ] : 18とAmiga上のAmigaOSも、プリエンプティブ マルチタスクをコア機能として提供するマイクロコンピュータ オペレーティングシステムでした。これらは両方とも、メモリ管理なしで Motorola 68000 ファミリーのマイクロプロセッサ上で動作しました。Amiga OSは、再配置可能なコード ブロック (Amiga の用語では「ハンク」) の動的ロードを使用して、同じフラット アドレス空間内のすべてのプロセスをプリエンプティブにマルチタスクしました。
MS-DOSやPC-DOSといったIBM PC互換機向けの初期のオペレーティングシステムは、マルチタスクを全くサポートしていませんでしたが、MP/M-86(1981年)やConcurrent CP/M-86といった代替オペレーティングシステムは、プリエンプティブマルチタスクをサポートしていました。MINIXやCoherentなどの他のUnix系システムも、1980年代のパーソナルコンピュータ上でプリエンプティブマルチタスクを提供していました。
プリエンプティブマルチタスク/マルチスレッドをネイティブにサポートする、後のMS-DOS互換システムには、Concurrent DOS、Multiuser DOS、Novell DOS(後にCaldera OpenDOSおよびDR-DOS 7.02以降と呼ばれる)などがあります。Concurrent DOS 386以降では、仮想DOSマシン上で複数のDOSプログラムを同時に実行することもできました。
限定的なプリエンプティブ マルチタスクをサポートした最初のバージョンの Windows はWindows/386 2.0で、Intel 80386のVirtual 8086 モードを使用して、プリエンプト可能な仮想 8086 マシン(一般に「DOS ボックス」として知られる)で DOS アプリケーションを実行しました。Windows 95、98、Meでは、32 ビット アプリケーションはそれぞれ別のアドレス空間で実行することでプリエンプティブになりましたが、16 ビット アプリケーションは下位互換性のために協調動作のままでした。[ 7 ] Windows 3.1x (保護モード) では、カーネルと仮想デバイス ドライバはプリエンプティブに実行されましたが、すべての 16 ビット アプリケーションは非プリエンプティブで、同じアドレス空間を共有していました。
プリエンプティブマルチタスクは、Windows NT(全バージョン)、OS/2(ネイティブアプリケーション)、UnixおよびUnixライクなシステム( Linux、BSD、macOSなど)、VMS、OS/360、その他多くの学術機関や中規模から大規模企業向けに設計されたオペレーティングシステムで常にサポートされてきました。
初期のクラシック Mac OSはマルチタスクを全くサポートしておらず、協調型マルチタスクはSystem Software 5のMultiFinderを介して利用可能になり、 System 7で標準になりました。クラシック Mac OS の協調型マルチタスクをプリエンプティブ モデルにアップグレードする計画もありましたが ( Mac OS 9には限定的な意味でプリエンプティブ API が存在していました[ 8 ] )、これらの計画はMac OS X (現在は macOS と呼ばれています)に取って代わられました。Mac OS Xは、古い Mac System スタイルとNeXTSTEPのハイブリッドであり、 Machカーネルをベースとし、常に Unix ライクなプリエンプティブ マルチタスクを提供してきたBSDから部分的に派生したオペレーティングシステムです。