5. 세마포어, 뮤텍스
세마포어와 뮤텍스의 차이점
세마포어 (Semaphore)
Signaling mechanism. 일종의 카운터로서 Critical Section에 프로세스(스레드)가 동시에 N개 접근할 수 있다. 카운터 값이 0과 1로만 제한되면 Binary semaphore이며, 그 이상의 값을 가지면 Counting semaphore이다.
뮤텍스 (Mutex)
Locking mechanism. 락(Lock)을 가진 하나의 프로세스(스레드)만 크리티컬 섹션에 접근할 수 있다. Binary semaphore로 구현될 수 있다.
뮤텍스 (Mutex) | 세마포 (Semaphores) |
공유된 자원의 데이터를 여러 스레드가 접근하는 것을 막는것 | 공유하는 자원의 데이터를 여러 프로세스가 접근하는 것을 막는것 |
뮤텍스는 lock,unlock 두가지의 값만 가진다 | 세마포는 1개이상의 스레드가 접근할 수 있다 |
프로세스의 범위(프로세스 존재시만 효력) | 파일시스템 상 파일 형태로 존재 |
소유 가능 | 소유 불가능 |
뮤텍스를 소유하고 있는 쓰레드가 이 뮤텍스를 해제 할 수 있다. | 세마포어를 소유하고 있지 않는 쓰레드도 이 세마포어를 해제 할 수 있다. |
세마포어 (Semaphore)
각 프로세스에 제어 신호를 전달하여 순서대로 작업을 수행하도록 하는 동기화 기법이다.
세마포어 S는 P와 V연산으로만 접근 가능한 카운터 변수이며, 0 이상의 값을 가질 수 있다.
S의 값이 0과 1로만 제한되면 이진 세마포어(Binary semaphore)이며, 그 이상의 값을 가지면 카운팅 세마포어 (Counting semaphore)이다.
Binary semaphore를 통해 Mutex를 구현할 수 있지만, Mutex로 Semaphore를 구현할 수는 없다.
P 연산: Wait 동작/ 자원을 사용하려는 프로세스들의 진입 여부를 자원 카운트(S)를 통해 결정한다. 카운트를 감소시켜서(S--) 자원 점유를 알린다.
V 연산: signal 동작/ 대기 중인 프로세스를 깨우는 신호이다. 카운트를 증가시켜서(S++) 자원 반납을 알린다.
// Semaphore structure | |
typedef struct { | |
int value; | |
struct process *list; | |
} Semaphore; | |
// P | |
void Wait(Semaphore *S) { | |
S->value--; | |
if (S->value < 0) { | |
/* Push the process into S->list. */ | |
Block(); | |
} | |
} | |
// V | |
void Signal(Semaphore *S) { | |
S->value++; | |
if (S->value <= 0) { | |
/* Pop process P from S->list. */ | |
WakeUp(P); | |
} | |
} | |
// Semaphore implementation | |
do { | |
Wait(&S); | |
/* Critical Section */ | |
Signal(&S); | |
/* Remainder Section */ | |
} while (true); |
뮤텍스 (Mutex)
특정 프로세스(스레드)가 공유 자원을 사용하고 있는 상황이라면, 다른 프로세스가 공유 자원을 사용하지 못하도록 하는 동기화 기법이다.
공유 자원 점유한 프로세스는 락(Lock)을 지니며, 자원 사원을 마치면 락을 반납한다.
// P and V | |
wait(S) { | |
while (S <= 0); | |
S--; | |
} | |
signal(S) { | |
S++; | |
} | |
// Mutex implementation in binary semaphore | |
do { | |
wait(&mutex); | |
/* Critical Section */ | |
signal(&mutex); | |
/* Remainder Section */ | |
} while (true); |