본문 바로가기
CS

6. 동기화: 뮤텍스, 세마포어, 데드락 이해

by Developer_TaeJong 2025. 6. 18.

✅ 1. 왜 동기화(Synchronization)가 필요할까?

여러 스레드나 프로세스나 공유 자원에 동시에 접근하면
데이터 충돌이나 예기치 않은 오류 가 발생할 수 있다.

 

예시:

  • 두 스레드가 동시에 은행 계좌에서 출금 → 잔액 오류 발생 가능

그래서 동기화가 필요합니다.
즉, 한 번에 하나만 접근하도록 잠그는 방식


🔐 2. 뮤텍스(Mutex)

Mutual Exclusion (상호 배제)
한 번에 오직 하나의 스레드만 공유 자원에 접근 가능하도록 잠금
항목 설명
구조 락(Lock)을 걸고, 끝나면 해제
특징 락을 가진 스레드만 자원 접근
문제 락을 안 풀면 다른 스레드가 대기 상태에서 멈춤

 

예시:

mutex.lock();
try {
    // 공유 자원 접근
} finally {
    mutex.unlock();
}

🚦 3. 세마포어(Semaphore)

뮤텍스의 확장 개념
한 번에 접근 가능한 스레드 수를 카운터로 관리
항목 설명
구조 내부에 count 변수 존재
Binary Semaphore count가 1 → 뮤텍스와 동일
Counting Semaphore count가 N → 최대 N개까지 접근 허용

예시:

  • 프린터 3대 → 동시에 3개의 작업만 처리 가능 → 세마포어 count = 3

❌ 4. 데드락(Deadlock, 교착 상태)

둘 이상의 프로세스(또는 스레드)가 서로 자원을 기다리면서 무한 대기 에 빠진 상태

 

발생 조건 (4가지 모두 충족 시 발생)

  1. 상호 배제(Mutual Exclusion) – 자원을 한 번에 한 개만 사용
  2. 점유 대기(Hold and Wait) – 자원을 가진 채로 다른 자원 기다림
  3. 비선점(No Preemption) – 자원을 강제로 뺏을 수 없음
  4. 순환 대기(Circular Wait) – 각 프로세스가 서로 자원을 기다림
  • 이 4가지를 깨면 데드락을 예방할 수 있다

🔄 데드락 예시

A 스레드: 프린터 → 스캐너 기다림
B 스레드: 스캐너 → 프린터 기다림
→ 서로 자원을 안 놔주고 대기 중... ❌ 시스템 멈춤


🧠 5. 동기화 vs 병목

  • 동기화를 잘못하면 충돌이 발생하고,
  • 너무 과하게 잠그면성능 병목(Bottleneck) 이 발생할 수 있어요.
  • 그래서 적절한 락 전략과 병렬 처리 설계가 중요하다.

📝 6. 마무리 요약

  • 동기화(Synchronization): 공유 자원에 동시에 접근하지 않도록 제어
  • 뮤텍스: 한 번에 하나만 접근 (Lock)
  • 세마포어: 최대 N개 접근 허용
  • 데드락: 서로 자원을 기다리다 무한 대기 상태