📌 공유 자원(Shared Resource)
- 여러 프로세스 또는 스레드가 공통으로 사용하는 자원
- 메모리, 파일, 전역 변수, 입출력 장치 등
📌 임계 구역(Critical Section)
- 공유 자원에 접근하는 코드 영역
- 동시에 실행되면 데이터 충돌(오류) 발생 가능
📌 레이스 컨디션(Race Condition)
- 여러 프로세스/스레드가 동시에 공유 자원에 접근하여 실행 결과가 꼬이는 문제
- 실행 순서에 따라 결과가 달라짐
예시:
1. 프로세스 A가 공유 메모리에 데이터를 쓰기
2. 프로세스 B가 공유 메모리에서 데이터를 읽기
3. 만약 프로세스 B가 A의 쓰기 작업이 끝나기 전에 실행되면, 잘못된 데이터를 읽을 수도 있음
📌 동기화(Synchronization)
- 여러 프로세스 또는 스레드가 공유 자원을 올바르게 접근하도록 제어하는 것
- 레이스 컨디션 방지
📌 동기화의 두 가지 개념
- 실행 순서 제어: 프로세스 및 스레드를 올바른 순서로 실행하기
- 상호 배제: 동시에 접근해서는 안 되는 자원에 하나의 프로세스 및 스레드만 접근하기
📌 개념
📌 원리

📌 예시 코드(java)
lock.acquire(); // 락 획득 (다른 프로세스/스레드는 접근 불가)
// 공유 자원 접근 (임계 구역)
lock.release(); // 락 해제 (다른 프로세스/스레드 접근 가능)
📌 개념
📌 원리
1. 공유 자원의 개수를 나타내는 변수 S (세마포 값) 사용
2. wait() 호출 시 S 값을 1 감소, signal() 호출 시 S 값을 1 증가
3. S > 0 → 접근 가능 / S = 0 → 접근 불가 (대기)
📌 예시 코드(java)
wait(S) { // 자원 사용 전
S--;
if (S < 0) wait(); // 사용 가능한 자원이 없으면 대기
}
signal(S) { // 자원 사용 후
S++;
if (S <= 0) wakeup(); // 대기 중인 프로세스 깨움
}
📌 개념
📌 원리
📌 예시 코드(java)
if (!조건_충족) {
cv.wait(); // 조건 충족될 때까지 대기
}
// 조건 충족 시
cv.signal(); // 대기 중인 스레드 실행
📌 개념
📌 해결 방법
📌 예시 코드(java)
public synchronized void add(int value) { // 동기화 보장
count += value;
}
일어나지 않을 사건을 기다리며 프로세스의 진행이 멈춰버리는 현상

1️⃣ 상호 배제: 한 번에 하나의 프로세스만 자원을 사용 가능
2️⃣ 점유와 대기: 프로세스가 자원을 점유한 채 추가 자원을 기다림
3️⃣ 비선점: 할당된 자원을 강제로 회수할 수 없음
4️⃣ 원형 대기: 프로세스들이 순환 구조로 자원을 기다림
1️⃣ 교착상태 예방
📌 예시:
자원 X(0), 자원 Y(1), 자원 Z(2)
프로세스들이 반드시 오름차순 순서로만 자원을 할당받도록 제한하면 원형 대기 조건을 충족하지 않아 교착상태가 발생하지 않음
2️⃣ 교착상태 회피
📌 예시:
은행원 알고리즘(Banker's Algorithm)
프로세스의 최대 자원 요구량을 미리 확인하고, 교착상태가 발생하지 않는 경우에만 자원 할당
3️⃣ 교착상태 검출 후 회복
✔ 교착상태 검출 방법
✔ 교착상태 해결 방법 (복구 방법)
자원 선점을 통한 회복
- 교착상태가 해결될 때까지 다른 프로세스로부터 강제로 자원을 빼앗아 특정 프로세스에 할당
프로세스 강제 종료
- 교착상태에 놓인 프로세스 중 일부를 강제 종료하여 자원을 해제
참고: 북스터디 - 이것이 취업을 위한 컴퓨터 과학이다 (Chapter 3-3)