プリエンプションとは/プリエンティブルカーネルとは何ですか?それは何のためにあるのですか?

StackOverflow https://stackoverflow.com/questions/817059

質問

あなた自身の言葉で説明した、プリエンプションとは何ですか?(Linux)カーネルにとってそれはどういう意味ですか?

プリエンプティブカーネルを使用する利点と欠点は何ですか?

役に立ちましたか?

解決

プリエンプティブマルチタスク-単一のプロセッサで複数のプロセス/スレッドを実行し、実際にそれぞれが実行する小さな多重化タイムスライスを割り当てられたときに同時に実行されるように見せかけます。プロセスは「プリエンプション」実行がスケジュールされ、次のタイムスライスが実行されるのを待つとき。

プリエンプティブカーネルとは、コードの実行中に(たとえば、システムコールへの応答で)中断して、他の処理を実行したり、カーネルにないスレッドを実行したりできるスレッドです。

プリエンプティブカーネルの主な利点は、システムコールがシステム全体をブロックしないことです。システムコールの終了に時間がかかる場合、カーネルがこの時間内に他に何もできないという意味ではありません。 主な欠点は、これによりカーネルコードがより複雑になり、より多くのエンドケースを処理し、よりきめの細かいロックを実行するか、ロックのない構造とアルゴリズムを使用する必要があることです。

他のヒント

実際には、「プリエンプティブ」という用語を使用する必要があります。プリエンプションにはさまざまな種類があります。基本的に、これは非常に単純であり、おそらく別の名前でこれを理解しているでしょう。プリエンプティブオペレーティングシステムは、プリエンプトされたアプリケーションで特別なプログラミングを行うことなく、ユーザーモードスレッド間でコンテキストを切り替えることができます。これにより、マルチタスクが可能になります。 OSは切り替えてプロセスに戻ることができ、この切り替えは基本的に透過的です。また、カーネルモードスレッドをプリエンプトできるプリエンプティブカーネルなどもあります(ほとんどのオペレーティングシステムではこれを許可しませんが、リアルタイムシステムなどの特定のアプリケーションでは必要です)。これは非常に簡単な説明です。

他の人はプリエンプティブカーネルとは何かを適切に説明しています。

それは何のためにあるのですか?

ほとんどの利点は次のとおりです。

  • 非SMPシステムでの低レイテンシー-通常、リアルタイムシステムまたはレイテンシーが重要なその他の用途(おそらくオーディオ、ビデオアプリ)で使用されます
  • SMPシステムを持っていないカーネル開発者に、SMP用の正しいコードの書き方を教える

プリエンプティブでないカーネルを使用すると、シングルプロセッサシステム上で、ほとんどの場合、カーネル開発者が怠けてロックなしで逃げることができます-もちろん、これはSMPの大きな失敗です。プリエンプティブカーネルを使用すると、コアを追加しなくてもこの痛みを感じることができます。

この投稿で質問が説明されていると思います:

  

プリエンプションとは何ですか?

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

  

プリエンプションカーネルとは何ですか?

Linuxでは、ユーザー空間プログラムは常にプリエンプティブです。カーネルは、通常のクロックティックを使用して、ユーザー空間プログラムに割り込み、他のスレッドに切り替えます。そのため、カーネルはユーザー空間プログラムがプロセッサを明示的に解放するのを待ちません(協調マルチタスクの場合)。これは、ユーザー空間プログラムの無限ループがシステムをブロックできないことを意味します。

ただし、2.6カーネルまでは、カーネル自体は予知できませんでした。1つのスレッドがカーネルに入るとすぐに、他のスレッドを実行することができませんでした。プロセッサは、syscallが終了したとき、またはschedule()関数を使用して別のスレッドを実行するように現在のスレッドが明示的にスケジューラに要求したときに、別のスレッドを実行するために使用できます。これは、カーネルコードの無限ループがシステム全体をブロックしたことを意味しますが、これは実際には問題ではありません。カーネルコードは、無限ループがないように設計されています。

カーネルプリエンプションは2.6カーネルで導入されており、CONFIG_PREEMPTオプションを使用して有効または無効にできます。 CONFIG_PREEMPTが有効になっている場合、コードがローカル割り込みを無効にしている場合を除き、どこでもカーネルコードをプリエンプトできます。コード内の無限ループは、システム全体をブロックできなくなりました。 CONFIG_PREEMPTが無効になっている場合、2.4の動作が復元されます。

  

長所と短所?

長所:プリエンプションカーネルを使用すると、待ち時間とスケーラビリティが向上し、優先度の高いタスクを実行してタイムリーに応答できます。

短所:プリエンプションカーネル、特にSMPでコードの記述が難しくなるため、多くの要因を考慮する必要があります。

プリエンプションとは、OSが複数のタスク(個別のスタンドアロンコード)をサポートし、スケジュールに従ってタスクを切り替えることを意味します。タスクが中断されると、「プリエンプティング」と呼ばれます。最新のOSはこれをサポートしていますが、たとえば、単純な組み込みシステムには必要ありません。タスクの切り替えをサポートするオーバーヘッドは必ずしも価値があるとは限りません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top