빠른 뮤텍스 및 보호된 뮤텍스

Windows 2000부터 드라이버는 IRQL <= APC_LEVEL 실행되는 코드에 대해 오버헤드가 낮은 형태의 상호 제외가 필요한 경우 빠른 뮤텍스를 사용할 수 있습니다. 빠른 뮤텍스는 한 번에 하나의 스레드로만 입력해야 하는 코드 경로를 보호할 수 있습니다. 보호된 코드 경로를 입력하기 위해 스레드는 뮤텍스 를 획득합니다 . 다른 스레드가 이미 뮤텍스를 획득한 경우 뮤텍스가 해제될 때까지 현재 스레드의 실행이 일시 중단됩니다. 보호된 코드 경로를 종료하기 위해 스레드는 뮤텍스 를 해제합니다 .

Windows Server 2003부터 드라이버는 보호된 뮤텍스를 사용할 수도 있습니다. 보호된 뮤텍스는 빠른 뮤텍스에 대한 드롭인 대체이지만 더 나은 성능을 제공합니다. 빠른 뮤텍스와 마찬가지로 보호된 뮤텍스는 한 번에 하나의 스레드로만 입력해야 하는 코드 경로를 보호할 수 있습니다. 그러나 보호된 뮤텍스를 사용하는 코드는 빠른 뮤텍스를 사용하는 코드보다 더 빠르게 실행됩니다.

Windows 8 이전 버전의 Windows에서는 보호된 뮤텍스가 빠른 뮤텍스와 다르게 구현됩니다. 빠른 뮤텍스로 보호되는 코드 경로는 IRQL = APC_LEVEL 실행됩니다. 보호된 뮤텍스로 보호되는 코드 경로는 IRQL <= APC_LEVEL 실행되지만 모든 APC는 사용하지 않도록 설정됩니다. 이전 버전의 Windows에서는 보호된 뮤텍스를 획득하는 것이 빠른 뮤텍스를 획득하는 것보다 더 빠른 작업입니다. 그러나 이러한 두 가지 유형의 뮤텍스는 동일하게 동작하며 동일한 제한 사항이 적용됩니다. 특히 IRQL = APC_LEVEL 호출할 수 없는 커널 루틴은 빠른 뮤텍스 또는 보호된 뮤텍스로 보호되는 코드 경로에서 호출해서는 안 됩니다.

Windows 8 시작하여 보호된 뮤텍스는 빠른 뮤텍스로 구현됩니다. 보호된 뮤텍스 또는 빠른 뮤텍스로 보호되는 코드 경로에서 드라이버 검증 도구 는 커널 루틴에 대한 호출을 IRQL = APC_LEVEL 발생하는 것으로 처리합니다. 이전 버전의 Windows와 마찬가지로 APC_LEVEL 잘못된 호출은 보호된 뮤텍스 또는 빠른 뮤텍스로 보호되는 코드 경로에서 불법입니다.

빠른 뮤텍스

빠른 뮤텍스는 FAST_MUTEX 구조체로 표시됩니다. 드라이버는 FAST_MUTEX 구조체에 대해 자체 스토리지를 할당한 다음 ExInitializeFastMutex 루틴을 호출하여 구조를 초기화합니다.

스레드는 다음 중 하나를 수행하여 빠른 뮤텍스를 획득합니다.

  • ExAcquireFastMutex 루틴을 호출합니다. 다른 스레드에서 뮤텍스를 이미 획득한 경우 뮤텍스를 사용할 수 있게 될 때까지 호출 스레드의 실행이 일시 중단됩니다.

  • ExTryToAcquireFastMutex 루틴을 호출하여 현재 스레드를 일시 중단하지 않고 빠른 뮤텍스를 획득하려고 합니다. 루틴은 뮤텍스를 획득했는지 여부에 관계없이 즉시 반환됩니다. ExTryToAcquireFastMutex 는 호출자에 대한 뮤텍스를 성공적으로 획득하면 TRUE 를 반환합니다. 그렇지 않으면 FALSE를 반환 합니다.

스레드 는 ExReleaseFastMutex 를 호출하여 ExAcquireFastMutex 또는 ExTryToAcquireFastMutex에서 획득한 빠른 뮤텍스를 해제합니다.

빠른 뮤텍스로 보호되는 코드 경로는 IRQL = APC_LEVEL 실행됩니다. ExAcquireFastMutexExTryToAcquireFastMutex 는 현재 IRQL을 APC_LEVEL 발생시키고 ExReleaseFastMutex 는 원래 IRQL을 복원합니다. 따라서 스레드가 빠른 뮤텍스를 보유하는 동안 모든 APC가 비활성화됩니다.

코드 경로가 항상 APC_LEVEL 실행되도록 보장되는 경우 드라이버는 대신 ExAcquireFastMutexUnsafeExReleaseFastMutexUnsafe 를 호출하여 빠른 뮤텍스를 획득하고 해제할 수 있습니다. 이러한 루틴은 현재 IRQL을 변경하지 않으며 현재 IRQL이 APC_LEVEL 경우에만 안전하게 사용할 수 있습니다.

빠른 뮤텍스는 재귀적으로 획득할 수 없습니다. 이미 빠른 뮤텍스를 보유하고 있는 스레드가 이를 획득하려고 하면 해당 스레드가 교착 상태가 됩니다. 빠른 뮤텍스는 IRQL <= APC_LEVEL 실행되는 코드에서만 사용할 수 있습니다.

보호된 뮤텍스

Windows Server 2003부터 사용할 수 있는 보호된 뮤텍스는 빠른 뮤텍스와 동일한 기능을 수행하지만 성능은 향상됩니다.

Windows 8 시작하여 보호된 뮤텍스와 빠른 뮤텍스가 동일하게 구현됩니다.

Windows 8 이전 버전의 Windows에서는 보호된 뮤텍스가 빠른 뮤텍스와 다르게 구현됩니다. 빠른 뮤텍스를 획득하면 현재 IRQL이 APC_LEVEL, 보호된 뮤텍스를 획득하면 보호된 영역으로 들어가며 이는 더 빠른 작업입니다. 보호된 지역에 대한 자세한 내용은 중요 지역 및 보호된 지역을 참조하세요.

보호된 뮤텍스는 KGUARDED_MUTEX 구조체로 표시됩니다. 드라이버는 KGUARDED_MUTEX 구조체에 자체 스토리지를 할당한 다음 KeInitializeGuardedMutex 루틴을 호출하여 구조를 초기화합니다.

스레드는 다음 중 하나를 수행하여 보호된 뮤텍스를 획득합니다.

  • KeAcquireGuardedMutex를 호출합니다. 다른 스레드에서 뮤텍스를 이미 획득한 경우 뮤텍스를 사용할 수 있게 될 때까지 호출 스레드의 실행이 일시 중단됩니다.

  • KeTryToAcquireGuardedMutex를 호출하여 현재 스레드를 일시 중단하지 않고 보호된 뮤텍스를 획득하려고 합니다. 루틴은 뮤텍스를 획득했는지 여부에 관계없이 즉시 반환됩니다. KeTryToAcquireGuardedMutex 는 호출자에 대한 뮤텍스를 성공적으로 획득하면 TRUE 를 반환합니다. 그렇지 않으면 FALSE를 반환 합니다.

스레드 는 KeReleaseGuardedMutex 를 호출하여 KeAcquireGuardedMutex 또는 KeTryToAcquireGuardedMutex에서 획득한 보호된 뮤텍스를 해제합니다.

보호된 뮤텍스를 보유하는 스레드는 보호된 영역 내에서 암시적으로 실행됩니다. KeAcquireGuardedMutexKeTryToAcquireGuardedMutex 는 보호된 지역으로 들어가고 KeReleaseGuardedMutex는 이를 종료합니다. 스레드가 보호된 뮤텍스를 보유하는 동안 모든 APC는 사용하지 않도록 설정됩니다.

모든 APC를 사용하지 않도록 설정한 상태에서 코드 경로가 실행되도록 보장되는 경우 드라이버는 대신 KeAcquireGuardedMutexUnsafeKeReleaseGuardedMutexUnsafe 를 사용하여 보호된 뮤텍스를 획득하고 해제할 수 있습니다. 이러한 루틴은 보호된 지역에 들어가거나 종료되지 않으며 기존 보호된 지역 내부 또는 IRQL = APC_LEVEL만 사용할 수 있습니다.

보호된 뮤텍스는 재귀적으로 획득할 수 없습니다. 보호된 뮤텍스를 이미 보유하고 있는 스레드가 이를 획득하려고 하면 해당 스레드가 교착 상태가 됩니다. 보호된 뮤텍스는 IRQL <= APC_LEVEL 실행되는 코드에서만 사용할 수 있습니다.