윈도우 2003에는 Fast Mutex보다 성능이 더 좋아진 Guarded Mutex가 추가되었습니다. Fast Mutex와 Guarded Mutex의 기능은 똑같습니다.

Fast Mutex는 IRQL을 APC_LEVEL로 올려주어 노멀 APC, 스페셜 APC를 차단합니다.

IRQL이 APC_LEVEL로 높아지면 PASSIVE_LEVEL에서 실행되고 있는 노멀 APC는 IRQL이 높아졌기 때문에 제어권을 빼앗을 수 없습니다. 그리고 APC_LEVEL에서 실행되고 있는 스페셜 APC도 IRQL이 같기 때문에 제어권을 빼앗을 수 없습니다.

하지만 Guarded Mutex는 IRQL을 APC_LEVEL로 높이지 않고 노멀 APC, 스페셜 APC를 차단합니다.

GuardMutex는 IRQL을 높이는 대신 KeEnterGuardedRegion()를 호출해서 KTHREAD의 SpecialApcDisable에서 1을 뺍니다.

이렇게 해서 운영체제는 쓰레드의 SpecialApcDisable를 체크하여 노멀, 스페셜 APC를 실행 할 수 있는 지 판단합니다.

윈도우 2003 이전 운영체제에서는 KTHREAD에 ULONG 타입의 KernelApcDisable 하나 밖에 없지만, 윈도우 2003의 KTHREAD는 SHORT 타입으로 KernelApcDisable가 있고 바로 뒤에 SHORT 타입의 SpecialApcDisable이 있습니다. 그리고 ULONG 타입의 CombinedApcDisable 하나로 KernelApcDisable, SpecialApcDisable 두개의 값을 동시에 참조 할 수 있게 되어 있습니다.

union
{
    struct
    {
        SHORT KernelApcDisable;
        SHORT SpecialApcDisable;
    };
    ULONG CombinedApcDisable;
};

KernelApcDisable는 노멀 APC이고, SpecialApcDisable는 스페셜 APC입니다.

스페셜 APC를 차단하면 당연히 노멀 APC도 차단됩니다.

뮤텍스 소유 및 해제가 매우 빈번히 일어날 경우 Guarded Mutex는 Fast Mutex 처럼 IRQL을 변화시키지 않기 때문에 성능이 더 좋은 것입니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

08 December 2007