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