세마포어는 자원의 개수를 제어하거나 작업 간의 순서 동기화 등 에 활용되고,
뮤텍스는 주로 상호 배타를 위해 사용되는 가장 단순한 형태의 동기화 도구
| 구분 | 뮤텍스 (Mutex) | 세마포어 (Semaphore) |
|---|---|---|
| 목적 | 상호 배제 (Mutual Exclusion) | 자원 접근 제한 (Resource Counting) |
| 동기화 대상 개수 | 단 한 개의 자원/임계 구역 (1) | 여러 개의 자원 (N) |
| 소유권 | 있음 (잠근 스레드만 풀 수 있음) | 없음 (신호를 통해 다른 스레드/프로세스가 값을 변경 가능) |
| 메커니즘 | 잠금(Locking): Key를 획득해야 함 | 신호(Signaling): 카운터 값을 조정 |
| 사용 e.g. | 임계 구역 보호 | 제한된 자원(커넥션, 버터 등)접근 제어 |
신호 매커니즘을 사용하여 여러 개의 자원에 대한 접근을 제한하는 방법
⇒ 자원 접근의 허가권을 관리하는 카운터 기반 제어 장치
유한한 재원 개수 관리, 생산자-소비자 문제와 같은 순서 동기화에서 사용된다.
// S: 세마포어 변수 (공유 자원 접근 여부를 나타냄)
// P(S): 자원 요청
// V(S): 자원 해제
/* 잠금 or 진입 요청
세마포어 값 S가 0이면 자원이 이미 사용중이라는 뜻
다른 프로세스가 임계 구역에서 빠졍나와 S가 1이 될 때까지 대기 (wait)
*/
procedure P(S) // 최초 S값 = 1
while S = 0 do wait
S := S-1 // S=1(자원이 사용 가능한 상태)이면, S를 0으로 만듦
// 이 순간부터 다른 프로세스들은 S=0을 보고 대기 상태로 들어감
// 결과적으로, 임계 구역에는 오직 하나의 프로세스만 진입 가능
end P
--- 임계 구역 ---
/*
임계 구역 실행이 끝난 후, 자원을 다른 프로세스에게 개방함
S를 다시 1로 복원함으로써 대기 중이던 다른 프로세스 하나를 깨움
이제 그 다음 프로세스가 P(S)를 통해 진입할 수 있음
*/
procedure V(S) // 현재 S = 0
S := S+1 // S를 1
end V
| 단계 | 변수 S의 값 | 의미 |
|---|---|---|
| 초기 | 1 | 자원이 비어 있음 |
프로세스 A P(S) 호출 | 0 | A가 임계 구역 진입, |
| 다른 프로세스는 대기 | ||
프로세스 A V(S) 호출 | 1 | A가 임계 구역을 나감, |
| 다른 프로세스 진입 가능 |
Mutex, Mutual Exclusion Object: 상호 배제를 구현하는 기법
공유 자원에 동시에 접근하는 것을 제어하기 위한 동기화 도구
한 번에 오직 하나의 스레드만 임계 구역에 들어갈 수 있도록 보장함
공유 데이터의 일관성 & 안전성을 보장하기 위한 잠금 메커니즘