プリエンプションとは何か、また (Linux) カーネルにとって何を意味するのか、ご自身の言葉で説明してください。
プリエンプティブル カーネルを持つことの利点と欠点は何ですか?
プリエンプションとは何か、また (Linux) カーネルにとって何を意味するのか、ご自身の言葉で説明してください。
プリエンプティブル カーネルを持つことの利点と欠点は何ですか?
プリエンプティブ マルチタスキング - 単一のプロセッサで複数のプロセス/スレッドを実行し、実際にはそれぞれに小さな多重化されたタイム スライスが割り当てられて実行されるときに、それらが同時に実行されているように見せかけます。次に実行するタイム スライス。
プリエンプティブ カーネルとは、コードの実行中に (たとえばシステム コールに応答して) 中断して、他のことを実行したり、他のスレッド (おそらくカーネルにないもの) を実行したりできるカーネルです。
プリエンプティブ カーネルの主な利点は、システム コールがシステム全体をブロックしないことです。sys-call が終了するまでに長い時間がかかる場合でも、カーネルがこの時間内に他に何もできないという意味ではありません。主な欠点は、カーネル コードがより複雑になり、より多くのエンド ケースを処理したり、よりきめ細かいロックを実行したり、ロックのない構造やアルゴリズムを使用したりする必要があることです。
「プリエンプティブ」という言葉を実際に使用する必要があります。プリエンプションにはさまざまな種類があります。本質的に、これは非常に単純であり、おそらく別の名前でこれを理解しているでしょう。プリエンプティブ オペレーティング システムは、プリエンプトされたアプリケーションで特別なプログラミングを行わなくても、ユーザー モード スレッド間でコンテキストを切り替えることができます。これにより、マルチタスクが可能になります。OS はプロセスを切り替えることができ、この切り替えは本質的に透過的です。また、カーネル モード スレッドをプリエンプトできるプリエンプティブ カーネルなどもあります (ほとんどのオペレーティング システムでは許可されていませんが、リアルタイム システムなどの特定のアプリケーションでは必要です)。これは非常に単純化された説明であることに注意してください。
この投稿はあなたの質問を説明している と思います:
プリエンプションとは何ですか?
より優先度の高いタスクを優先して、現在スケジュールされているタスクを横取りまたは停止するオペレーティング システムの機能。スケジューリングは、プロセスまたは I/O スケジューリングなどの 1 つにすることができますが、これらに限定されません。
プリエンプション カーネルとは何ですか?
Linux では、ユーザー空間プログラムは常にプリエンプティブルです。カーネルはユーザー空間プログラムに割り込んで、通常のクロック ティックを使用して他のスレッドに切り替えます。そのため、カーネルは、ユーザー空間プログラムがプロセッサを明示的に解放するのを待ちません (協調型マルチタスクの場合)。これは、ユーザー空間プログラムの無限ループがシステムをブロックできないことを意味します。
ただし、2.6 カーネルまでは、カーネル自体がプリエンプト可能ではありませんでした。1 つのスレッドがカーネルに入るとすぐに、他のスレッドを実行するためにプリエンプトできませんでした。システムコールが終了したとき、または現在のスレッドが schedule() 関数を使用して別のスレッドを実行するようスケジューラに明示的に要求したときに、プロセッサを使用して別のスレッドを実行できました。これは、カーネル コードの無限ループがシステム全体をブロックしたことを意味しますが、これは実際には問題ではありません。カーネル コードは、無限ループがないように設計されています。
カーネルプリエンプションは 2.6 カーネルで導入され、CONFIG_PREEMPT オプションを使用して有効または無効にできます。CONFIG_PREEMPT が有効になっている場合、コードがローカル割り込みを無効にしている場合を除き、カーネル コードはどこでも横取りできます。コード内の無限ループがシステム全体をブロックすることはなくなりました。CONFIG_PREEMPT を無効にすると、2.4 の動作が復元されます。
長所と短所?
長所: プリエンプション カーネルは、レイテンシとスケーラビリティを改善し、優先度の高いタスクを実行してタイムリーに応答できるようにします。
短所: プリエンプション カーネル、特に SMP でコードを書くのが難しくなり、多くの要因を考慮する必要があります。
プリエンプションとは、OS が複数のタスク (個別のスタンドアロン コード) をサポートし、スケジュールに従ってタスクを切り替えることを意味します。タスクが中断されることを「プリエンプト」と呼びます。最新の OS はこれをサポートしていますが、単純な組み込みシステムなどでは必要ありません。タスク切り替えをサポートするオーバーヘッドは、必ずしもそれだけの価値があるとは限りません。