Semaphore세마포어
세마포어(Semaphore)는 다중 프로세스·스레드 환경에서 공유 자원 접근을 제어하는 동기화 기법이다. 1965년 에츠허르 다익스트라(Edsger Dijkstra)가 제안했으며, 정수 카운터와 두 가지 원자적 연산(P/V 또는 wait/signal)으로 구성된다. 운영체제의 임계 구역(Critical Section) 보호와 프로세스 간 협력에 널리 사용된다.
핵심 개념
세마포어는 카운터 정수 S 와 두 연산으로 이루어진다.
| 연산 | 다익스트라 표기 | 동작 |
|---|---|---|
| wait | P(S) | S > 0 이면 S -= 1 후 진행, S = 0 이면 대기 |
| signal | V(S) | S += 1, 대기 중인 프로세스 깨우기 |
P = Proberen (네덜란드어: 시험하다) V = Verhogen (네덜란드어: 증가시키다)
원자성 (Atomicity)
P와 V 연산은 원자적(Atomic) 으로 실행되어야 한다. 즉, 실행 도중 다른 프로세스가 끼어들 수 없다. 이를 보장하지 않으면 세마포어 자체의 경쟁 조건이 발생한다.
세마포어의 종류
이진 세마포어 (Binary Semaphore)
값이 0 또는 1만 가지는 세마포어. 뮤텍스(Mutex) 와 동일한 역할.
카운팅 세마포어 (Counting Semaphore)
0 이상의 정수 값. 복수 자원에 대한 동시 접근 제한에 사용.
세마포어 vs 뮤텍스
| 항목 | 세마포어 | 뮤텍스(Mutex) |
|---|---|---|
| 값 범위 | 0 이상 정수 | 0 또는 1 |
| 소유권 | 없음 (누구든 V 가능) | 있음 (잠근 스레드만 해제) |
| 용도 | 자원 수 제한, 동기화 신호 | 상호 배제(임계 구역 보호) |
| 데드락 위험 | 높음 | 중간 |
임계 구역 문제
세마포어는 임계 구역 문제의 세 가지 조건을 해결한다.
| 조건 | 의미 | 세마포어 해결 |
|---|---|---|
| 상호 배제 | 한 번에 하나만 임계 구역 진입 | 이진 세마포어로 보장 |
| 진행 | 대기 중인 프로세스가 결국 진입 | 공정한 큐 관리 |
| 한정 대기 | 무한 대기 방지 | 구현에 따라 다름 |
코드 예시
데드락 (Deadlock)
세마포어를 잘못 사용하면 데드락(교착상태) 이 발생한다.
해결: 세마포어 획득 순서를 모든 프로세스에서 통일.
식사하는 철학자 문제
세마포어의 고전적인 문제.
해결책: 한 명은 오른쪽 먼저 잡기, 또는 카운팅 세마포어로 최대 4명만 시도 허용.
생산자-소비자 문제
세마포어의 대표적 활용.
현대 운영체제에서의 활용
| 활용처 | 설명 |
|---|---|
| 커널 동기화 | 리눅스 semaphore, mutex |
| 스레드 풀 | 작업자 스레드 수 제한 |
| DB 연결 풀 | 동시 연결 수 제한 |
| 네트워크 요청 제한 | Rate Limiting |
| 파일 잠금 | 파일 동시 접근 제어 |
뮤텍스와의 핵심 차이: Signaling vs Locking
세마포어와 뮤텍스의 가장 근본적인 차이는 소유권(Ownership) 개념이다.
| 항목 | 세마포어 | 뮤텍스 |
|---|---|---|
| 메커니즘 | Signaling — 신호 기반 | Locking — 잠금 기반 |
| 해제 주체 | 어느 스레드도 signal 가능 | 반드시 잠근 스레드만 해제 |
| 소유권 | 없음 | 있음 |
| 재귀 잠금 | 불가 | 구현에 따라 가능 |
핵심: 바이너리 세마포어(count=1)는 뮤텍스처럼 사용할 수 있지만, 뮤텍스는 세마포어처럼 사용할 수 없다. 뮤텍스는 항상 잠근 스레드가 직접 해제해야 하기 때문이다.
세마포어가 유리한 경우: 생산자-소비자처럼 한 스레드가 신호를 보내고 다른 스레드가 받아야 하는 경우.
뮤텍스가 유리한 경우: 임계 구역 보호처럼 잠근 스레드와 해제 스레드가 동일해야 하는 경우.
관련 개념
- •운영체제 — 세마포어가 구현되는 환경
- •스택 (Stack) — 함수 호출 스택, 콜 스택
- •큐 (Queue) — 세마포어 대기 큐 구현
참고문헌
- •Dijkstra, E.W. (1965). Cooperating Sequential Processes
- •Silberschatz et al. Operating System Concepts — Chapter 6: Synchronization
- •Tanenbaum. Modern Operating Systems — Chapter 2: Processes and Threads
