critical section, mutex, semaphore 비교

critical section, mutex, semaphore 비교

 Object  When Nonsignaled  When Signaled  Successful Wait Side Effect
 Semaphore  Successful wait  When count>0
(ReleaseSemaphore)
 Decrements count by 1
 
Mutex
 Successful wait  When unowned by a thread
(ReleaseMutex)
Gives ownership to thread
 
Critical
 Successful wait
(EnterCriticalSection)
 When unowned by a thread
(LeaveCriticalSection)
Gives ownership to thread

위는 Richter 책에 있는 표를 인용했다.

1. 크리티컬 섹션
유저모드 동기화 객체이다.
커널모드 객체가 아니기 때문에 가볍고 같은 프로세스내에 스레드 동기화에 사용할 수 있다.
EnterCriticalSection을 호출하면 객체는 비신호 상태가 되고
LeaveCriticalSection을 호출하면 신호상태로 바뀌어서 다른 스레드들이 접근가능하다.

2. 뮤텍스
커널모드 동기화 객체이다.
커널모드라서 크리티컬 섹션보다는 느리지만 프로세스를 넘어서 모든 스레드에 사용될 수 있는 동기화 객체이다.
뮤텍스를 신호상태로 생성한 후 스레드에서 Wait 함수를 호출하면 뮤텍스는 비신호 상태가 되어서 다른 스레드에서는 접근하지 못한다.
ReleaseMutex를 호출하면 뮤텍스는 신호상태가 되어 다른 스레드들이 접근가능하다.

3. 세마포어
커널모드 동기화 객체이다.
뮤텍스와 비슷하지만 접근할 수 있는 스레드 갯수를 정할 수 있다.
세마포어를 생성할 때 3개의 스레드들이 접근가능하도록 지정하면 내부카운트값은 3이다.
객체 내부적으로 카운트를 관리하여 세마포어 객체를 Wait하는 스레드가 있으면 카운트가 하나씩 감소한다.
그래서 내부카운트가 0이되면 비신호상태로 바뀐다.
세마포어를 사용하고 있는 스레드들중 ReleaseSemaphore 하면 세마포어 내부카운트는 다시 1 증가하여 신호상태로 바뀌어서 다른 스레드들이 사용가능하게 된다.

원문: http://zzoouc.tistory.com/24

유저모드 : 유저가 접근할 수 있는 OS영역내에서 동작되는 실행모드입니다.
커널모드 : 유저모드로는 접근 할 수 없도록 되어있는 시스템영역(커널)에 접근하기 위해 동작되는 실행모드입니다.

리티컬 섹션으로 동기화 할 때의 장점이 유저모드로만 동작되기 때문에 유저모드->커널모드->유저모드로의 전환으로 소모되는 CPU싸이클이 다른 3가지 동기화모드와 달리 없어 가볍고 빠르게 사용할 수 있다는 것입니다.
[출처]
유저모드와 커널모드


쓰레드 동기화 오브젝트

http://naco.springnote.com/pages/2401608

Leave a Reply

Your email address will not be published. Required fields are marked *