스핀 잠금을 사용하는 동안 오류 및 교착 상태 방지

드라이버 루틴이 스핀 잠금을 보유하는 동안 시스템을 중단하지 않고 하드웨어 예외를 발생하거나 소프트웨어 예외를 발생시킬 수 없습니다. 즉, 드라이버의 ISR 및 KeSynchronizeExecution 호출에서 드라이버가 제공하는 SynchCritSection 루틴은 페이지 오류 또는 산술 예외와 같은 오류 또는 트랩을 유발해서는 안 되며 소프트웨어 예외를 발생시킬 수 없습니다. KeAcquireSpinLock 또는 KeAcquireInStackQueuedSpinLock을 호출하는 루틴은 임원 스핀 잠금을 해제하고 IRQL = DISPATCH_LEVEL 더 이상 실행되지 않을 때까지 하드웨어 예외를 발생하거나 소프트웨어 예외를 발생시킬 수 없습니다.

Pageable 데이터 및 지원 루틴

스핀 잠금을 보유하는 동안 드라이버는 페이지 가능한 데이터에 액세스하는 루틴을 호출해서는 안 됩니다. 드라이버는 IRQL에서 실행하는 동안 호출이 DISPATCH_LEVEL 미만인 경우에만 페이징 가능한 데이터에 액세스하는 특정 지원 루틴을 호출할 수 있습니다. 이 IRQL 제한은 스핀 잠금을 유지하는 동안 이러한 지원 루틴을 호출하는 것을 배제합니다. 특정 지원 루틴에 대한 IRQL 요구 사항은 루틴의 참조 페이지를 참조하세요.

재귀

재귀적으로 스핀 잠금을 획득하려고 하면 교착 상태가 발생합니다. 재귀 루틴의 유지 인스턴스화는 두 번째 인스턴스화가 회전하는 동안 스핀 잠금을 해제할 수 없으며 동일한 스핀 잠금을 획득하려고 합니다.

다음 지침에서는 재귀 루틴에서 스핀 잠금을 사용하는 방법을 설명합니다.

  • 재귀 루틴은 스핀 잠금을 보유하는 동안 자체를 호출해서는 안 되며, 후속 호출에서 동일한 스핀 잠금을 획득하려고 시도해서는 안 됩니다.

  • 재귀 루틴이 스핀 잠금을 보유하는 동안 재귀로 인해 교착 상태가 발생하거나 호출자가 25 마이크로초 이상 스핀 잠금을 유지할 수 있는 경우 다른 드라이버 루틴은 재귀 루틴을 호출해서는 안 됩니다.

재귀 드라이버 루틴에 대한 자세한 내용은 커널 스택 사용을 참조하세요.

중첩된 스핀 잠금 획득

다른 스핀 잠금을 보유하는 동안 두 번째 스핀 잠금을 획득하려고 하면 교착 상태 또는 드라이버 성능 저하가 발생할 수 있습니다.

다음 지침에서는 드라이버가 스핀 잠금을 보유하는 방법을 설명합니다.

  • 교착 상태가 발생하지 않는 한 드라이버는 스핀 잠금을 사용하는 지원 루틴을 호출해서는 안됩니다.

  • 교착 상태가 발생할 수 없더라도 대체 코딩 기술이 비슷한 드라이버 성능 및 기능을 제공할 수 없는 한 드라이버는 스핀 잠금을 사용하는 지원 루틴을 호출해서는 안 됩니다.

  • 드라이버가 스핀 잠금을 획득하기 위해 중첩된 호출을 하는 경우 스핀 잠금을 획득할 때마다 항상 동일한 순서로 스핀 잠금을 획득해야 합니다. 이 순서는 교착 상태를 방지하는 데 도움이 됩니다.

일반적으로 중첩된 스핀 잠금을 사용하여 겹치는 하위 집합 또는 공유 데이터 및 리소스의 개별 집합을 보호하지 마세요. 드라이버가 두 개의 임원 스핀 잠금을 사용하여 다양한 드라이버 루틴에 의해 개별적으로 집합적으로 설정할 수 있는 타이머 개체 쌍과 같은 불연속 리소스를 보호하는 경우 발생할 수 있는 작업을 고려합니다. 드라이버는 SMP 머신에서 간헐적으로 교착 상태가 발생하며, 각각 하나의 스핀 잠금을 보유한 두 루틴 중 하나가 다른 스핀 잠금을 획득하려고 할 때마다 교착 상태가 발생합니다.

중첩된 스핀 잠금을 획득하는 방법에 대한 자세한 내용은 잠금, 교착 상태 및 동기화를 참조하세요.