次の方法で共有


スピン ロックの概要

スピン ロックはカーネル定義のカーネル モード専用同期メカニズムであり、非透過的な型としてエクスポートされます:KSPIN_LOCK。 スピン ロックを使用して、共有データまたはリソースを同時アクセスから保護できます。 IRQL <= DISPATCH_LEVEL で実行する場合、ドライバーは KeAcquireInStackQueuedSpinLockKeReleaseInStackQueuedSpinLock を使用して、スピンロックを キュー付きスピンロックとして取得および解放できます。

IRQL >= DISPATCH_LEVEL で実行されている呼び出し元は、ドライバーのパフォーマンスを向上させるために、KeAcquireSpinLockAtDpcLevel および KeReleaseSpinLockFromDpcLevel を呼び出すことができます。

ドライバを含め、多くのコンポーネントで、スピン ロックが使用されます。 どのような種類のドライバーでも、1 つ以上のエグゼクティブ スピン ロックを使用できます。 たとえば、ほとんどのファイル システムでは、ファイル システム ドライバー (FSD) デバイス拡張機能のインターロックされた作業キューを使用して、ファイル システムのワーカー スレッド コールバック ルーチンと FSD の両方によって処理される IRP を格納します。 インターロックされた作業キューは、エグゼクティブ スピン ロックによって保護されます。これは、キューに IRP を挿入しようとしている FSD と、IRP を同時に削除しようとするスレッド間の競合を解決します。 別の例として、システム フロッピー コントローラー ドライバーは、2 つのエグゼクティブ スピン ロックを使用します。 1 つのエグゼクティブ スピン ロックは、このドライバーのデバイス専用スレッドと共有されている連動作業キューを保護します。もう一方は、3 つのドライバー ルーチンによって共有されるタイマー オブジェクトを保護します。

キューに置かれたスピン ロックは、マルチプロセッサ マシンでの高い競合ロックに対する通常のスピン ロックよりも優れたパフォーマンスを提供します。 詳細については、「キューを使用するスピン ロック」を参照してください。 ドライバーは、KeAcquireSpinLockKeReleaseSpinLock を使用して、通常のスピン ロックとしてスピン ロックを取得および解放することもできます。

単純なデータ構造へのアクセスを同期するために、ドライバーは、ExInterlockedXxx ルーチンのいずれかを使用して、データ構造へのアトミック アクセスを確保できます。 これらのルーチンを使用するドライバーは、スピン ロックを明示的に取得または解放する必要はありません。

ISR を持つすべてのドライバーは、割り込みスピン ロック を使用して、StartIo および DpcForIsr ルーチンから呼び出される、その ISR とその SynchCritSection ルーチンの間で共有されるデータまたはハードウェアを保護します。 割り込みスピン ロックは、「ISR の登録」の説明に従って、ドライバーが IoConnectInterrupt呼び出したときに作成された割り込みオブジェクトのセットに関連付けられます。

ドライバーでスピン ロックを使用する場合は、次のガイドラインに従ってください:

  • スピン ロックによって保護されているデータまたはリソース用、および常駐システム空間メモリ内 (非ページ プール。仮想メモリ空間と物理メモリの図を参照) の対応するスピン ロック用のストレージを提供します。 ドライバーは、使用するエグゼクティブ スピン ロック用のストレージを提供する必要があります。 ただし、デバイス ドライバーは、マルチベクトル ISR を持っているか、ISR の登録に関する説明に従って複数の ISR を持っていない限り、割り込みスピン ロックの記憶域を提供する必要はありません。

  • を呼び出して KeInitializeSpinLock を実行し、ドライバーが記憶域を提供する各スピンロックを初期化してから、それが保護する共有データまたはリソースへのアクセスを同期します。

  • 適切な IRQL でスピン ロックを使用するすべてのサポート ルーチンを呼び出します。通常は、<= エグゼクティブ スピン ロックの場合は DISPATCH_LEVEL、ドライバーの割り込みオブジェクトに関連付けられている割り込みスピン ロックの場合は <= DIRQL で呼び出します。

  • スピン ロックを保持している間、できるだけ迅速に実行するルーチンを実装します。 25 マイクロ秒を超えるスピン ロックを保持するルーチンはありません。

  • スピン ロックを保持している間は、次のいずれかを実行するルーチンを実装しないでください。

    • ハードウェア例外を発生させるか、ソフトウェア例外を発生させます。

    • ページング可能なメモリへのアクセスを試みます。

    • デッドロックの原因となる再帰呼び出しを行うか、スピン ロックが 25 マイクロ秒を超えて保持される可能性があります。

    • デッドロックが発生する可能性がある場合は、別のスピンロックを取得しようとします。

    • 上記の規則のいずれかに違反する外部ルーチンを呼び出します。