썸네일 이미지는 자원을 서로 점유하고 대기하는 프로세스들이 원형으로 얽힌 데드락 상황을 gpt가 그려준 그림입니다. 가운데가 자원인 것 같죠? 회로를 굉장히 입체적으로 그린 그림이네요 ㅋㅋㅋ
컴퓨터가 갑자기 멈추거나 아무 반응이 없는 경우, 그 원인이
교착 상태(deadlock)
일 수 있습니다. 교착 상태는 여러 프로세스가 서로의 자원을 기다리며
서로를 막고 있는 상황
을 말합니다.
이번 글에서는 교착 상태가 발생하는 조건부터 이를 해결하는 다양한 방법까지 차근차근 정리해보겠습니다. 특히 면접에서 자주 나오는 이론이므로, 예제와 함께 정확히 이해해두는 것이 중요합니다.
교착 상태는 두 개 이상의 프로세스가 서로 자원을 점유한 채, 상대가 가진 자원을 기다리느라 영원히 진행되지 못하는 상황입니다.
예시: P1은 프린터를, P2는 스캐너를 점유한 상태에서 각각 상대의 자원을 요청하고 기다리는 경우, 두 프로세스는 서로를 기다리느라 멈춰버립니다.
(서로) 언제 끝나시지...?
P1은 프린터를 점유하고 있고, P2는 스캐너를 점유하고 있습니다. 이 상태에서 P1은 P2의 스캐너를 기다리고, P2는 P1의 프린터를 기다립니다. 이렇게 서로를 막고 있는 상태가 교착 상태입니다.
🚀
교착 상태 발생 조건 - Coffman 조건🔗
교착 상태는 다음 네 가지 조건이 모두 만족될 때 발생합니다
상호 배제 (Mutual Exclusion)
: 한 자원은 동시에 하나의 프로세스만 사용 가능
점유 대기 (Hold and Wait)
: 자원을 보유한 채 다른 자원을 기다리는 상태
비선점 (No Preemption)
: 자원을 강제로 회수할 수 없음
순환 대기 (Circular Wait)
: 여러 프로세스가 서로 자원을 요구하며 원형으로 기다리는 상태
이 중 하나라도 깨지면 교착 상태는 발생하지 않습니다. 따라서 해결 전략은 이 조건 중 최소 하나를 없애는 방식으로 접근합니다.
Coffman 조건 중 하나를
애초에 성립하지 않도록 설계
하는 방법입니다.
점유 대기 방지: 자원을 요청할 때 한 번에 모두 할당하거나, 미리 확보할 수 없으면 아무 것도 할당하지 않음
순환 대기 방지: 자원에 고유한 번호를 부여하고 항상 번호 순서대로 요청하게 함
프로세스가 자원을 요청할 때, 그 요청을 허용했을 때 시스템이 안전 상태인지 확인한 후 허용하는 방식입니다. 대표적으로
은행원 알고리즘(Banker's Algorithm)
이 있습니다.
예시: 은행에서 고객에게 대출을 해줄 때, 전체 자금이 부족해질 위험이 있는지를 계산하고 승인 여부를 판단하는 방식과 비슷합니다.
교착 상태가 발생하는 것을 허용하되, 주기적으로 시스템을 검사하여 교착 상태를 감지합니다.
탐지를 위해
자원 할당 그래프(Resource Allocation Graph)
나
대기 그래프(Wait-for Graph)
를 활용합니다.
탐지 알고리즘은 시스템에 부하를 줄 수 있으므로 사용 시 주의가 필요합니다.
교착 상태를 탐지한 후, 시스템을 정상 상태로 되돌리는 방식입니다. 주요 방법은 다음과 같습니다
프로세스 종료: 교착 상태에 있는 프로세스를 강제로 종료
자원 선점: 일부 프로세스의 자원을 강제로 회수하고 다른 프로세스에 할당
스레드 환경에서도 교착 상태는 자주 발생합니다. 예를 들어 Java에서 두 개의 스레드가 서로 다른 객체 락을 얻고 상대 객체를 기다리면 교착 상태가 발생할 수 있습니다.
Java
이 문제를 해결하려면 락을 얻는 순서를 고정하거나, 락 타임아웃 등을 설정해야 합니다.
이번 글에서는 교착 상태의 개념과 발생 조건, 그리고 예방, 회피, 탐지, 회복이라는 대표적인 해결 전략을 예시와 함께 정리했습니다.
기술 면접에서는 단순한 정의보다는
예시를 통해 이해했는지
를 확인하는 질문이 많으므로, 각 조건과 전략을 실제 상황에 연결해보는 연습이 중요합니다.
드디어 길고 긴 프로세스 관련 글이 끝났습니다. 다음 편에서는 컴퓨터 메모리의 기본 단위인
메인 메모리
구조에 대해 알아보겠습니다.