컴퓨터공학

데드락(Deadlock)이란? 원인과 해결 방법

nyambu 2025. 3. 6. 22:00

데드락
데드락

1. 데드락(Deadlock)이란?

데드락(Deadlock, 교착 상태)이란, 두 개 이상의 프로세스가 서로의 자원을 기다리면서 무한히 대기하는 상태를 의미한다.
즉, 각 프로세스가 필요한 자원을 다른 프로세스가 점유하고 있어 서로 양보하지 않으면, 영원히 실행되지 못하는 상태가 된다. 운영체제에서는 여러 개의 프로세스가 한정된 시스템 자원을 공유하기 때문에, 적절한 자원 관리가 이루어지지 않으면 데드락이 발생할 수 있음

1-1. 쉽게 이해하는 데드락 예시

데드락은 실생활에서도 비슷한 사례를 찾아볼 수 있다.

📌 예시 1: 교차로에서 마주한 차량들이 서로 길을 양보하지 않는 경우

  • 네 방향에서 차량이 교차로에 진입했는데, 모두가 먼저 지나가려다 결국 아무도 움직이지 못하는 상태
  • 해결되지 않으면 도로가 마비됨 → 데드락 발생

📌 예시 2: 두 사람이 서로 상대방이 들고 있는 젓가락을 기다리는 경우

  • 사람이 두 명(A, B) 있는데, 각각 하나의 젓가락을 들고 있음
  • 밥을 먹으려면 양손에 젓가락이 있어야 하지만, 두 사람 모두 상대방이 가지고 있는 젓가락을 기다리고 있음
  • 서로 기다리기만 하다 결국 아무도 먹지 못하는 상황데드락 발생

📌 예시 3: ATM 기기에서 돈을 인출하는 과정에서 발생할 수 있는 데드락

  • A 사용자가 계좌에서 돈을 인출하려고 ATM을 사용 중 (계좌 자원 점유)
  • B 사용자가 같은 ATM에서 이체를 시도하지만, ATM 기계가 A의 처리가 끝나기를 기다림
  • A의 요청도 계좌 데이터 갱신이 필요하지만, B의 작업이 끝나야 가능함
  • 두 작업이 서로 끝나기를 기다리면서 시스템이 멈추는 상황 → 데드락 발생

이처럼 각 프로세스가 필요한 자원을 서로 점유하고 기다리기만 하면, 데드락이 발생할 수 있음

1-2. 데드락 발생 과정 (단계별 설명)

데드락이 발생하는 과정은 다음과 같이 설명할 수 있다.

1️⃣ 프로세스 A가 자원 X를 점유하고 있고, 자원 Y가 필요함
2️⃣ 프로세스 B가 자원 Y를 점유하고 있고, 자원 X가 필요함
3️⃣ 운영체제는 프로세스 A와 B가 서로 요청하는 자원을 할당해줄 수 없음
4️⃣ A는 B가 자원을 해제하기를 기다리고, B는 A가 자원을 해제하기를 기다림
5️⃣ 서로 영원히 기다리면서 프로세스가 실행되지 않는 상태(데드락 발생!)

1-3. 데드락이 발생하는 이유

데드락이 발생하는 이유는 주로 운영체제에서 자원을 관리하는 방식과 프로세스가 자원을 요청하는 순서 때문이다.

 

한정된 시스템 자원

  • 운영체제에서 사용할 수 있는 자원(예: CPU, 메모리, 프린터 등)이 제한적
  • 여러 프로세스가 동시에 동일한 자원을 필요로 하면 충돌이 발생

자원 할당 방식 문제

  • 운영체제가 한 번에 하나의 프로세스만 특정 자원을 사용할 수 있도록 설정
  • 이전 작업이 완료되지 않으면 새로운 자원을 할당할 수 없음

잘못된 프로세스 간 동기화

  • 여러 프로세스가 동시에 실행될 때 자원 요청 순서를 제대로 조정하지 않으면 충돌 발생
  • 예: 두 개의 프로세스가 서로 다른 순서로 자원을 요청할 경우, 서로의 자원을 기다리면서 데드락이 발생

1-4. 데드락이 운영체제에 미치는 영향

데드락이 발생하면 시스템 전체의 성능과 안정성에 심각한 문제를 초래할 수 있음

 

CPU 및 자원 사용 비효율

  • 데드락이 발생하면 CPU가 유휴 상태(Idle State)에 빠지면서, 자원이 낭비됨
  • 특정 자원을 필요로 하는 다른 프로세스들도 영향을 받으며 시스템 전체가 멈출 수도 있음

프로세스 응답 지연 및 사용자 경험 저하

  • 중요한 작업(예: 은행 시스템, 예약 시스템)이 데드락 상태에 빠지면, 사용자가 서비스를 사용할 수 없게 됨
  • 웹 서버에서 데드락이 발생하면, 웹사이트가 응답하지 않거나 트랜잭션이 중단됨

데이터 손상 및 무결성 문제

  • 데이터베이스에서 데드락이 발생하면, 트랜잭션이 중단되거나 데이터 무결성이 깨질 위험
  • 예: 은행 계좌 이체 도중 데드락이 발생하면, 돈이 빠져나갔지만 상대방 계좌에 입금되지 않는 오류 발생 가능

1-5. 데드락이 자주 발생하는 시스템 환경

운영체제에서 데드락이 자주 발생할 가능성이 높은 환경은 다음과 같다.

 

멀티스레드 프로그램 환경

  • 여러 개의 스레드가 동시에 실행되면서 동일한 자원을 점유하려고 할 경우 발생 가능
  • 예: 멀티스레딩 서버에서 여러 개의 클라이언트가 같은 데이터베이스 테이블을 수정하려 할 때

멀티태스킹 운영체제

  • 여러 개의 프로세스가 동시에 실행되면서, 각각 다른 자원을 점유하고 서로 기다리는 상황이 발생
  • 예: 운영체제에서 하나의 프로세스가 프린터를 점유하고, 다른 프로세스가 네트워크를 점유하면서 서로를 기다리는 경우

데이터베이스 시스템

  • 트랜잭션이 여러 개의 데이터를 동시에 갱신할 경우 데드락 발생 가능성 증가
  • 예: A 트랜잭션이 고객 정보 테이블을 수정 중이고, B 트랜잭션이 주문 정보 테이블을 수정하는 상황에서, 서로의 변경을 기다리는 경우

2. 데드락 발생 조건 (Coffman 조건)

데드락이 발생하려면 4가지 조건이 동시에 충족되어야 한다. 이 조건을 Coffman의 데드락 조건이라고 한다.

조건 설명
상호 배제(Mutual Exclusion) 한 번에 하나의 프로세스만 특정 자원을 사용할 수 있음
점유와 대기(Hold and Wait) 자원을 점유한 프로세스가 추가 자원을 기다리는 상태
비선점(No Preemption) 운영체제가 강제로 자원을 회수할 수 없음
순환 대기(Circular Wait) 프로세스 간에 자원 할당이 원형(사이클)을 형성하며 대기

 

📌 예시
1️⃣ P1이 자원 A를 점유하고 있고, P2가 자원 B를 점유하고 있음
2️⃣ P1은 자원 B가 필요하고, P2는 자원 A가 필요하지만 서로 기다리는 상태가 됨
3️⃣ 운영체제는 강제로 자원을 빼앗을 수 없기 때문에 데드락이 발생


3. 데드락 해결 방법

데드락을 해결하는 방법은 크게 4가지 접근 방식으로 나눌 수 있다.

해결 방법
설명
예방(Prevention) 데드락 발생 조건 중 하나 이상을 제거
회피(Avoidance) 데드락이 발생하지 않도록 사전에 자원 할당을 조정
탐지(Detection) 및 복구(Recovery) 데드락이 발생한 후 이를 감지하고 해결
무시(Ignore) 데드락이 드물게 발생할 경우, 해결하지 않고 무시

3-1. 데드락 예방 (Deadlock Prevention)

데드락 발생 조건(Coffman 조건) 중 하나 이상을 제거하는 방식으로 데드락을 방지하는 방법이다.

 

1) 상호 배제(Mutual Exclusion) 제거

  • 자원을 여러 프로세스가 동시에 사용할 수 있도록 함
  • 예시: 파일 읽기 작업에서 여러 프로세스가 동시에 접근할 수 있도록 읽기 전용(Read-Only) 모드 제공

2) 점유와 대기(Hold and Wait) 제거

  • 프로세스가 실행되기 전에 필요한 모든 자원을 한 번에 할당
  • 단점: 자원을 비효율적으로 사용할 가능성이 있음

3) 비선점(No Preemption) 제거

  • 자원을 점유한 프로세스가 추가 자원을 요청하면 기존 자원을 반납하도록 강제
  • 단점: 자주 문맥 전환이 발생하여 성능 저하 가능

4) 순환 대기(Circular Wait) 제거

  • 자원을 고유한 우선순위를 부여하여, 항상 낮은 번호의 자원을 먼저 할당
  • 예시: 프린터(1) → 스캐너(2) → 네트워크(3) 순으로만 자원 요청 가능하도록 설정

📌 예방 기법의 한계

  • 효율적인 자원 활용이 어렵고, 성능 저하가 발생할 수 있음
  • 일부 시스템에서는 모든 데드락 조건을 완전히 제거하기 어려움

3-2. 데드락 회피 (Deadlock Avoidance)

데드락을 방지하기 위해 자원 할당을 조절하여 데드락이 발생할 가능성을 차단하는 방식이다.

 

대표적인 알고리즘: 은행원 알고리즘(Banker's Algorithm)

  • 프로세스가 자원을 요청할 때, 자원을 할당하면 안전한 상태인지 확인
  • 시스템이 **안전한 상태(Safe State)**라면 자원을 할당
  • 안전한 상태가 아닐 경우, 자원 할당을 거부하여 데드락을 회피

📌 회피 기법의 한계

  • 자원의 최대 요구량을 미리 알아야 함
  • 자원 할당 요청을 거부할 경우, 실행 시간이 지연될 수 있음

3-3. 데드락 탐지 및 복구 (Detection & Recovery)

데드락을 완전히 방지하는 것이 불가능한 경우, 데드락이 발생했는지 감지(Detection)하고, 이를 해결(Recovery)하는 방법을 사용한다.

 

1) 데드락 탐지 방법

  • 자원 할당 그래프(Resource Allocation Graph, RAG) 사용
    • 프로세스와 자원의 관계를 그래프로 표현
    • 순환(Sycle)이 존재하면 데드락이 발생한 것으로 판단

2) 데드락 복구 방법

  • 교착 상태에 빠진 프로세스를 강제 종료(Kill Process)
  • 점유하고 있는 자원을 강제로 해제(Preempt Resources)

📌 탐지 및 복구 기법의 한계

  • 강제 종료할 경우 데이터 손실 가능성이 있음
  • 자원 회수가 빈번할 경우 시스템 성능이 저하될 수 있음

3-4. 데드락 무시 (Ignore)

일부 운영체제(예: Windows, Linux)에서는 데드락이 드물게 발생하므로 이를 감지하거나 해결하지 않고 무시하는 방식을 사용한다.

 

대표적인 예시: UNIX/Linux 운영체제

  • 데드락이 발생해도 별다른 해결책을 적용하지 않고 사용자가 강제 종료하도록 방치
  • 예: Ctrl + C로 강제 종료, 시스템 재부팅

📌 무시 기법의 한계

  • 중요한 시스템에서 데드락이 발생하면 심각한 문제가 될 수 있음
  • 신뢰성이 중요한 금융, 의료 시스템에서는 사용하기 어려움

4. 실제 사례로 보는 데드락 해결 방법

📌 사례 1: 데이터베이스 시스템에서의 데드락 해결

  • 트랜잭션(Tx1, Tx2)이 각각 특정 데이터 잠금을 획득하고, 서로의 데이터를 기다리면 데드락 발생
  • 해결 방법: 트랜잭션 타임아웃 설정하여 일정 시간이 지나면 자동으로 롤백

📌 사례 2: 운영체제의 자원 관리에서 데드락 회피

  • CPU 스케줄러는 특정 프로세스가 너무 오래 자원을 점유하면 강제 회수하여 데드락을 방지