linux - 自作 - カーネル の 意味




「Linux kernel is preemptive」とはどういう意味ですか? (6)

私は、Linuxカーネルは、ほとんどのUnixカーネルとは異なる先制型であると読んでいます。 だから、カーネルが先制的になることは本当に何を意味するのでしょうか?

いくつかの類推または例は、純粋な理論的説明よりも良いでしょう。


Linuxカーネルはプリエンプティブであることを意味します。カーネルはプリエンプションをサポートしています。

たとえば、読み込みシステムコールを実行しているカーネルモードで動作しているP1(高優先度)とP2(低優先度)の2つのプロセスがあります。 P2が実行中で、カーネルモードであり、P2の実行がスケジュールされているとします。

カーネルプリエンプションが利用可能な場合、プリエンプションはカーネルレベルで発生する可能性があります。つまり、P2はプリエンプトされてもスリープ状態になり、P1は引き続き実行されます。

カーネルプリエンプションが利用できない場合、P2はカーネルモードであるため、システムはP2が完了するまで単純に待機します


Linuxカーネルはモノリシックであり、実行中のすべてのプロセスに対して少しの計算時間を与えます。 つまり、プロセス(例:プログラム)は同時に実行されませんが、ロジックを実行するために定期的に時間を与えられます。 主な問題は、いくつかのロジックが終了するのに時間がかかり、次のプロセスのためにカーネルが時間を許さないことです。 この結果、システムの遅延が発生します。

プリエティブなカーネルはコンテキスト切り替えることができます 。 これは、終了していなくても「ハング」プロセスを停止し、次のプロセスに計算時間を期待通りに与えることを意味します。 「ぶら下がり」プロセスは、問題なく時間が来たときに実行を継続します。

具体的には、カーネルはリアルタイムでタスクを達成する能力を持ち、特にオーディオ録音や編集に興味があります。

ubuntu studio districutionは 、プリエンプティブカーネルだけでなく、オーディオとビデオの編集に特化した高品質のフリーソフトウェアをパッケージ化しています。


これは、オペレーティングシステムスケジューラが実行中のプロセスの実行を一時停止して、いつでもCPUを別のプロセスに任せることを意味します。 これを行うための通常の方法は、CPUが実行するCPU時間の「量子」を待っている各プロセスに与えることです。 スケジューラが期限切れになった後、スケジューラは別のクォンタムを別のプロセスに与えるためにコントロールを取り戻します(実行中のプロセスはこれを回避できません)。

この方法は、プロセスが中断されずにCPUを必要な時間すべて保持し、他のアプリケーションを実行させるために明示的に何らかの「yield」関数を呼び出さなければならない協調マルチタスクと頻繁に比較されます。 当然ながら、システムの感覚が詰まるのを避けるために、正常に動作するアプリケーションはCPUを頻繁に使用します。 それでも、アプリケーションにバグがある場合(たとえば、イールドコールなしの無限ループ)、CPUが障害のあるプログラムによって完全に保持されるため、システム全体がハングします。

最近のほとんどすべてのデスクトップOSは、リソースの面でより高価であっても、一般的にはより安定している(システムが常に制御されているため、システム全体をハングアップさせることが難しい) 一方、リソースが逼迫し、アプリケーションが正常に動作することが期待される場合、協調マルチタスキングが使用されます。 Windows 3は協調マルチタスクOSでした。 より最近の例は、オープンソースのPMPファームウェアの代替品であるRockBoxです。


プリエンプションは、カーネルに並列性の印象を与えることを可能にします:あなたは1つのプロセッサしか持っていませんが(10年前に言えば)、すべてのプロセスが同時に実行されているように感じます。 これは、カーネルがあるプロセスから実行をプリエンプト(つまり、実行から取り除く)して、次のプロセスに(おそらく優先順位に従って)実行するためです。

EDITプリエンプティブカーネルは、プロセスが手を返すのを待たないので(つまり、システムコール中)、プロセスが大量のデータを計算し、どんな種類のyield関数も呼び出さなければ、他のプロセスは実行できません彼らの呼び出しを実行します。 このようなシステムは、実行時間の公平性を確保するためのプロセスの協力を求めているため、協力的であると言われています

EDIT 2プリエンプションの主な目的は、複数のタスク間でシステムの反応性を向上させることです。これはエンドユーザーには効果的ですが、一方ではサーバーは最高のスループットを達成したいので、必要ありません。 (Linuxカーネルの設定から)


伝統的なunixカーネルは、カーネルコードの実行中にスレッドによって保持された単一のロックを持っていました。 したがって、他のカーネルコードはそのスレッドを中断することはできません。

これにより、カーネルリソースを使用する1つのスレッドで他のスレッドは存在しないことを知っていたので、カーネルの設計が容易になりました。 したがって、異なるスレッドは、互いにうまく動作できません。

シングルプロセッサシステムでは、これは多すぎる問題を引き起こさない。

しかし、マルチプロセッサシステムでは、異なるプロセッサやコア上の複数のスレッドがすべてカーネルコードを同時に実行したいという状況が発生する可能性があります。 これは、ワークロードのタイプに応じて、多くのプロセッサを持つことができますが、それらのすべてがお互いに待っている時間のほとんどを過ごすことを意味します。

Linux 2.6では、カーネルリソースが個々のロックによって保護されたより小さな単位に分割され、対応するリソースが使用されている間だけロックが保持されるようにカーネルコードがレビューされました。 したがって、異なるプロセッサは、同じリソース(ハードウェアリソースなど)へのアクセスを希望する場合に、お互いに待つだけです。


私はそれが2.6より先制化されたと思う。 プリエンプティブな手段は、新しいプロセスを実行する準備ができている場合、CPUは新しいプロセスに割り当てられ、実行中のプロセスは協調してCPUを放棄する必要はありません。





multitasking