데드락

기술노트
Admin (토론 | 기여)님의 2025년 9월 11일 (목) 16:50 판 (Gemini 벌크 업로더로 자동 업로드)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

교착 상태 (Deadlock)

교착 상태(Deadlock)란, 멀티프로세싱 또는 멀티스레딩 환경에서 두 개 이상의 프로세스(또는 스레드)가 서로 상대방이 가진 자원을 기다리며 무한히 대기하는 상태를 의미합니다. 이로 인해 시스템 전체가 멈추는 등 심각한 문제를 야기할 수 있습니다.


📋 교착 상태의 발생 조건 (4가지)

교착 상태는 아래의 4가지 조건이 모두 동시에 충족될 때 발생할 수 있습니다. 하나라도 충족되지 않으면 교착 상태는 발생하지 않습니다.

  • 상호 배제 (Mutual Exclusion) : 한 번에 하나의 프로세스만 자원을 사용할 수 있어야 합니다. (자원이 공유 불가능해야 함)
  • 점유와 대기 (Hold and Wait) : 프로세스가 최소한 하나의 자원을 점유하고 있으면서, 다른 프로세스에 할당된 자원을 추가로 얻기 위해 대기해야 합니다.
  • 비선점 (No Preemption) : 다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없어야 합니다. (자발적으로 반납해야 함)
  • 순환 대기 (Circular Wait) : 각 프로세스가 다음 프로세스가 요구하는 자원을 가지고 있는, 꼬리를 무는 형태의 대기 사슬(P0→P1→...→Pn→P0)이 존재해야 합니다.

🛠️ 교착 상태의 해결 방법

  • 예방 (Prevention) : 4가지 발생 조건 중 하나를 원천적으로 부정하여 교착 상태가 발생하지 않도록 하는 방법입니다. 하지만 자원 낭비나 구현의 복잡성 등 단점이 큽니다.

> * '순환 대기 부정': 자원에 고유 번호를 할당하고, 번호 순서대로만 자원을 요구하도록 강제하는 것이 현실적인 예방책입니다.

  • 회피 (Avoidance) : 교착 상태가 발생할 가능성이 있는 '불안전 상태(Unsafe state)'를 피하는 방법입니다. 시스템이 자원을 할당할 때, 할당 후에도 시스템이 '안전 상태(Safe state)'로 남아있을 수 있는지 동적으로 검사합니다.

> * '대표적인 알고리즘': 은행원 알고리즘 (Banker's Algorithm)이 있지만, 실용성이 낮아 거의 사용되지 않습니다.

  • 탐지 및 회복 (Detection & Recovery) : 교착 상태 발생을 허용하되, 발생 여부를 주기적으로 탐지하고(자원 할당 그래프 분석 등), 발생했다면 이를 해결하는 방법입니다.

> * '회복': 교착 상태에 빠진 프로세스 중 일부를 강제 종료하거나, 할당된 자원을 빼앗아 다른 프로세스에 할당합니다.

  • 무시 (Ignorance) : 교착 상태가 매우 드물게 발생한다고 가정하고, 이를 처리하는 비용이 더 크다고 판단하여 아무런 조치도 취하지 않는 방법입니다. 대부분의 범용 운영체제(Windows, UNIX)가 이 방식을 채택하고, 문제 발생 시 사용자가 직접 프로세스를 종료하도록 합니다.

💡 개발자 핵심 Point

  • 교착 상태는 주로 멀티스레딩 환경에서 공유 자원에 대한 잠금(Lock) 순서가 꼬일 때 발생합니다.
  • 예를 들어, 스레드 A가 자원 R1을 점유하고 R2를 기다리고, 스레드 B는 자원 R2를 점유하고 R1을 기다리는 상황이 대표적입니다.
  • 이를 방지하기 위한 가장 간단하고 효과적인 방법은, 여러 스레드가 공유 자원에 접근할 때 항상 동일한 순서로 잠금을 획득하도록 규칙을 정하는 것입니다. (e.g., R1을 먼저 잠그고 R2를 잠그도록 강제)
  • 데이터베이스에서도 여러 트랜잭션이 동시에 데이터에 접근할 때 교착 상태가 발생할 수 있으며, 대부분의 DBMS는 교착 상태를 탐지하여 일부 트랜잭션을 강제 롤백(Rollback)시키는 방식으로 이를 회복합니다.