2

これは、ARM-Cortex 8 ベースの SoC で SMP 対応の Linux を実行しているという些細な観察から生じた 2 つの疑問です。最初の部分は、Uni プロセッサ システムでの SMP と非 SMP Linux カーネルのパフォーマンス (メモリ空間/CPU 時間) の違いについてです。違いはありますか?

後半は、Spinlock の使用についてです。私の知る限り、単一プロセッサの場合、スピンクロックはヌープです。CPU は 1 つしかなく、その上で (一度に) 1 つのプロセスしか実行されないため、ビジー ループの他のプロセスはありません。したがって、同期のために、重要なセクションを保護するために割り込みを無効にする必要があります。私のこの理解は正しいですか?

この議論では、ドライバーの移植性要因は無視してください。

4

2 に答える 2

1

カーネル内の大量の同期コードは、あなたが説明する動作を説明するユニプロセッサカーネルではほとんど何もコンパイルされません。n-way システムのパフォーマンスは決して 2n ではなく、CPU の数が増えるにつれて悪化します。

SMP システムの同期メカニズムを使用してドライバーを作成し続ける必要があります。カーネルがユニプロセッサー用に構成されている場合、正しいシングルプロセッサーのケースが得られるという知識があるので安心です。

割り込みをグローバルに無効にすることは、大ハンマーをナットに当てるようなものです。おそらく、現在の CPU でプリエンプションを無効にするだけで十分です。スピンロックは、ユニプロセッサ システムでもこれを行います。

まだ行っていない場合は、Linux Device Drivers 3rd Editionの第 5 章を参照してください。状況に応じてさまざまなスピンロック オプションがあります。

于 2013-01-17T14:01:45.157 に答える
1

ユニプロセッサ システムで SMP モードでコンパイルされた Linux カーネルを実行していると述べたように、速度とメモリの点でメリットがないことは明らかです。

linux-kernel は同期のために広範なロックを使用するためです。ただし、Uni-Processor モードでは、理論的にはロックする必要はないかもしれませんが、ロックが必要な場合が多いため、必要な場合はロックを使用してみてください。ただし、SMP ほどではありません。

ただし、スピンロックは一連のマクロによって実装され、IRQ ハンドラーとの同時実行を妨げるものもあれば、そうでないものもあることをよく知っておく必要があります。

2 番目の質問の時点で、ユニプロセッサ モードの割り込みを無効にすることでスピンロックを削除しようとしていますが、スピンロック マクロはプリエンプティブルではない UP(ユニプロセッサ) カーネルにあり、空のマクロに評価されます (またはそれらのいくつかは、無効/有効にするだけのマクロに評価されます)。割り込みます)。プリエンプションが有効になっている UP カーネルは、スピンロックを使用してプリエンプションを無効にします。ほとんどの場合、プリエンプションは SMP と同等のものと見なすことができます。したがって、UP カーネルでスピンロックを使用すると、それらは単なる空のマクロになり、それを使用する方が良いと思います。

同期には基本的に 4 つの手法があります。

しかし、あなたが言っているように、同期のために割り込みを無効にすることを覚えておいてください。その単純さのために、重要な領域を実装するためにカーネル関数によって割り込みの無効化が使用されます。この手法では、カーネル制御パスのインターリーブが常に防止されるわけではありません。 カーネル制御パスがこのセクションで実行されている間、CPU と I/O 間の通信がブロックされるため、クリティカル セクションは短くする必要があります。

したがって、Uni-Processor で同期が必要な場合は、セマフォを使用してください。

于 2013-01-18T05:48:38.287 に答える