본문 바로가기
IT/프로그래밍

데드락(Deadlock)이란 무엇이며, 어떻게 방지할 수 있나요? 🚫

by kelcat 2024. 11. 15.
반응형

데드락(Deadlock) 또는 교착 상태는 컴퓨터 시스템의 여러 프로세스나 스레드가 서로의 자원을 기다리며 무한히 멈추는 상태를 말합니다. 이 문제는 시스템 성능 저하의 주요 원인으로 작용하며, 특히 다중 프로세스 환경에서 자주 발생할 수 있습니다. 이번 글에서는 데드락의 정의, 발생 조건, 그리고 이를 방지하거나 해결할 수 있는 방법을 알아보겠습니다.

1. 데드락이란? 🔒

데드락은 두 개 이상의 프로세스 또는 스레드가 서로가 점유한 자원을 요청하며 무한히 대기하는 상태입니다. 예를 들어, 프로세스 A가 자원 X를 점유하고 자원 Y가 해제되기를 기다리는 동시에, 프로세스 B는 자원 Y를 점유하고 자원 X가 해제되기를 기다린다면, 두 프로세스는 서로의 자원을 기다리며 데드락 상태에 빠집니다.

데드락 발생의 예

예를 들어, 은행 시스템에서 프로세스 A와 B가 각각 자원을 독점하고 있고 서로의 자원이 필요할 경우, 두 프로세스가 무한정 대기하게 됩니다. 이런 상태가 계속되면 전체 시스템이 멈출 수 있습니다.

2. 데드락 발생 조건 📌

데드락은 아래 네 가지 조건이 모두 충족될 때 발생합니다. 이를 데드락 발생 조건이라 하며, 이 조건 중 하나만 제거해도 데드락을 방지할 수 있습니다.

  1. 상호 배제(Mutual Exclusion): 자원은 한 번에 한 프로세스만 사용할 수 있습니다.
  2. 점유 대기(Hold and Wait): 자원을 점유한 프로세스가 다른 자원을 기다리며 대기하는 상태입니다.
  3. 비선점(No Preemption): 프로세스가 점유한 자원은 프로세스가 스스로 해제하기 전까지 다른 프로세스가 강제로 가져갈 수 없습니다.
  4. 순환 대기(Circular Wait): 두 개 이상의 프로세스가 순환 형태로 자원을 기다리는 상태입니다.

이 조건이 모두 충족되면 데드락이 발생할 수 있습니다. 따라서, 데드락 방지를 위해 이 조건 중 하나를 충족하지 않도록 하는 방식이 사용됩니다.

3. 데드락 방지 방법 💡

데드락 방지 방법은 크게 예방(Prevention), 회피(Avoidance), 검출과 복구(Detection and Recovery)로 나눌 수 있습니다. 각 방법의 특징과 구현 방법을 살펴보겠습니다.

(1) 예방(Prevention)

데드락을 예방하는 방법은 앞서 설명한 네 가지 데드락 발생 조건 중 하나를 제거하는 방식입니다.

  • 상호 배제 조건 제거: 가능한 자원을 공유 자원으로 설정합니다. 그러나, 프린터나 하드디스크 같은 자원은 공유가 어렵기 때문에 모든 자원에 대해 상호 배제를 제거할 수는 없습니다.
  • 점유 대기 조건 제거: 프로세스가 자원을 요청하기 전에 필요한 모든 자원을 한 번에 할당받도록 합니다. 하지만, 이 방법은 자원의 낭비를 초래할 수 있습니다.
  • 비선점 조건 제거: 프로세스가 자원을 점유하고 있을 때 다른 프로세스가 해당 자원을 필요로 하면, 점유 중인 자원을 강제로 회수하여 다른 프로세스에 할당합니다. 단, 이는 프로세스의 상태를 불안정하게 할 수 있습니다.
  • 순환 대기 조건 제거: 자원에 순서를 부여하고, 프로세스가 오름차순으로 자원을 요청하게 합니다. 이를 통해 순환 대기 조건을 방지할 수 있습니다.

(2) 회피(Avoidance)

회피는 시스템이 사전에 데드락 상태를 예측하고 자원을 할당할지 여부를 결정하는 방식입니다. 가장 잘 알려진 방법은 은행가 알고리즘(Banker's Algorithm)입니다.

  • 은행가 알고리즘: 프로세스가 자원을 요청할 때, 시스템이 데드락 없이 자원을 안전하게 할당할 수 있는지를 확인하는 알고리즘입니다. 마치 은행에서 대출 요청을 처리할 때 자원이 충분한지 확인하는 방식과 유사합니다. 이 알고리즘은 요청을 승인할 때 자원이 안전한 상태를 유지하도록 합니다.

회피 방법은 시스템의 자원 상태를 지속적으로 검사하므로 높은 계산 자원이 필요하다는 단점이 있습니다. 따라서, 비교적 적은 프로세스에서 사용되며 대규모 시스템에는 비효율적일 수 있습니다.

(3) 검출과 복구(Detection and Recovery)

검출과 복구는 데드락이 발생했을 때 이를 확인하고, 해결하는 방법입니다. 이 방식은 데드락을 허용하고, 그 발생을 검출하여 복구하는 접근법을 사용합니다.

  • 검출(Detection): 운영체제는 주기적으로 시스템의 자원 상태를 검사하여 데드락 발생 여부를 확인합니다. 데드락이 발생한 경우 이를 탐지하여 해결 방안을 찾습니다.
  • 복구(Recovery): 데드락이 발생한 프로세스를 강제 종료하거나, 일부 자원을 회수하여 다른 프로세스가 계속 실행될 수 있도록 합니다. 복구 방법으로는 프로세스를 종료하거나 특정 자원을 선점하는 방식이 있습니다.

검출과 복구는 데드락이 발생할 가능성이 매우 낮은 경우에 사용하는 방법입니다. 다만, 데드락이 발생했을 때 일부 프로세스를 강제 종료해야 하므로 데이터 유실 가능성이 있으며, 최적의 프로세스 종료 방안을 결정하기 어려운 경우가 많습니다.

4. 데드락 방지를 위한 추가 기법 📊

(1) 타임아웃 기법

타임아웃은 프로세스가 일정 시간 동안 자원을 획득하지 못할 경우 강제로 중단시키는 방법입니다. 이 방법은 대규모 시스템에서 쉽게 구현할 수 있으며, 데드락 가능성을 줄일 수 있습니다. 그러나, 타임아웃 시간 설정이 중요하며 자주 중단이 발생할 경우 성능 저하가 일어날 수 있습니다.

(2) 자원 할당 그래프

자원 할당 그래프는 시스템의 자원 할당 상태를 시각적으로 표현하는 방법입니다. 프로세스와 자원을 노드로 표시하고, 요청 또는 할당된 자원에 따라 화살표를 그립니다. 순환 경로가 생기면 데드락 가능성이 있다는 신호로 파악할 수 있습니다. 이 방식은 시스템의 자원 상태를 이해하는 데 유용하며, 데드락 발생 여부를 빠르게 검토할 수 있습니다.

FAQ

  • Q1: 데드락이 발생하면 시스템 전체가 멈추나요?
    • A1: 꼭 그렇지는 않습니다. 특정 프로세스만 데드락에 걸리는 경우도 있지만, 시스템의 중요한 자원이 관련되면 전체 시스템 성능에 영향을 줄 수 있습니다.
  • Q2: 데드락 예방과 회피는 어떤 차이가 있나요?
    • A2: 예방은 데드락 조건을 사전에 차단하는 방식이며, 회피는 자원 요청 시 데드락이 발생할 가능성을 평가하여 자원 할당을 결정하는 방식입니다.
  • Q3: 데드락 방지에서 은행가 알고리즘이란 무엇인가요?
    • A3: 은행가 알고리즘은 자원을 요청할 때 시스템이 안전한 상태인지 확인하여, 안전하지 않으면 요청을 거절하는 방식입니다. 이를 통해 데드락을 방지할 수 있습니다.
반응형