✅ 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가지 모두 충족 시 발생)
- 상호 배제(Mutual Exclusion) – 자원을 한 번에 한 개만 사용
- 점유 대기(Hold and Wait) – 자원을 가진 채로 다른 자원 기다림
- 비선점(No Preemption) – 자원을 강제로 뺏을 수 없음
- 순환 대기(Circular Wait) – 각 프로세스가 서로 자원을 기다림
- 이 4가지를 깨면 데드락을 예방할 수 있다
🔄 데드락 예시
A 스레드: 프린터 → 스캐너 기다림
B 스레드: 스캐너 → 프린터 기다림
→ 서로 자원을 안 놔주고 대기 중... ❌ 시스템 멈춤
🧠 5. 동기화 vs 병목
- 동기화를 잘못하면 충돌이 발생하고,
- 너무 과하게 잠그면 → 성능 병목(Bottleneck) 이 발생할 수 있어요.
- 그래서 적절한 락 전략과 병렬 처리 설계가 중요하다.
📝 6. 마무리 요약
- 동기화(Synchronization): 공유 자원에 동시에 접근하지 않도록 제어
- 뮤텍스: 한 번에 하나만 접근 (Lock)
- 세마포어: 최대 N개 접근 허용
- 데드락: 서로 자원을 기다리다 무한 대기 상태