2009-05-03 9 views
47

あなた自身の言葉で、プリエンプションとは何ですか、そして(Linux)カーネルにとって何を意味していますか?プリエンプションとは何か/プリエンプト可能なカーネルとは?それは何のために良いですか?

プリエンプト可能なカーネルを持つ利点と欠点は何ですか?

+26

なぜdownvoteとなぜ "宿題"?これは宿題ではありません。実際、このような質問に興味があり、共通のWikipediaの記事を理解していない私のような人がいます。 –

+3

http://en.wikipedia.org/wiki/Preemption_(computing) – Oli

答えて

56

プリエンプティブマルチタスク - 単一のプロセッサ上で複数のプロセス/スレッドを実行し、実際に実行する小さな多重化タイムスライスが割り当てられているときに同時に実行されるという錯覚を作り出します。プロセスは実行不能にスケジュールされたとき次のタイムスライスが実行されるのを待ちます。

プリエンプティブカーネルは、コードの実行中に中断することができます - 例えば、システムコールの応答で - 他のものを実行し、おそらく他のスレッドを実行することができますカーネルにないもの

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

+8

これは、ファイルシステムが悪くなったとき、特にネットワークファイルシステムの場合、あなたが殺すことのできないプロセスで自分自身を見つけるかもしれない理由です。システムコールが返るようにsysシステムコールを待っていますが、決してそれは中断されません。 – Schwern

13

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

+1

私は知っています、あなたの貢献はしばらく前に行われましたが、とにかく、私にあなたに質問をさせてください。なぜ、「プリエンプティブ」という言葉を「プリエンプティブ」よりも好むのですか?特に、カーネル構成では後者を使用するため、これを使用すると少し直感的になります。 –

4

プリエンプションは、複数のタスク(独立した独立したコード)をサポートし、スケジュール上のタスクを切り替えることを意味します。タスクが中断されると、それは「プリエンプト」と呼ばれます。現代のOSはこれをサポートしていますが、例えば単純な組込みシステムでは必要ありません。タスク切り替えをサポートするオーバーヘッドは必ずしもその価値はありません。

7

他の人は、先取り可能なカーネルが何であるかについて十分に説明しました。

何が良いですか?

ほとんど利点がある:非SMPシステム上

  • 低レイテンシー - 通常、リアルタイムシステムやレイテンシが重要であり、他のもの(オーディオ、ビデオアプリケーションおそらく)のために使用さ
  • ティーチングカーネル開発者非プリエンプティブカーネルでSMP

のための正しいコードを書く方法をSMPシステムを持っていないカーネル開発者は怠惰なことと時間のいずれかのロックほとんどせずに逃げるするために、シングルプロセッサシステム上でそれが可能です - もちろんこれSMPの大きな失敗です。プリエンプティブなカーネルは、コアがなくてもこの痛みを得ることができます。

4

私はこのpostがあなたの質問に説明を考える:

プリエンプションは何か?

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

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

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

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

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

長所と短所

長所:プリエンプションカーネルは、レイテンシとスケーラビリティを向上させることができ、優先度の高いタスクの実行とタイムリーな対応が可能です。

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

関連する問題