스핀 잠금 소개
스핀 잠금은 커널 정의 커널 모드 전용 동기화 메커니즘으로, 불투명 형식인 KSPIN_LOCK 내보냅니다. 스핀 잠금을 사용하여 공유 데이터 또는 리소스를 동시 액세스로부터 보호할 수 있습니다. IRQL <= DISPATCH_LEVEL 실행하는 경우 드라이버는 KeAcquireInStackQueuedSpinLock 및 KeReleaseInStackQueuedSpinLock을 사용하여 대기 중인 스핀 잠금으로 스핀 잠금을 획득하고 해제할 수 있습니다.
또는 IRQL >= DISPATCH_LEVEL 실행 중인 호출자는 더 나은 드라이버 성능을 위해 KeAcquireSpinLockAtDpcLevel 및 KeReleaseSpinLockFromDpcLevel을 호출할 수 있습니다.
많은 구성 요소는 드라이버를 포함하여 스핀 잠금을 사용합니다. 모든 종류의 드라이버는 하나 이상의 임원 스핀 잠금을 사용할 수 있습니다. 예를 들어 대부분의 파일 시스템은 파일 시스템의 작업자-스레드 콜백 루틴과 FSD에서 모두 처리되는 IRP를 저장하기 위해 파일 시스템 드라이버(FSD) 디바이스 확장에 연결된 작업 큐를 사용합니다. 연동 작업 큐는 IRP를 큐에 삽입하려는 FSD와 IRP를 제거하려는 스레드 간의 경합을 해결하는 임원 스핀 잠금으로 보호됩니다. 또 다른 예로, 시스템 플로피 컨트롤러 드라이버는 두 개의 이그제큐티브 스핀 잠금을 사용합니다. 한 임원 스핀 잠금은 이 드라이버의 디바이스 전용 스레드와 공유되는 연동 작업 큐를 보호합니다. 다른 하나는 세 가지 드라이버 루틴에서 공유하는 타이머 개체를 보호합니다.
대기 중인 스핀 잠금은 다중 프로세서 컴퓨터에서 높은 경합 잠금에 대한 일반 스핀 잠금보다 더 나은 성능을 제공합니다. 자세한 내용은 대기 중 스핀 잠금을 참조 하세요. 드라이버는 KeAcquireSpinLock 및 KeReleaseSpinLock을 사용하여 일반 스핀 잠금으로 스핀 잠금을 획득하고 해제할 수도 있습니다.
드라이버는 간단한 데이터 구조에 대한 액세스를 동기화하기 위해 ExInterlockedXxx 루틴을 사용하여 데이터 구조에 대한 원자성 액세스를 보장할 수 있습니다. 이러한 루틴을 사용하는 드라이버는 스핀 잠금을 명시적으로 획득하거나 해제할 필요가 없습니다.
ISR이 있는 모든 드라이버는 인터럽트 스핀 잠금을 사용하여 ISR과 해당 StartIo 및 DpcForIsr 루틴에서 일반적으로 호출되는 SynchCritSection 루틴 간에 공유되는 모든 데이터 또는 하드웨어를 보호합니다. 인터럽트 스핀 잠금은 ISR 등록에 설명된 대로 드라이버가 Io커넥트인터럽트를 호출할 때 생성된 인터럽트 개체 집합과 연결됩니다.
드라이버에서 스핀 잠금을 사용하기 위한 다음 지침을 따릅니다.
스핀 잠금으로 보호되는 모든 데이터 또는 리소스와 상주 시스템 공간 메모리의 해당 스핀 잠금에 대한 스토리지를 제공합니다(가상 메모리 공간 및 실제 메모리 그림에 표시된 대로 비페이지 풀). 드라이버는 사용하는 모든 임원 스핀 잠금에 대한 스토리지를 제공해야 합니다. 그러나 다중 벡터 ISR이 있거나 ISR 등록에 설명된 대로 둘 이상의 ISR이 없는 한 디바이스 드라이버는 인터럽트 스핀 잠금에 대한 스토리지를 제공할 필요가 없습니다.
KeInitializeSpinLock을 호출하여 드라이버가 스토리지를 제공하는 각 스핀 잠금을 초기화한 후 이를 사용하여 보호되는 공유 데이터 또는 리소스에 대한 액세스를 동기화합니다.
적절한 IRQL에서 스핀 잠금을 사용하는 모든 지원 루틴을 호출합니다. 일반적으로 임원 스핀 잠금의 <경우 = DISPATCH_LEVEL 또는 <드라이버의 인터럽트 개체와 연결된 인터럽트 스핀 잠금의 경우 = DIRQL입니다.
스핀 잠금을 보유하는 동안 가능한 한 빨리 실행되도록 루틴을 구현합니다. 어떤 루틴도 25 마이크로 초 이상 스핀 잠금을 보유해서는 안됩니다.
스핀 잠금을 보유하는 동안 다음 중 어떤 작업도 수행하는 루틴을 구현하지 마세요.
하드웨어 예외를 발생하거나 소프트웨어 예외를 발생합니다.
페이지 가능한 메모리에 액세스하려고 시도합니다.
교착 상태가 발생하거나 스핀 잠금이 25 마이크로초 이상 유지될 수 있는 재귀 호출을 합니다.
이렇게 하면 교착 상태가 발생할 수 있는 경우 다른 스핀 잠금을 획득하려고 시도합니다.
이전 규칙을 위반하는 외부 루틴을 호출합니다.