回答:
プリエンプティブカーネルでは、カーネルモードで実行中のプロセスを、カーネル機能の途中で別のプロセスに置き換えることができます。
これは、カーネルモードで実行されているプロセスにのみ適用され、ユーザーモードでプロセスを実行しているCPUは「アイドル」と見なされます。ユーザーモードプロセスがカーネルにサービスを要求する場合、カーネルが処理できる例外を発行する必要があります。
例として:
プロセスA
は例外ハンドラを実行し、プロセスB
はIRQリクエストによって呼び起こされ、カーネルはプロセスA
をB
(強制プロセス切り替え)に置き換えます。プロセスA
は未完成のままです。その後、プロセスA
がCPU時間を取得するかどうかをスケジューラが決定します。
非プリエンプティブカーネルでは、プロセスA
は終了するまで、または他のプロセスに割り込みを許可することを自発的に決定するまで、すべてのプロセッサ時間を使用します(計画されたプロセス切り替え)。
現在のLinuxベースのオペレーティングシステムには、通常、完全なプリエンプティブカーネルは含まれていません。中断することなく実行する必要がある重要な機能がまだあります。したがって、これを「選択的プリエンプティブカーネル」と呼ぶことができると思います。
それとは別に、Linuxカーネルを(ほぼ)完全にプリエンプティブにするアプローチがあります。
プリエンプション--優先度の高いタスクを優先して、現在スケジュールされているタスクをプリエンプトまたは停止するオペレーティングシステムの機能。スケジューリングは、プロセスまたはI / Oスケジューリングなどのいずれかです(ただし、これらに限定されません)。
Linuxでは、ユーザー空間プログラムは常にプリエンプティブでした。カーネルは、通常のクロックティックを使用して、ユーザー空間プログラムに割り込み、他のスレッドに切り替えます。そのため、カーネルはユーザー空間のプログラムが明示的にプロセッサを解放するのを待ちません(これは協調マルチタスクの場合です)。これは、ユーザー空間プログラムの無限ループがシステムをブロックできないことを意味します。
ただし、2.6カーネルまでは、カーネル自体は予知可能ではありませんでした。1つのスレッドがカーネルに入るとすぐに、他のスレッドを実行することはできません。しかし、カーネルにプリエンプションが存在しないため、レイテンシとスケーラビリティに関していくつかの問題が発生しました。そのため、2.6カーネルにはカーネルプリエンプションが導入されており、CONFIG_PREEMPTオプションを使用して有効または無効にできます。CONFIG_PREEMPTが有効になっている場合、コードがローカル割り込みを無効にしている場合を除き、どこでもカーネルコードをプリエンプトできます。コード内の無限ループは、システム全体をブロックできなくなりました。CONFIG_PREEMPTが無効になっている場合、2.4の動作が復元されます。
再引用およびフォーマット:http : //www.linuxquestions.org/questions/linux-general-1/pre-emptive-vs-non-pre-emptive-kernel-582437/
プリエンプティブカーネルを使用すると、カーネルモードで実行中のプロセスをプリエンプトすることができます。非プリエンプティブカーネルでは、カーネルモードで実行されているプロセスをプリエンプトすることはできません。カーネルモードプロセスは、カーネルモードを終了するか、ブロックするか、CPUの制御を自発的に得るまで実行されます。明らかに、一度にカーネルでアクティブになるプロセスは1つだけなので、ノンプリエンプティブカーネルは本質的にカーネルデータ構造の競合状態から解放されます。プリエンプティブカーネルについても同じことは言えません。したがって、共有カーネルデータに競合状態がないように注意深く設計する必要があります。これらの環境では、2つのカーネルモードプロセスを異なるプロセッサで同時に実行できるため、SMPアーキテクチャ向けのプリエンプティブカーネルの設計は特に困難です。プリエンプティブカーネルは、リアルタイムプログラミングにより適しています。リアルタイムプロセスがカーネルで現在実行中のプロセスを横取りできるようにするためです。さらに、プロセッサを待機中のプロセスに放棄する前にカーネルモードプロセスが任意の期間実行されるリスクが少ないため、プリエンプティブカーネルの応答性が向上する場合があります。もちろん、このような動作をしないカーネルコードを設計することにより、この影響を最小限に抑えることができます。この章の後半では、さまざまなオペレーティングシステムがカーネル内のプリエンプションをどのように管理するかについて説明します。このような動作をしないカーネルコードを設計することにより、この影響を最小限に抑えることができます。この章の後半では、さまざまなオペレーティングシステムがカーネル内のプリエンプションをどのように管理するかについて説明します。このような動作をしないカーネルコードを設計することにより、この影響を最小限に抑えることができます。この章の後半では、さまざまなオペレーティングシステムがカーネル内のプリエンプションをどのように管理するかについて説明します。