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

뮤텍스(Mutex) 커널 객체 : 사용 카운트, 쓰래드 ID, 재귀 카운트(현재 뮤텍스를 소유하는 쓰래드가 몇번 소유하고 있는지를 나타냄)로 구성된다. 쓰래드로 하여금 단일 리소스에 독점적으로(mutual exclusive) 접근할 수 있도록 보장한다. 그러므로 사용자 모드 객체인 크리티컬 섹션(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 );
    2004/10/27 01:02 2004/10/27 01:02

    트랙백 주소 :: http://anyflow.net/trackback/21

    댓글을 달아 주세요

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

    세마포어(semaphore) 커널 객체 : 리소스 카운팅에 이용된다. 사용 카운트 외에도 두 개의 부호없는 32비트 값(최대 리소스 카운트, 현재 리소스 카운트)을 갖는다. 최대 리소스 카운트는 세마포어가 제어할 수 있는 최대 리소스 갯수를 나타내고, 현재 리소스 카운트는 현재 사용 가능한 리소스의 갯수를 나타낸다.

    세마포어가 따르는 규칙
  • 현재 리소스 카운트가 0보다 크면, 세마포어는 신호 상태에 있다.

  • 현재 리소스 카운트가 0이면, 세마포어는 비신호 상태에 있다.

  • 시스템은 세마포어의 현재 리소스 카운트가 음수가 되는 것을 허용하지 않는다.

  • 현재 리소스 카운트는 최대 리소스 카운트보다 클 수 없다.

  • HANDLE CreateSemaphore (
        PSECURITY_ATTRIBUTE psa,
        LONG lInitialCount,
        LONG lMaximumCount,
        PCTSTR pszName );

    lInitialCount : 현재 가능한 리소스의 갯수. 초기값으로 임의의 수를 정할 수 있다.
    lMaximumCount : 가능한 리소스의 최대 갯수

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

    //이 함수는 단지 세마포어의 현재 리소스 카운트에
    //lReleaseCount의 값을 더한다.
    //plPreviousCount더하기 전의 현재 리소스 카운트
    BOOL ReleaseSemaphore (
        HANDLE hsem,
        LONG lReleaseCount,
        PLONG plPreviousCount );
    2004/10/26 23:39 2004/10/26 23:39

    트랙백 주소 :: http://anyflow.net/trackback/20

    댓글을 달아 주세요

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

    대기가능 타이머(waitable timer) 커널 객체 : 특정 시간에 혹은 일정 간격으로 그 자신에게 신호를 보낸다. 주로 특정 시간에 어떤 연산을 수행해야할 때에 사용되더라..

    대기가능 타이머는 언제나 비신호 상태로 생성되기 때문에, 신호 상태로 만들려면 반드시 SetWaitableTimer()를 호출하여, 타이머가 신호 상태로 변경될 시점을 알려야 하더라..

    (SetTimer()로 설정하는) 사용자 타이머와 대기가능 타이머의 비교
    사용자 타이머 : 추가적인 UI 인프라를 요구하기 때문에, 리소스 사용량이 많다. 또한 사용자 타이머가 발생시키는 WM_TIMER는 가장 우선순위가 낮은 메시지기 때문에 울림 시간이 정확하지 않은 경우가 많다. 하지만 UI관련 타이머 이벤트를 수행한다면 사용하기가 쉽다. (대기가능 타이머는 커널 객체뿐만 아니라 메시지도 기다려야 한다. -> MsgWaitForMultipleObjects() 이용)
    대기가능 타이머 : 커널 객체이기 때문에, 여러 쓰래드에서 공유될 수 있으며, 안전하고 정확하다.
    HANDLE CreateWaitableTimer (
        PSECURITY_ATTRIBUTES psa,
        BOOL fManualReset,
        PCTSTR pszName );

    fManualReset : 수동 리셋(TRUE)인지, 자동 리셋(FALSE)인지의 여부
                          이벤트에서의 수동 리셋, 자동 리셋 기능과 동일

    HANDLE OpenWaitableTimer (
        DWORD dwDisiredAccess,
        BOOL bInheritHandle,
        PCTSTR pszName );

    BOOL SetWaitableTimer (
        HANDLE hTimer,
        const LARGE_INTEGER *pDueTime,
        LONG lPeriod,
        PTIMERAPCROUTINE pfnCompletionRoutine,
        PVOID pvArgToCompletionRoutine,
        BOOL fResume );

    pDueTime : 타이머가 처음으로 울릴 시점
    lPeriod : 타이머가 울릴 시간 간격
    fResume : 잠시 대기(suspend)에서 재개(resume)을 지원하는 컴퓨터에서 쓰임. 보통은 FALSE로 많이 놓는다.
    pfnCompletionRoutine, pvArgToCompletionRoutine :
    타이머가 신호 상태로 왔을 때에 실행될 프로시저의 함수 포인터와 매개변수. 타이머와 함께 APC(Asynchronous Procedure Call)을 사용할 경우 이용한다..

    2004/10/26 19:08 2004/10/26 19:08

    트랙백 주소 :: http://anyflow.net/trackback/19

    댓글을 달아 주세요