web-dev-qa-db-ja.com

プリエンプションとは/プリエンティブルカーネルとは何ですか?それは何の役に立つのですか?

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

プリエンプティブカーネルを持つことの利点と欠点は何ですか?

56
Markus Lux

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

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

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

65
shoosh

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

15
BobbyShaftoe

私はこれを post があなたの質問を説明すると思う:

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

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

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

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

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

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

長所と短所?

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

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

7
Nan Xiao

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

それは何の役に立つのですか?

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

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

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

7
MarkR

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

4
Jeff