クラシックなスピンロック |
一度に 1 つのカーネル コード パスのみが保持できます |
ロックを解放したばかりの CPU は、ロックの外側で長時間待機していた CPU を考慮せずに、すぐに再度ロックを取得する可能性が高くなるため、ロック競合が激しいシナリオではパフォーマンスが低下します。マルチプロセッサの場合および NUMA システムでは、すべての CPU がスピン ロックを待機しています スレッドはすべて同じ共有変数でスピンし、アプリケーションとリリースは同じ変数で変更されます キャッシュ一貫性の原則により、スピンに参加している CPU のキャッシュ ラインが無効になります激しいロック使用のプロセスでは、深刻な CPU キャッシュ ライン スラッシングが発生する可能性があります。 |
キューに入れられた FIFO アルゴリズムに基づくスピン ロック |
激しいロック競合が発生するシナリオでのパフォーマンス低下の問題を解決しました。 |
CPU キャッシュ ラインのスラッシングを解決できない |
MCSロック(OSQロック) |
OSQ ロックは、MCS ロック メカニズムの特定の実装です。MCS アルゴリズムの中心的な考え方は、各ロック アプリケーションがグローバル変数ではなくローカル CPU 変数でのみ回転することであり、これにより CPU キャッシュ ラインのスラッシング問題が大幅に軽減されます。 。 |
MCS ロック メカニズムにより、スピンロック データ構造が大きくなります。カーネル内の多くのデータ構造には、スピンロック データ構造が埋め込まれています。これらのデータ構造はサイズに非常に敏感です。その結果、MCS ロック メカニズムは、スピンロック データ構造に適用され、ミューテックスと読み書きセマフォにサレンダーします。 |
MCS アルゴリズムに基づいてキューに入れられたスピン ロック |
MCS アルゴリズムに基づくキューに入れられたスピン ロックは、パフォーマンスの点で、キューイング FIFO アルゴリズムに基づくスピン ロックよりも優れています。MCS アルゴリズムに基づくキューに入れられたスピン ロックは、特に多数の CPU コアと激しいロック競合が存在するシナリオにおいて、NUMA アーキテクチャ サーバーに非常に適しています。 |
スピンロックはビジー待機を実現するロックです |
信号量 |
セマフォを使用すると、プロセスがスリープ状態に入ることができ、複雑な状況やロック時間が長い一部のアプリケーション シナリオに適しています。 |
クリティカルセクションを区別しない読み取りおよび書き込み操作 |
ミューテックスロック |
ミューテックス ロックは、カウント値が 1 に等しいセマフォと同様に相互排他操作に使用されますが、ミューテックス ロックはセマフォよりも高速に実行され、スケーラビリティが向上し、データ構造定義が小さくなります。ミューテックス ロックはオプティミズム スピン待機メカニズムを実装します。 |
クリティカルセクションを区別しない読み取りおよび書き込み操作 |
読み書きロック |
読み取り/書き込みロックには、リーダー スピン ロック タイプとリーダー セマフォの 2 つのタイプがあります。複数のリーダーが同時にクリティカル セクションに入ることができますが、ライターは同時に入ることはできません。同時にクリティカル セクションに入ることができるのは 1 人のライターだけです。リーダーとライターは同時にクリティカル セクションに入ることができません。 。 |
複数のリーダーを同時に存在させることができますが、リーダーとライターは同時に存在することはできません |
セマフォの読み取りと書き込み |
読み取り/書き込みロックの一種 |
複数のリーダーを同時に存在させることができますが、リーダーとライターは同時に存在することはできません |
RCU |
RCUは、共有データへのポインタのすべてのユーザーを記録します。共有データが変更される場合、最初にコピーが作成され、コピー内で変更されます。すべてのリーダー・スレッドがリーダーのクリティカル・セクションを離れた後、ポインタは変更されたコピーと古いデータを指します。使用されるオブジェクトは、リンク リストなどのポインタを介してアクセスする必要がある保護されたリソースです。 |
Tree RCU は、クラシック RCU における激しい cpumask ビットマップ ロック競合の問題を巧みに解決します。 |