티스토리 뷰
아래의 내용은 이 글의 내용을 번역, 의역 및 정리한 것입니다.
1. 세마포어(Semaphore)와 뮤텍스(Mutex)
세마포어와 뮤텍스는 모두 동기화를 이용되는 도구이지만 차이가 있다. 자세한 내용은 아래와 같다.
[ Mutex(뮤텍스) ]
뮤텍스는 자원에 대한 접근을 동기화하기 위해 사용되는 상호배제 기술이다. 이것은 프로그램이 시작될 때 고유한 이름으로 생성된다. 뮤텍스는 Locking 메커니즘으로 오직 하나의 쓰레드만이 동일한 시점에 뮤텍스를 얻어 임계 영역(Critical Section)에 들어올 수 있다. 그리고 오직 이 쓰레드만이 임계 영역에서 나갈 때 뮤텍스를 해제할 수 있다.
wait (mutex);
…..
Critical Section
…..
signal (mutex);
위의 수도코드는 뮤텍스의 과정을 보여주고 있는데, 락을 얻은 쓰레드만이 임계 영역을 나갈 때 락을 해제해줄 수 있다. 이러한 이유는 뮤텍스가 1개의 락만을 갖는 Locking 메커니즘이기 때문이다.
[ Semaphore(세마포어) ]
세마포어는 Signaling 메커니즘이라는 점에서 뮤텍스와 다르다. 세마포어는 락을 걸지 않은 쓰레드도 Signal을 보내 락을 해제할 수 있다는 점에서, wait 함수를 호출한 쓰레드만이 signal 함수를 호출할 수 있는 뮤텍스와 다르다.
세마포어는 동기화를 위해 wait와 signal이라는 2개의 atomic operations를 사용한다.
wait를 호출하면 세마포어의 카운트를 1줄이고, 세마포어의 카운트가 0보다 작거나 같아질 경우에 락이 실행된다.
struct semaphore {
int count;
queueType queue;
};
void semWait (semaphore s) {
s.count--;
if (s.count <= 0) {
// 락이 걸리고 공유 자원에 접근할 수 없음
}
}
void semSignal (semaphore s) {
s.count++;
if (s.count <= 0) {
// 아직 락에 걸려 대기중인 프로세스가 있음
}
}
세마포어의 카운트가 0보다 작거나 같아져 동기화가 실행된 상황에, 다른 쓰레드가 signal 함수를 호출하면 세마포어의 카운트가 1증가하고, 해당 쓰레드는 락에서 나올 수 있다.
세마포어는 크게 Counting Semaphores, Binary Semaphore 2종류가 있다. 카운팅 세마포어는 세마포어의 카운트가 양의 정수값을 가지며, 설정한 값만큼 쓰레드를 허용하고 그 이상의 쓰레드가 자원에 접근하면 락이 실행된다. 바이너리 세마포어는 세마포어의 카운트가 1이며 Mutex처럼 사용될 수 있다.(뮤텍스는 절대로 세마포어처럼 사용될 수 없다.)
2. 세마포어(Semaphore) vs 뮤텍스(Mutex) 차이
[ 세마포어와 뮤텍스 차이 정리 ]
뮤텍스는 Locking 메커니즘으로 락을 걸은 쓰레드만이 임계 영역을 나갈때 락을 해제할 수 있다. 하지만 세마포어는 Signaling 메커니즘으로 락을 걸지 않은 쓰레드도 signal을 사용해 락을 해제할 수 있다. 세마포어의 카운트를 1로 설정하면 뮤텍스처럼 활용할 수 있다.
'나의 공부방' 카테고리의 다른 글
[프로그래밍] 함수형 프로그래밍(Functional Programming) 이란? (32) | 2021.01.22 |
---|---|
[XML] CDATA란 무엇인가? (0) | 2021.01.20 |
[자료구조] 해시테이블(HashTable)이란? (6) | 2020.10.29 |
[기술면접] 기술 외 공통 면접 질문 (38) | 2020.10.18 |
[기술면접] CS 기술면접 질문 - 백엔드 (8/8) (8) | 2020.10.13 |