Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

윈도는 유저 모드 동기화커널 모드 동기화방법을 따로 제공한다. 임계 영역을 만들어서 쓰레드를 동기화 시킨다는 점에서는 동일하다. 말 그대로 유저 모드 동기화는 유저 모드에서, 커널 모드 동기화는 커널 모드에서 이루어진다. 일반적으로 유저 모드 동기화가 커널 모드 동기화 보다 빠른 것으로 알려져 있다. 커널 모드 동기화의 경우 "유저 모드 -> 커널 모드 -> 유저 모드"의 모드 전환이 이루어지기 때문이다. 커널 모드 동기화 이므로 커널 객체를 생성하며, winapi로 얻은 핸들을 가지고 커널 객체를 제어한다.

뮤텍스 - 커널 모드 동기화

리눅스의 뮤텍스(:12)와 동일한 개념을 가진다. 사용 방법도 비슷하다. 단일 프로세스에서만 사용할 수 있는 리눅스(:12)와 달리 윈도는 다른 프로세스들 간에도 뮤텍스를 사용할 수 있다. 이는 시스템 전역 객체인 "커널 객체"로 관리되는 특성 때문으로 생각된다.

뮤텍스 객체 생성과 임계 영역 진입

CreateMutex함수로 뮤텍스 객체를 만든다.

CreateMutex함수는 뮤텍스 객체의 이름을 매개 변개 변수로 받을 수 있다. 이름이 NULL이면 익명 뮤텍스로 뮤텍스를 만든 프로세스에서만 사용할 수 있다. NULL이 아니라면 이름있는 뮤텍스로 다른 프로세스와 공유할 수 있다.

뮤텍스 객체는 신호 상태로 만들어 진다. WaitForSingleObject(:4200)와 같은 함수로 신호 상태인지를 확인해서 임계 영역에 진입할 수 있다. 임계 영역에 진입하면 비 신호 상태가 되고 다른 쓰레드는 신호 상태가 될 때까지 임계 영역 밖에서 기다려야 한다.

임계 영역에 진입한 쓰레드는 ReleaseMutex(:4200)함수로 임계 영역을 벗어난다. ReleaseMutex함수는 뮤텍스 객체를 신호 상태로 만들고, 임계 영역 밖에서 대기중이던 쓰레드들 중 하나의 진입을 허용하게 된다. "잠금 얻기", "잠금 돌려주기"방식으로 이해할 수 있다.

예제 프로그램


		

임계 영역 객체 - 유저 모드 동기화

임계 영역 객체 (Critical Section Object)로 동기화를 달성할 수도 있다. 임계 영역 객체는 유저 모드 객체다. 유저 모드 객체이므로 단일 프로세스에서만 사용가능하다.

다음의 세 가지 함수로 임계 영역 객체를 제어할 수 있다.
  1. InitializeCriticalSection(:4200) : 임계 영역 객체를 초기화 한다.
  2. EnterCriticalSection(:4200) : 임계 영역에 진입을 시도한다.
  3. LeaveCriticalSection(:4200) : 임계 영역에서 빠져나간다.