「非プリエンプティブ」、「プリエンプティブ」、「オプションのプリエンプティブ」コアの違いは何ですか?
誰かがこれについて明らかにできることを願っています。
答え1
プリエンプティブカーネルでは、カーネルモードで実行されているプロセスをカーネル機能の実行中に他のプロセスに置き換えることができます。
これはカーネルモードで実行されるプロセスにのみ適用され、ユーザーモードでプロセスを実行するCPUは「アイドル」と見なされます。ユーザーモードプロセスがカーネルからサービスを要求するには、カーネルが処理できる例外を発生させる必要があります。
たとえば、
プロセスはA
例外ハンドラを実行し、B
IRQ要求によってプロセスが起動し、カーネルはそのプロセスを(強制プロセス切り替え)A
に置き換えます。B
プロセスはA
まだ完了していません。その後、スケジューラはプロセスにA
CPU 時間があるかどうかを判断します。
非プリエンプティブコアでは、プロセスはA
完了するまで、または他のプロセスがそれを中断することを自発的に決定するまで、すべてのプロセッサ時間を使用します(スケジュールされたプロセス切り替え)。
今日のLinuxベースのオペレーティングシステムには、通常、完全にプリエンプティブなカーネルは含まれておらず、中断することなく実行する必要があるいくつかの重要な機能がまだあります。だから私はこれを「オプションのカーネルプリエンプション」と呼ぶことができると思います。
それに加えて、Linuxカーネルを(ほぼ)完全にプリエンプティブにする方法があります。
答え2
プリエンプションは、->優先順位の高いジョブのために現在スケジュールされているジョブをプリエンプトまたは停止するオペレーティングシステムの機能です。スケジューリングは、プロセスまたはI/Oスケジューリングのいずれかですが、これに限定されません。
Linuxでは、ユーザー空間プログラムは常にプリエンプション可能です。カーネルは通常のクロックティックを使用してユーザー空間プログラムを中断し、別のスレッドに切り替えます。したがって、カーネルは、ユーザー空間プログラムが明示的にプロセッサを解放するのを待ちません(協力的なマルチタスクの場合のように)。これは、ユーザー空間プログラムの無限ループがシステムをブロックしないことを意味します。
しかし、2.6カーネル以前は、カーネル自体がプリエンプションできませんでした。スレッドがカーネルに入ると、他のスレッドを実行するために先取りできませんでした。しかし、カーネルのプリエンプションの欠如により、待ち時間とスケーラビリティに関するいくつかの問題が発生します。したがって、カーネル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/
答え3
プリエンプティブカーネルを使用すると、カーネルモードで実行中にプロセスをプリエンプションできます。非プリエンプティブカーネルは、カーネルモードで実行されているプロセスがプリエンプトされることを許可しません。カーネルモードプロセスは、カーネルモードを終了またはブロックするか、自発的にCPU制御を放棄するまで実行されます。非プリエンプティブカーネルは一度に1つのプロセスのみがカーネルでアクティブになるため、本質的にカーネルデータ構造の競合状態の影響を受けません。プリエンプティブカーネルについても同じことは言えないため、共有カーネルデータが競合状態の影響を受けないように注意深く設計する必要があります。 SMP アーキテクチャ用のプリエンプティブカーネルの設計は、これらの環境では、2 つのカーネルモードプロセスが異なるプロセッサで同時に実行できるため、特に困難です。プリエンプティブカーネルは、リアルタイムプロセスが現在のカーネルで実行されているプロセスをプリエンプトできるようにするため、リアルタイムプログラミングに適しています。さらに、プリエンプティブカーネルは、プロセッサを待機プロセスに引き渡す前に、カーネルモードプロセスがランダムに長時間実行されるリスクが少ないため、応答性が良好である可能性がある。もちろん、カーネルコードがこのように動作しないように設計することで、この効果を最小限に抑えることができます。この章の後半では、さまざまなオペレーティングシステムがカーネルでプリエンプションを管理する方法について説明します。