데드락(교착 상태) 발생 조건과 해결 방법은?
한 줄 답변
데드락은 두 개 이상의 프로세스가 서로의 자원을 기다리며 무한 대기에 빠지는 상태입니다. 상호 배제, 점유 대기, 비선점, 순환 대기라는 4가지 조건이 동시에 충족될 때 발생하며, 예방(Prevention)이나 회피(Avoidance)를 통해 해결합니다.
핵심 개념 정리
데드락은 한정된 자원을 여러 프로세스가 사용하려 할 때 발생하는 병목 현상의 극단적인 형태입니다. 각 프로세스가 자원을 점유한 상태에서 다른 프로세스가 가진 자원을 추가로 요구하며, 어느 쪽도 진행되지 못하는 상태를 말합니다. 이는 다중 프로그래밍 환경에서 시스템 자원 활용도를 높이려 할 때 빈번히 고려해야 할 설계 요소입니다.
데드락이 발생하려면 'Coffman 조건'이라 불리는 4가지가 반드시 동시에 성립해야 합니다. 첫째는 자원을 한 번에 하나의 프로세스만 사용 가능한 '상호 배제', 둘째는 자원을 가진 채 다른 자원을 기다리는 '점유 대기', 셋째는 강제로 자원을 뺏어올 수 없는 '비선점', 마지막으로 대기 프로세스들이 원형으로 꼬리를 무는 '순환 대기'입니다. 이 중 하나라도 깨지면 데드락은 발생하지 않습니다.
현대 운영체제에서는 데드락을 완전히 방지하기보다 발생 가능성을 낮추거나 발생 후 처리하는 방식을 취합니다. 자원 할당 그래프를 통해 순환 대기 여부를 파악하거나, 은행원 알고리즘(Banker's Algorithm)처럼 시스템의 안전 상태(Safe State)를 체크하여 자원을 할당하는 회피 전략이 대표적입니다. 리눅스 등 범용 OS에서는 성능 저하를 우려해 데드락을 무시하고 사용자나 관리자가 처리하게 하는 타조 알고리즘(Ostrich Algorithm)을 쓰기도 합니다.
비교 정리
| 항목 | 데드락 예방 (Prevention) | 데드락 회피 (Avoidance) |
|---|---|---|
| 핵심 목표 | 4가지 발생 조건 중 하나를 사전에 차단 | 실행 시점에 자원 할당 상태를 감시하여 위험 시 거절 |
| 자원 효율성 | 자원 낭비가 매우 큼 (심한 제약 조건) | 예방보다는 효율적이나 계산 오버헤드 존재 |
| 구현 방식 | 자원의 일괄 할당 또는 순차적 할당 강제 | 은행원 알고리즘 등으로 안전 상태 확인 |
| 실제 적용 | 설계 단계에서 정적 제약으로 적용 | 동적으로 자원 요청 정보가 미리 필요함 |
면접에서 이렇게 답하세요
답변할 때는 먼저 데드락의 정의와 4가지 발생 조건을 명확히 나열하는 것으로 시작하세요. 이후 실무적인 관점에서 '예방'은 자원 낭비가 심해 잘 쓰이지 않는다는 점, 대신 순환 대기를 막기 위해 자원에 고유 번호를 부여하는 방식 등이 현실적임을 언급하면 좋습니다. 또한, 분산 환경이나 DB 트랜잭션에서의 데드락 경험(예: 타임아웃 설정)을 곁들이면 훨씬 높은 점수를 받을 수 있습니다.
자주 묻는 추가 질문
Q. 은행원 알고리즘의 치명적인 단점은?
프로세스가 사용할 최대 자원량을 미리 알아야 하며, 자원의 수가 고정되어야 하는 등 제약이 많아 실제 범용 OS에는 적용이 어렵습니다.
Q. Livelock(라이브락)과 Deadlock의 차이는?
데드락은 프로세스가 대기 상태(Blocked)에 멈춰있는 것이고, 라이브락은 상태는 계속 변하지만 진행이 없는 '무한 루프' 같은 상태입니다.
Q. 데이터베이스 트랜잭션 데드락 해결법은?
DBMS의 데드락 감지기가 주기적으로 체크하여 비용이 적은 트랜잭션을 Rollback(Victim 선정)시키거나, 타임아웃을 설정해 강제 종료합니다.
커뮤니티 하이라이트
“현업에서는 자원 할당 순서를 정적(Static)으로 고정하는 것만으로도 90% 이상의 데드락을 막을 수 있습니다. 코드 리뷰 시 이 부분을 체크하는 게 핵심이에요.”
“DB 교착 상태는 로그를 남기는 게 정말 중요합니다. 어떤 쿼리들이 충돌했는지 파악하고 인덱스 설계나 트랜잭션 범위를 좁히는 식으로 대응해야 합니다.”
42명의 개발자가 이 질문에 참여했습니다
관련 면접 질문
앱에서 직접 답변해보세요
매일 3개의 면접 질문에 답변하고,
다른 개발자들의 답변을 비교해보세요.