운영체제Hard#197
Deadlock의 발생 조건과 예방 방법을 설명해주세요.
#운영체제#Deadlock#동시성#Lock
답변 포인트
네 가지 조건과 순환 대기 제거를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.
정답 및 해설
빠른 요약
Deadlock은 상호 배제, 점유 대기, 비선점, 순환 대기 조건이 동시에 성립할 때 발생합니다. 자원 획득 순서 고정, 타임아웃, 선점 전략으로 완화할 수 있습니다.
Deadlock은 여러 작업이 서로가 가진 자원을 기다리며 영원히 진행하지 못하는 상태입니다. 운영체제와 데이터베이스, 애플리케이션 lock 설계에서 모두 발생할 수 있으며, 네 가지 필요 조건이 동시에 만족될 때 생깁니다.
핵심 개념
- 상호 배제(Mutual Exclusion): 한 번에 하나의 작업만 자원을 사용할 수 있습니다.
- 점유와 대기(Hold and Wait): 자원을 가진 채 다른 자원을 기다립니다.
- 비선점(No Preemption): 가진 자원을 강제로 빼앗을 수 없습니다.
- 순환 대기(Circular Wait): A는 B를, B는 A를 기다리는 순환 관계가 있습니다.
동작 방식 또는 판단 기준
이 주제를 이해할 때는 다음 순서로 보면 실무 적용이 쉬워집니다.
- 무엇을 해결하려는가: 성능, 표현력, 안정성, 접근성 중 어떤 문제를 줄이려는지 확인합니다.
- 전제 조건은 무엇인가: 정렬 여부, 브라우저 지원, 네트워크 특성, 동시성 조건처럼 성립해야 하는 조건을 점검합니다.
- 비용은 어디서 발생하는가: 시간 복잡도, 메모리, 캐시, 재시도, 렌더링 비용처럼 병목 지점을 나눠 봅니다.
- 실패 시 어떤 문제가 생기는가: 잘못 적용했을 때의 버그나 운영 리스크를 함께 고려합니다.
실제 예시
Text
Thread 1: lock(user) 획득 -> lock(order) 대기
Thread 2: lock(order) 획득 -> lock(user) 대기
둘 다 상대가 가진 lock을 기다리므로 진행 불가JavaScript
// 예방 아이디어: 모든 코드가 항상 같은 순서로 lock 획득
const [first, second] = [resourceA, resourceB].sort();
await lock(first);
await lock(second);
try {
// critical section
} finally {
unlock(second);
unlock(first);
}실무에서 주의할 점
- timeout을 넣는 것만으로 deadlock 원인이 사라지는 것은 아닙니다. 복구는 되더라도 데이터 일관성 처리가 필요합니다.
- 분산 시스템에서는 네트워크 지연과 partial failure 때문에 deadlock 감지가 더 어렵습니다.
- lock 범위가 넓고 외부 API 호출을 lock 안에서 수행하면 위험이 커집니다.
실무 적용 가이드
- 자원 획득 순서를 전역적으로 통일해 circular wait를 차단합니다.
- lock을 잡는 시간을 최소화하고 I/O는 lock 밖에서 수행합니다.
- DB deadlock은 재시도 가능한 오류로 처리하되, 트랜잭션 순서와 인덱스도 함께 개선합니다.
함께 연결해서 보면 좋은 키워드
Deadlock, Lock, Mutual Exclusion, Circular Wait, Concurrency
정리
Deadlock은 여러 작업이 서로가 가진 자원을 기다리며 영원히 진행하지 못하는 상태입니다. 다만 개념 자체보다 중요한 것은 적용 조건과 한계를 함께 이해하는 것입니다. 작은 예제에서는 단순해 보여도 실제 서비스에서는 성능, 보안, 유지보수성, 접근성 요구사항이 함께 얽히므로, 문제의 성격을 먼저 파악한 뒤 적절한 도구로 선택하는 것이 좋습니다.