지난 글에서는 **뮤텍스 락(Mutex Lock)**을 통해 *“하나의 공유 자원에 여러 프로세스가 동시에 접근하지 못하게 하는 방법”*을 살펴봤습니다.
[운영체제] 동기화와 교착 상태 - 동기화 기법
이전 글에서는 프로세스·스레드가 공유 자원을 동시에 사용하면 발생하는**임계 구역 문제(critical section problem)**와**레이스 컨디션(race condition)**에 대해 살펴봤습니다. [운영체제] 동기화와 교착
wnsgud4553.tistory.com
하지만, 만약 공유 자원이 여러 개라면?
예를 들어, 철도 건널목이 하나가 아니라 여러 개라면?
또는 동시에 3명이 들어가도 되는 임계영역이라면?
이때 사용하는 동기화 도구가 바로 세마포(semaphore) 입니다.
1. 세마포(semaphore)란
“여러 개의 자원을 관리할 수 있는 동기화 도구”
뮤텍스 락은 오직 자원 1개만 보호할 수 있었죠.
반면 세마포는
✔ 공유 자원이 여러 개일 때,
✔ 동시에 여러 프로세스가 임계영역에 접근할 수 있을 때
사용됩니다.
세마포 이름의 유래는 기차 신호등에서 온 용어로,
특정 구간(임계영역)을 “진입해도 된다/멈춰라”를 알려주는 신호 역할을 합니다.
2. 세마포 구성 요소
세마포는 매우 단순한 두 개의 요소로 구성됩니다.
1️⃣ 공유 변수 S
- 사용 가능한 자원의 개수를 나타냄
- 예: S = 3 ⇒ 동시에 3개의 프로세스가 임계영역에 들어갈 수 있음
- 뮤텍스 락은 S = 1인 세마포라고 보면 됨
2️⃣ 두 개의 함수
- wait() : 임계영역 진입 전 호출
- signal() : 임계영역 작업 종료 후 호출
뮤텍스에서 acquire()/release()와 동일한 역할이지만,
세마포는 여러 명을 들여보낼 수 있다는 점이 다릅니다.
3. wait() 함수 동작 원리
세마포 S를 기반으로 임계영역 진입 전에 실행됩니다.
wait() {
S--; // 1) 자원 개수 감소
if (S < 0) { // 2) 자원이 없다면
sleep(); // 3) 대기 상태로 전환
}
}
- 임계영역에 들어가려는 프로세스가 S를 하나 감소시킴
- 감소된 S < 0이면, 즉 자원이 부족한 상태
- 해당 프로세스는 대기 큐로 이동 (진입 불가)
즉,
- S ≥ 0 인 경우: 정상 진입
- S < 0 인 경우: 대기 (자원 부족)
4. signal() 함수 동작 원리
임계영역에서 작업을 마친 후 호출합니다.
signal() {
S++; // 1) 자원 반납
if (S <= 0) { // 2) 대기 중인 프로세스가 있다면
wakeup(p); // 3) 하나를 깨워서 실행 준비 상태로
}
}
- S++로 “자원 하나 반납”
- 0 이하라면, 이미 대기 중인 프로세스가 있다는 뜻
- 해당 프로세스 중 하나를 깨워서 다시 wait() 위치부터 재진입
5. 동작 예시 – S=2, 프로세스 P1·P2·P3 실행 흐름

세마포가 어떻게 운영되는지 그림으로 정리된 예제입니다.
초기값: S = 2 (자원 2개)
세 개의 프로세스 P1, P2, P3가 순서대로 접근한다고 가정합니다.
흐름 요약
1️⃣ P1 → wait()
- S = 2 → 1
- 임계영역 진입
2️⃣ P2 → wait()
- S = 1 → 0
- 임계영역 진입
3️⃣ P3 → wait()
- S = 0 → -1
- 진입 불가 → sleep()
4️⃣ P1 → signal()
- S = -1 → 0
- 대기 중 P3 깨움
5️⃣ P3 → 임계영역 진입
6️⃣ P2 → signal()
- S = 0 → 1
7️⃣ P3 → signal()
- S = 1 → 2
모든 프로세스가 정상적으로 실행 완료!
정리하면
| 항목 | 뮤텍스 | 세마포 |
| 자원 개수 | 1개 | 여러 개 가능 |
| 변수 | lock (boolean ) | S(정수) |
| 함수 | acquire, release | wait, signal |
| 대기 | 하나만 보호 | 여러 개 다기 가능 |
| 용도 | 단일 자원 보호 | 자원 개수가 여러 개인 경우 |
세마포는 OS 동기화를 이해하는 데 필수 개념이지만,
개념 자체는 아주 단순합니다.
✔ S는 자원의 개수
✔ wait() → 들어가기 전 S 감소
✔ signal() → 나오면서 S 증가
✔ S < 0이면 대기
✔ S ≤ 0이면 누군가 깨움
뮤텍스 락보다 조금 더 강력하고 유연한 도구이며,
웹 서버의 연결 처리, DB 커넥션 풀, 스레드풀 관리 등
현업에서도 매우 자주 등장하는 개념입니다.
'컴퓨터 과학' 카테고리의 다른 글
| [운영체제] CPU 스케줄링 - CPU 활용률 (0) | 2025.11.30 |
|---|---|
| [운영체제] 동기화와 교착 상태 - 조건 변수와 모니터 (0) | 2025.11.29 |
| [운영체제] 동기화와 교착 상태 - 동기화 기법 (0) | 2025.11.29 |
| [운영체제] 동기화와 교착 상태 - 임계구역 (0) | 2025.11.29 |
| [운영체제] 프로세스와 스레드 - 프로세스 간 통신 (0) | 2025.11.27 |