7

Linux Kernel Developmentを読んでいて、ミューテックスとセマフォの違いに混乱しています。

著者は次のように述べています。

割り込みハンドラまたは下半分がミューテックスを取得できない

ミューテックスがスリープにつながる可能性があり、割り込みハンドラーが特定のプロセスコンテキストで実行されていないため、ミューテックスまたはセマフォは許可されていません。ただし、下半分は作業キューで実装でき、スリープすることができます。

では、下半分でミューテックスを取得できないのはなぜでしょうか? シンプルさと効率性はここで関係していますか、それとも他の何かですか?

4

2 に答える 2

4

ミューテックス/セマフォのロックはスリープできますが、BH はスリープしないように設計されています。Softirq は、多くの場所で非同期的に実行をチェックされます。たとえば、BH を復元するたびに実行できます (spin_unlock_bh など)。このようなコードをミューテックスでスリープ状態にすることは、非常に悪い考えです。BH スピンロックを保持したままスリープすると、他の BH コードがスリープ状態になり、システム全体がデッドロックする可能性さえあります。

この観点から、ワークキューはBH とは見なされ、自由にスリープできるカーネル スレッドのコンテキストで実行されます。したがって、ミューテックスはワークキューには問題ありませんが、タスクレットには問題ありません。

BH はあいまいな用語です。Linux カーネルには、ユーザー (カーネル スレッドを含む)、softirq、および hardirq という 3 つの実行コンテキストがあると考えると便利です。これらのそれぞれによるプリエンプションは、preempt_count の一連のビットで制御できます。

于 2012-11-20T10:42:26.780 に答える
2

ミューテックスを作成する主な目的は、単純さと効率性です。下半分での同期は複雑になる可能性があるため、下半分ではミューテックスを避けることをお勧めします。下半分の設計はミューテックスには適していません。例えば。Mutex は同じコンテキストでロック/ロック解除する必要があります。下半分の場合、これに従うのは困難です。

理論的には、ミューテックスの使用が正当化されるという点で異なる割り込み処理全体を実装することを決定できます。「スレッド化された」割り込みハンドラと同様です。http://lwn.net/Articles/380931/

于 2012-11-20T06:42:06.017 に答える