전공공부/운영체제

5. 세마포어, 뮤텍스

milkteagood 2019. 12. 24. 19:00
728x90
반응형

세마포어와 뮤텍스의 차이점

세마포어 (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);
view raw Semaphore.cpp hosted with ❤ by GitHub

 

뮤텍스 (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);
view raw Mutex.cpp hosted with ❤ by GitHub

 

728x90
반응형