ロックコンボイとロック/スレッド競合の違いは何ですか?
ロックコンボイのウィキペディアから:
ロックコンボイは、同じ優先度の複数のスレッドが同じロックを繰り返し争うときに発生します。デッドロックやライブロックの状況とは異なり、ロックコンボイのスレッドは進行します。ただし、スレッドがロックの取得を試みて失敗するたびに、スレッドはスケジューリングクォンタムの残りを放棄し、コンテキストスイッチを強制します。繰り返されるコンテキストスイッチのオーバーヘッドとスケジューリングクォンタムの十分な活用により、全体的なパフォーマンスが低下します。
ロック/スレッド競合の競合に関するウィキペディアから:
ロックの競合:これは、あるプロセスまたはスレッドが別のプロセスまたはスレッドによって保持されているロックを取得しようとするたびに発生します。使用可能なロックがきめ細かいほど、一方のプロセス/スレッドがもう一方のプロセス/スレッドによって保持されているロックを要求する可能性は低くなります。(たとえば、テーブル全体ではなく行をロックしたり、行全体ではなくセルをロックしたりします。);
誰かがそれらの両方についてもう少し詳しく説明してもらえますか?私には、それらは本質的に同じであるように見えます。そうでない場合は、確かにロックの競合がロックコンボイを引き起こします。それは事実ですか、それともそれらは別個の独立した概念ですか?また、「スケジューリングクォンタムの残りの部分を放棄し、コンテキストスイッチを強制する」という文も理解できません。
回答
ロックがビジーの場合、ロックアルゴリズムで使用されるブロッキングアプローチは2つあります。スピン待機またはブロック(スリープ状態になり、プロセッサを放棄し、OSがスレッドを起動して再スケジュールするのを待ちます)。ブロッキング戦略が使用されている場合、前述のロックコンボイが発生します。
OSは、タイムスライス方式でコア上のスレッドをスケジュールします。すべてのスレッドは、決められたタイムスライス、たとえば2ミリ秒の間プロセッサを取得します。ラウンドロビン方式のOSファッションは、レディキュー内のすべてのスレッドを1つずつスケジュールします。スケジュールを取得して実行を開始した後、たとえば100 us後にスレッドを言う場合は、ロックを要求します。ロックがビジーの場合、スレッドはロックを取得できず、プロセッサをブロックして放棄します。したがって、残りの1.9ms(2ms-100us)のタイムスライスはスレッドによって使用されません。ロックが解放されたときにOSによって起動された後でも、スレッドはラウンドロビンキューで順番を待つ必要があります。アクティブなスレッドの数は数百になる可能性があります。
ロックの競合はコンボイ効果を引き起こします。