it-swarm-ja.tech

非プリエンプティブ、プリエンプティブ、および選択的プリエンプティブカーネルの違いは何ですか?

「非プリエンプティブ」、「プリエンプティブ」、「選択的プリエンプティブ」のカーネルの違いは何ですか?

誰かがこれにいくつかの光を当てることができることを願っています。

19
Sen

プリエンプティブカーネルでは、カーネルモードで実行されているプロセスを、カーネル関数の途中で別のプロセスに置き換えることができます。

これはカーネルモードで実行されているプロセスにのみ適用され、ユーザーモードでプロセスを実行しているCPUは「アイドル」と見なされます。ユーザーモードプロセスがカーネルにサービスを要求する場合は、カーネルが処理できる例外を発行する必要があります。

例として:

プロセスAは例外ハンドラーを実行し、プロセスBはIRQ要求によって起動され、カーネルはプロセスABに置き換えます(強制プロセス切り替え)。プロセスAは未完成のままです。スケジューラは、プロセスAがCPU時間を取得するかどうかを後で決定します。

非プリエンプティブカーネルでは、プロセスAは、終了するまで、または自発的に他のプロセスが彼に割り込むことを許可することを決定するまで(計画されたプロセススイッチ)、すべてのプロセッサ時間を使用します。

今日のLinuxベースのオペレーティングシステムには、通常、完全にプリエンプティブなカーネルが含まれていません。中断することなく実行する必要がある重要な機能がまだあります。これを「選択的プリエンプティブカーネル」と呼べると思います。

それとは別に、Linuxカーネルを(ほぼ)完全にプリエンプティブにする方法があります。

15
wag

プリエンプションは->優先度の高いタスクを優先して、現在スケジュールされているタスクをプリエンプトまたは停止するオペレーティングシステムの機能です。スケジューリングは、プロセスまたはI/Oスケジューリングなどの1つですが、これらに限定されません。

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/

2
Madhur Ahuja

プリエンプティブカーネルを使用すると、カーネルモードで実行されているプロセスをプリエンプトできます。非プリエンプティブカーネルでは、カーネルモードで実行されているプロセスをプリエンプトすることはできません。カーネルモードプロセスは、カーネルモードを終了するか、ブロックされるか、自発的にCPUの制御を譲るまで実行されます。カーネル内で一度にアクティブになるプロセスは1つだけであるため、非プリエンプティブカーネルは、カーネルデータ構造の競合状態から本質的に解放されます。プリエンプティブカーネルについて同じことを言うことはできません。したがって、共有カーネルデータが競合状態にならないように注意深く設計する必要があります。これらの環境では、2つのカーネルモードプロセスが異なるプロセッサで同時に実行される可能性があるため、プリエンプティブカーネルをSMPアーキテクチャ用に設計することは特に困難です。プリエンプティブカーネルは、リアルタイムプロセスがカーネルで現在実行されているプロセスをプリエンプトできるため、リアルタイムプログラミングにより適しています。さらに、プロセッサを待機プロセスに放棄する前にカーネルモードプロセスが任意の期間実行されるリスクが少ないため、プリエンプティブカーネルの方が応答性が高い場合があります。もちろん、このように動作しないカーネルコードを設計することで、この影響を最小限に抑えることができます。この章の後半では、さまざまなオペレーティングシステムがカーネル内のプリエンプションをどのように管理するかを探ります。

1
nimesh thakur