11

ミューテックスがすでにT1によってロックされていて、T2がそれをロックしようとした場合、T2のプロセスは何ですか?

私はそれが次のようになると思います:

-T2はロックを試み、失敗し、おそらく少しスピンロックしてから、yieldを呼び出します
...-T2は数回実行するようにスケジュールされ、ロックを試みて失敗し、
yield ...-最終的にT1はロックを解除し、T2は実行するようにスケジュールされます。ミューテックスをロックすることができます...

T1ロック解除は、ミューテックスがロック解除されていることをスケジューラーまたは他のスレッドに明示的に通知しますか?または、ロックを解除し、適切と思われるときにブロックされたスレッドをスケジュールするようにスケジューラーに任せますか(別名スケジューラーにはブロックされたスレッドの概念がなく、それらを特別なものとして扱いません)?

4

3 に答える 3

6

オペレーティング システムによって異なります。スピン、スピンyield、カーネルの汎用条件変数、ユーザーランド制御のスケジューリング、およびカーネルサポートを備えた特殊なロックプリミティブを見てきました。

スピニングとスピニングyieldはひどいパフォーマンスをしています。理論的には、ユーザーランドで制御されたスケジューリング (「スケジューラーのアクティベーション」を参照) が最高のパフォーマンスを発揮するはずですが、私の知る限り、すべてのケースで適切に機能させた人はいません。カーネルの汎用条件変数と、カーネルをサポートする特殊なロック プリミティブは、後者の最良の例として、Linux のfutexとほぼ同じように機能するはずです。

回転によりパフォーマンスが向上する状況があります。Solaris では、カーネル内の一部のロック プリミティブに、ロックを保持しているプロセスが別の CPU で実行されている限り、ロックが回転する適応モードがあります。ロックの所有者がスリープ状態になるか、プリエンプトされると、ロック ウェイターもスリープ状態になります。他のカーネルには、ロックを保持しているときにロックの所有者がプリエンプトまたはスリープできないクラスのロックがあるため、そのような場合でもスピンはうまく機能します。ただし、一般的に、特にユーザーランドでは、スピンには非常に恐ろしい縮退ケースがあり (ロック所有者を実行させるためにプリエンプトされるまでスピンプロセスがスピンします)、パフォーマンスが非常に悪くなります。のような特殊なロック プリミティブはfutex、このような最適化を実装できることに注意してください。これは、汎用の条件変数では通常できないことです。

于 2013-02-26T13:44:23.787 に答える
3

要するに:はい、おそらく...

これは実装の詳細であり、少なくともどのオペレーティングシステムについて話しているのかを知らずに言うのはかなり難しいです。通常、ミューテックスのロックを解除すると、待機中のスレッドが「実行可能」としてマークされるだけで、その時点で(必然的に)スケジューラーが呼び出されることはありません。スケジューラーが呼び出されても、T2が次のスレッドになるわけではありません。走る。

Linuxでは、コードが入力mutex_unlock()され、待機中のタスクがあるかどうかがチェックされます(ロックカウントがゼロ未満かどうかをチェックすることにより、ロック解除の場合は1から始まり、1回のロック要求でゼロになり、さらにロックが試行されますネガティブになります)。さらに待機中のプロセスがある場合は、「低速パスのロック解除」を呼び出します。これは、実装の詳細を許可する2つのリダイレクト関数を介して、最終的に__mutex_unlock_common_slowpath-数行下にあり、最終的には-になります。これは基本的に、タスクを「実行準備完了」としてキューに入れ、スケジューラーを呼び出します(関数のいくつかのレイヤーを介して!)wake_up_processtry_to_wake_up

于 2013-02-26T13:52:12.097 に答える
1

次のシナリオがあるとします。

 1. T1 got M1. M1 locked.
 2. T2 tries to get M1 and gets blocked as M1 is locked.
 3. T3 tries to get M1 and gets blocked as M1 is locked.
 4. ...some time later...
 5. T1 unlocks M1.*
 6. T2 got M1.
 7. T3 is unblocked and tries to get M1 but is blocked again as T2 got M1 first.

* システム コールunlockは、mutex のlock コールでブロックされているすべてのブロックされたタスク/プロセス/スレッドを通知する必要があります。その後、実行するようにスケジュールされます。すでに誰かが処刑されている可能性があるため、それは彼らが処刑されるという意味ではありません。他の人が述べているように、それがどのように行われるかは実装に依存します。本気で学びたいならこの本がおすすめ

于 2013-02-26T14:02:57.433 に答える