교착 상태 검색

교착 상태 검색은 스핀 잠금, 뮤텍스 및 빠른 뮤텍스와 같이 잠가야 하는 리소스의 드라이버 사용을 모니터링합니다. 이 드라이버 검증 도구 옵션은 향후 교착 상태를 일으킬 가능성이 있는 코드 논리를 검색합니다.

드라이버 검증 도구의 교착 상태 검색 옵션과 !deadlock 커널 디버거 확장은 코드에서 이러한 리소스를 제대로 사용하지 않도록 하는 효과적인 도구입니다.

교착 상태 검색은 Windows XP 이상 버전의 Windows에서만 지원됩니다.

교착 상태의 원인

교착 상태는 실행이 불가능한 방식으로 일부 리소스에 대해 둘 이상의 스레드가 충돌할 때 발생합니다.

가장 일반적인 형태의 교착 상태는 두 개 이상의 스레드가 다른 스레드가 소유한 리소스를 기다릴 때 발생합니다. 다음과 같이 설명됩니다.

스레드 1 스레드 2
잠금 A를 사용합니다. 잠금 B를 사용합니다.
요청 잠금 B 요청 잠금 A

두 시퀀스가 동시에 발생하는 경우 스레드 1은 스레드 2가 소유하므로 잠금 B를 가져오지 않으며 스레드 2는 스레드 1이 소유하기 때문에 잠금 A를 가져오지 않습니다. 이로 인해 관련된 스레드가 중단되고 최악의 경우 시스템이 응답을 중지합니다.

교착 상태는 스레드 2개와 리소스 2개로 제한되지 않습니다. 스레드 3개와 잠금 3개 사이의 3방향 교착 상태는 일반적이며, 5부 또는 6부로 구성된 교착 상태도 가끔 발생합니다. 이러한 교착 상태는 동시에 발생하는 여러 가지 작업에 의존하기 때문에 어느 정도의 "불운"이 필요합니다. 그러나 잠금 획득이 멀리 떨어져 있으면 잠금 획득 가능성이 높아집니다.

스레드가 이미 소유하고 있는 잠금을 시도하면 단일 스레드 교착 상태가 발생할 수 있습니다.

모든 교착 상태의 공통 분모는 잠금 계층이 존중되지 않는다는 것입니다. 한 번에 둘 이상의 잠금을 획득해야 할 때마다 각 잠금에 명확한 우선 순위가 있어야 합니다. A가 한 지점에서 B 앞에, 다른 지점에서 C 앞에 B를 사용하는 경우 계층 구조는 A-B-C입니다. 즉, B 또는 C 이후에는 A를 획득해서는 안 되며, B는 C 이후에 인수해서는 안 됩니다.

코드를 유지 관리하는 과정에서 교착 상태가 실수로 도입되기 쉽기 때문에 교착 상태가 발생할 가능성이 없는 경우에도 잠금 계층 구조를 따라야 합니다.

교착 상태를 일으킬 수 있는 리소스

가장 명확한 교착 상태는 소유 리소스 의 결과입니다. 여기에는 스핀 잠금, 뮤텍스, 빠른 뮤텍스 및 ERESOURCE가 포함됩니다.

이벤트 및 LPC 포트와 같이 획득하지 않고 신호를 받는 리소스는 훨씬 더 모호한 교착 상태를 유발하는 경향이 있습니다. 물론 코드가 이러한 리소스를 오용하는 것이 가능하고 너무 일반적이므로 두 스레드가 서로 완료될 때까지 무기한 대기하게 됩니다. 그러나 이러한 리소스는 실제로 하나의 스레드가 소유하지 않으므로 어느 정도 확실한 체납 스레드를 식별할 수 없습니다.

드라이버 검증 도구의 교착 상태 검색 옵션은 스핀 잠금, 뮤텍스 및 빠른 뮤텍스와 관련된 잠재적 교착 상태를 찾습니다. ERESOURCE의 사용을 모니터링하지 않으며 소유하지 않은 리소스의 사용을 모니터링하지도 않습니다.

교착 상태 검색의 효과

드라이버 검증 도구의 교착 상태 검색 루틴은 반드시 동시가 아닌 잠금 계층 구조 위반을 찾습니다. 대부분의 경우 이러한 위반은 기회가 주어지면 교착 상태에 빠질 코드 경로를 식별합니다.

잠재적인 교착 상태를 찾기 위해 드라이버 검증 도구는 리소스 획득 순서 그래프를 빌드하고 루프를 확인합니다. 각 리소스에 대한 노드를 만들고 한 잠금을 다른 리소스 앞에 가져올 때마다 화살표를 그리는 경우 경로 루프는 잠금 계층 위반을 나타냅니다.

드라이버 검증 도구는 이러한 위반 중 하나가 발견되면 버그 검사 발급합니다. 이는 실제 교착 상태가 발생하기 전에 발생합니다.

참고

충돌하는 코드 경로가 동시에 발생할 수 없더라도 잠금 계층 구조 위반이 포함된 경우에도 다시 작성해야 합니다. 이러한 코드는 코드를 약간 다시 작성하는 경우 실제 교착 상태가 발생할 수 있는 "교착 상태 대기 중"입니다.

교착 상태 검색에서 위반을 발견하면 버그 검사 0xC4 발생합니다. 이 버그 검사 첫 번째 매개 변수는 정확한 위반을 나타냅니다. 가능한 위반은 다음과 같습니다.

  • 잠금 계층 구조 위반과 관련된 두 개 이상의 스레드

  • 이미 공유 소유자인 리소스를 독점적으로 획득하려는 스레드입니다(단독 소유 리소스는 공유를 획득할 수 있으며 공유 리소스는 독점적으로 획득할 수 없음).

  • 동일한 리소스를 두 번 획득하려고 하는 스레드(자체 교착 상태)

  • 먼저 획득하지 않고 해제된 리소스

  • 리소스를 획득한 리소스와 다른 스레드에서 해제한 리소스

  • 두 번 이상 초기화되거나 전혀 초기화되지 않은 리소스

  • 리소스를 소유하는 동안 삭제되는 스레드

  • Windows 7부터 드라이버 검증 도구는 가능한 교착 상태를 예측할 수 있습니다. 예를 들어 일반 스핀 잠금과 스택 대기 스핀 잠금으로 동일한 KSPIN_LOCK 데이터 구조를 사용하려고 합니다.

버그 검사 매개 변수 목록은 버그 검사 0xC4(DRIVER_VERIFIER_DETECTED_VIOLATION)을 참조하세요.

교착 상태 검색 모니터링

교착 상태 검색에서 위반이 발견되면 !deadlock 커널 디버거 확장을 사용하여 발생한 작업을 정확하게 조사할 수 있습니다. 잠금이 원래 획득되었을 때 각 스레드에 대한 호출 스택뿐만 아니라 잠금 계층 토폴로지를 표시할 수 있습니다.

Windows용 디버깅 도구 패키지의 설명서에는 !deadlock 확장에 대한 자세한 예제와 디버거 확장에 대한 일반적인 정보가 있습니다. 자세한 내용은 Windows 디버깅을 참조하세요.

이 옵션 활성화

참고

이 옵션은 커널 동기화 지연 퍼지와 호환되지 않습니다.

드라이버 검증 도구 관리자 또는 Verifier.exe 명령줄을 사용하여 하나 이상의 드라이버에 대한 교착 상태 감지 기능을 활성화할 수 있습니다. 자세한 내용은 드라이버 검증 도구 옵션 선택을 참조하세요.

  • 명령줄에서

    명령줄에서 교착 상태 검색 옵션은 비트 5(0x20)로 표시됩니다. 교착 상태 검색을 활성화하려면 플래그 값 0x20 사용하거나 플래그 값에 0x20 추가합니다. 예:

    verifier /flags 0x20 /driver MyDriver.sys
    

    이 기능은 다음 부팅 후에 활성화됩니다.

    Windows Vista 이상 버전의 Windows에서는 / volatile 매개 변수를 명령에 추가하여 컴퓨터를 다시 부팅하지 않고 교착 상태 검색을 활성화하고 비활성화할 수도 있습니다. 예:

    verifier /volatile /flags 0x20 /adddriver MyDriver.sys
    

    이 설정은 즉시 유효하지만 컴퓨터를 종료하거나 다시 부팅하면 손실됩니다. 자세한 내용은 Volatile 설정 사용을 참조하세요.

    교착 상태 검색 기능은 표준 설정에도 포함됩니다. 예:

    verifier /standard /driver MyDriver.sys
    
  • 드라이버 검증 도구 관리자 사용

    1. 사용자 지정 설정 만들기(코드 개발자용)를 선택한 다음, 다음을 선택합니다.

    2. 전체 목록에서 개별 설정 선택을 선택합니다.

    3. 교착 상태 검색(검사)을 선택합니다.

교착 상태 검색 기능은 표준 설정에도 포함됩니다. 이 기능을 사용하려면 드라이버 검증 도구 관리자에서 표준 설정 만들기를 선택합니다.