출처 : http://anyflow.egloos.com/776231

 

커널 객체를 이용한 쓰래드 동기화(5) - 뮤텍스

제프리 릭터의 Programming Applications for Microsoft Windows에 담긴 내용입니다.

뮤텍스(Mutex) 커널 객체 : 사용 카운트, 쓰래드 ID, 재귀 카운트(현재 뮤텍스를 소유하는 쓰래드가 몇번 소유하고 있는지를 나타냄)로 구성된다. 쓰래드로 하여금 단일 리소스에 독점적으로(mutual exclusive) 접근할 수 있도록 보장한다. (mutual exclusive를 직역하면 '상호 배제'정도 되는 것같은데, 왜 상호(mutual)라는 말이 붙는지는 몰겠네요.) 그러므로 사용자 모드 객체인 크리티컬 섹션(critical section)과 동일하게 동작하더라.. 하지만 뮤텍스는 커널 객체이므로, 크리티컬 섹션보다 느리다. 이 말은 단일 뮤텍스에 서로 다른 프로세스의 쓰래드가 접근할 수 있고, 리소스를 얻기위한 쓰래드 대기 시간 값을 지정할 수 있다는 뜻이다.
가장 많이 사용되는 커널 객체이기도 하며, 보통 여러 쓰래드에서 접근하는 메모리 블록을 보호하는 데 사용된다.

뮤텍스가 따르는 규칙
  • 쓰래드 ID가 0이면, 뮤텍스는 어떤 쓰래드에도 소유된 것이 아니며, 신호 상태이다.
  • 쓰래드 ID가 0이 아니면, 어떤 쓰래드가 소유하고 있는 것이며, 비신호 상태이다.
  • 다른 커널 객체와는 달리, 일반 규칙에 반하는 것을 허용하는 특별한 코드가 OS 내에 존재한다.

    뮤텍스 vs 크리티컬 섹션
  • 성능    뮤텍스 : 느리다 / 크리티컬 섹션 : 빠르다
  • 프로세스 영역을 넘어 사용 가능한지
    뮤텍스 : 가능 / 크리티컬 섹션 : 불가
  • 임의 시간 대기
    뮤텍스 : WaitForSingleObject(hmtx, dwMilliSeconds); / 크리티컬 섹션 : 불가
  • 다른 커널 객체와 함께 대기 상태가 가능한지
    뮤텍스 : 가능(WaitForMultipleObjects()나 이와 비슷한 함수를 통해) / 크리티컬 섹션:불가
    HANDLE CreateMutex (
        PSECURITY_ATTRIBUTES psa,
        BOOL fInitialOwner,
        PCTSTR pszName );

    fInitialOwner : 초기 상태 설정 값. FALSE가 넘어올 경우, 뮤텍스의 쓰래드 ID와 재귀 카운터가 0으로 설정된다. 이 말은 뮤텍스가 비소유 상태가 되고, 따라서 신호 상태로 된다는 뜻이다. TRUE가 넘어올 경우에는 뮤텍스 쓰래드 ID가 호출자 쓰래드의 ID로 설정되고, 재귀 카운터는 1로 설정된다. 따라서 비신호 상태가 된다.

    HANDLE OpenMutex (
        DWORD fdwAccess,
        BOOL bInheritHandle,
        PCTSTR pszName );

    //뮤텍스의 재귀 카운트를 1만큼 감소시킨다. 재귀 카운터가 0이되면
    //쓰래드 ID도 0으로 설정 되고, 뮤텍스는 신호 상태가 된다.
    BOOL ReleaseMutex ( HANDLE hMutex );
  • 안정적인 DNS서비스 DNSEver DNS server, DNS service
    Posted by 키르히아이스
    ,