데드락의 의미와 발생 원인 및 해결 방안

BlackHan·2024년 5월 27일
0

동시성

목록 보기
3/5
post-custom-banner

저번 시간에 동시성 제어 기법의 종류들을 알아봤다.
Lock을 하다 보면 데드락이 발생하는 경우가 있다.
이번에는 데드락에 대해서 알아보자

데드락이란 ?

교착 상태(膠着狀態) 또는 데드락(영어: deadlock)은 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태

쉽게 그림을 이용해 설명하겠다.

회사에서 코딩테스트를 치뤘다.
총 두 문제가 출제되었고, 이 회사에 합격하려면 두 문제를 모두 맞춰야 한다.

A는 1번 문제의 정답 코드를 알고 있다.
B는 2번 문제의 정답 코드를 알고 있다.
상대가 답안 제출을 끝내고 퇴실하면, 상대가 쓴 코드를 몰래 볼 수 있다.

당신 같으면 먼저 갈 것인가?
아마 서로 먼저 가길 눈치만 보다가 시험이 종료되고 집에 가서 울게 될 것이다.

그럼 이게 왜 발생하는데 ? 를 생각해 볼 수 있다.
데드락의 발생조건은 네 가지가 있다. 이 네 가지가 모두 만족되어야 데드락이 발생한다.

데드락의 필요조건 4가지

  • 비선점
    이미 할당된 자원을 강제로 빼앗을 수 없다.
    상대의 답안지를 강제로 뺏을 수 없던 것처럼 말이다.
  • 점유와 대기
    다른 프로세스에 할당된 자원을 점유하기 위해 대기해야 한다.
    상대의 답안지를 보기 위해 다 쓰고 제출할 때까지 기다려야 했다.
  • 순환 대기
    대기 프로세스의 집합이 순환 형태로 자원을 대기한다.
    A는 B의 답안을 기다리고, B는 A의 답안을 기다리는 형태이다.
  • 상호 배제
    자원은 한 번에 한 프로세스만 사용할 수 있다.
    위 예시에서는 한 명이 하나의 답안만 아는 상황을 가정했다.

데드락 해결 방안

그렇다면 데드락 조건의 4가지를 어기면 되는 거 아닌가? 를 생각해 볼 수 있다.
이 방식은 교착 상태 예방에 해당하는 방법이고, 데드락 해결 방안은 크게 4가지가 있다.

  • 교착 상태 예방
    필요조건을 거부하는 방법
  1. 비선점 조건을 거부 - 프로세스가 강제로 자원을 잃을 수 있어, 작업의 일관성이 깨질 수 있다.
  2. 점유와 대기 조건을 거부 - 모든 자원을 한꺼번에 요청하면 다른 프로세스가 자원을 얻기 어려워져서 자원의 효율적인 사용이 어려워진다.
  3. 상호 배제 조건 거부 - 자원을 여러 프로세스가 동시에 사용할 수 있게 되는데, 이는 실제로 불가능하거나, 데이터의 무결성을 해칠 수 있다.
  4. 순환 대기 조건 거부 - 자원의 순서를 정하는 데 복잡성이 증가하고, 순서에 따라 요청이 제한되어 비효율적일 수 있다.

결론적으로 자원 사용 효율성이 떨어지고 비용이 많이 드는 단점이 있기에 실제로 잘 사용되지 않는다.

  • 교착 상태 회피
    데드락이 발생할 위험이 있으면 진작에 회피하여 방지하는 방법
    자원 할당시, 교착 상태로부터 안전한 경우에만 자원을 할당함으로써 예방한다.
    여기서는 주로 은행원 알고리즘을 사용한다.

    시스템 자원의 사용을 최적화할 수 있지만, 자원을 요청할 때마다 계산을 해야 하므로 복잡도가 높고, 얼마의 자원을 필요로 하는지 알아야 하는데 동적 자원환경에서 유연성이 떨어진다.

  • 교착 상태 탐지 및 회복
    교착 상태가 발생할 가능성을 허용하고, 교착 상태가 발생하면 이를 탐지하고 회복하는 방법
    탐지 방법으로는 자원 할당 그래프를 통해 순환 사이클의 존재를 확인한다. 순환 사이클의 존재를 교착 상태 발생으로 간주한다. 그렇게 주기적으로 자원의 상태와 프로세스의 상태를 검사하여 교착 상태가 발생했는지 확인

    단점으로 자원의 상태를 지속적으로 모니터링해야하기 때문에 오버헤드가 커질 수 있다.

    회복으로는 교착 상태에 있는 프로세스 중 일부를 종료하여 자원을 해제하는 방법이 있다. 이때 먼저 종료할 프로세스의 우선순위를 두어 자원을 잃을 수 있는 단점을 최소화한다.

    또한 자원을 선점하는 방식이 있다. 특정 프로세스에서 자원을 강제로 회수하여 다른 프로세스에 할당한다.
    이때는 기아상태를 조심해야 한다. 매번 자원을 회수 당하기만 해서 처리가 되지 않는 상태가 발생할 수 있다.

교착 상태가 자주 발생하는 곳에서 사용되며, 실제로 가장 많이 사용되는 기법이다.

  • 교착 상태 무시
    교착 상태를 해결하는 것은 비용 문제를 일으킨다고 판단하고 특별한 방법을 사용하지 않는다.
    만약 교착 상태 발생시에는 시스템을 재부팅 시키는 방식으로 해결
    교착 상태가 자주 발생하지 않는 시스템에서 사용된다.

이렇게 데드락에 대해서 알아보았다.
👋개념 정리를 했으니 다음에는 MySQL을 사용한 프로젝트에 적용한 것을 소개하겠다.👋

profile
Slow-starter
post-custom-banner

0개의 댓글