데드락(Deadlock)의 발생 조건과 해결 방법
CS
퇴근길 꽉 막힌 사거리를 상상해 보세요. 꼬리 물기를 하다가 사방의 차들이 엉켜서 아무도 움직일 수 없는 상태. 이것이 컴퓨터 세계의 **교착 상태(Deadlock)**입니다. 프로세스들이 서로가 가진 자원을 탐내며 무한정 기다리는 상태죠.
1. 데드락 발생의 4가지 필요충분조건
이 4가지 조건이 '동시에' 성립해야 데드락이 발생합니다. 하나라도 깨면 해결됩니다.
- 상호 배제 (Mutual Exclusion): 자원은 한 번에 한 프로세스만 사용할 수 있어야 한다.
- 점유 대기 (Hold and Wait): 자원을 가진 상태에서 다른 자원을 기다려야 한다.
- 비선점 (No Preemption): 다른 프로세스의 자원을 강제로 뺏을 수 없다.
- 순환 대기 (Circular Wait): 대기하는 프로세스들이 꼬리에 꼬리를 물고 원형을 이뤄야 한다.
2. 해결 방법
2.1 예방 (Prevention)
4가지 조건 중 하나를 원천 봉쇄합니다.
- 예: "자원을 점유한 상태에선 대기하지 못하게 한다" (점유 대기 부정). 하지만 자원 낭비가 심해서 잘 안 씁니다.
2.2 회피 (Avoidance) - 은행원 알고리즘
데드락이 발생할 것 같으면 자원을 안 줍니다. 시스템을 항상 '안전 상태(Safe State)'로 유지하는 알고리즘입니다. 하지만 자원 요청량을 미리 알고 있어야 해서 구현이 어렵습니다.
2.3 탐지 및 회복 (Detection & Recovery)
데드락을 허용하되, 발생하면 찾아내서 고칩니다.
- 프로세스 종료: 데드락에 걸린 놈들을 싹 다 죽이거나, 하나씩 죽여보면서 풀리는지 봅니다.
- 자원 선점: 자원을 강제로 뺏어서 딴 놈 줍니다.
현대 운영체제는 대부분 "무시" 기법을 씁니다. 데드락은 사실 발생 빈도가 낮기 때문에, 그걸 해결하려고 오버헤드를 들이는 것보다 그냥 사용자가 "어? 멈췄네" 하고 재부팅하게 두는 게 가성비가 좋기 때문입니다(Ostrich Algorithm).