저번 시간에 동시성 제어 기법의 종류들을 알아봤다.
Lock을 하다 보면 데드락이 발생하는 경우가 있다.
이번에는 데드락에 대해서 알아보자
데드락이란 ?
교착 상태(膠着狀態) 또는 데드락(영어: deadlock)은 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태
쉽게 그림을 이용해 설명하겠다.
회사에서 코딩테스트를 치뤘다.
총 두 문제가 출제되었고, 이 회사에 합격하려면 두 문제를 모두 맞춰야 한다.
A는 1번 문제의 정답 코드를 알고 있다.
B는 2번 문제의 정답 코드를 알고 있다.
상대가 답안 제출을 끝내고 퇴실하면, 상대가 쓴 코드를 몰래 볼 수 있다.
당신 같으면 먼저 갈 것인가?
아마 서로 먼저 가길 눈치만 보다가 시험이 종료되고 집에 가서 울게 될 것이다.
그럼 이게 왜 발생하는데 ? 를 생각해 볼 수 있다.
데드락의 발생조건은 네 가지가 있다. 이 네 가지가 모두 만족되어야 데드락이 발생한다.
그렇다면 데드락 조건의 4가지를 어기면 되는 거 아닌가? 를 생각해 볼 수 있다.
이 방식은 교착 상태 예방에 해당하는 방법이고, 데드락 해결 방안은 크게 4가지가 있다.
필요조건을 거부하는 방법
결론적으로 자원 사용 효율성이 떨어지고 비용이 많이 드는 단점이 있기에 실제로 잘 사용되지 않는다.
교착 상태 회피
데드락이 발생할 위험이 있으면 진작에 회피하여 방지하는 방법
자원 할당시, 교착 상태로부터 안전한 경우에만 자원을 할당함으로써 예방한다.
여기서는 주로 은행원 알고리즘을 사용한다.
시스템 자원의 사용을 최적화할 수 있지만, 자원을 요청할 때마다 계산을 해야 하므로 복잡도가 높고, 얼마의 자원을 필요로 하는지 알아야 하는데 동적 자원환경에서 유연성이 떨어진다.
교착 상태 탐지 및 회복
교착 상태가 발생할 가능성을 허용하고, 교착 상태가 발생하면 이를 탐지하고 회복하는 방법
탐지 방법으로는 자원 할당 그래프를 통해 순환 사이클의 존재를 확인한다. 순환 사이클의 존재를 교착 상태 발생으로 간주한다. 그렇게 주기적으로 자원의 상태와 프로세스의 상태를 검사하여 교착 상태가 발생했는지 확인
단점으로 자원의 상태를 지속적으로 모니터링해야하기 때문에 오버헤드가 커질 수 있다.
회복으로는 교착 상태에 있는 프로세스 중 일부를 종료하여 자원을 해제하는 방법이 있다. 이때 먼저 종료할 프로세스의 우선순위를 두어 자원을 잃을 수 있는 단점을 최소화한다.
또한 자원을 선점하는 방식이 있다. 특정 프로세스에서 자원을 강제로 회수하여 다른 프로세스에 할당한다.
이때는 기아상태를 조심해야 한다. 매번 자원을 회수 당하기만 해서 처리가 되지 않는 상태가 발생할 수 있다.
교착 상태가 자주 발생하는 곳에서 사용되며, 실제로 가장 많이 사용되는 기법이다.
교착 상태를 해결하는 것은 비용 문제를 일으킨다고 판단하고 특별한 방법을 사용하지 않는다.
이렇게 데드락에 대해서 알아보았다.
👋개념 정리를 했으니 다음에는 MySQL을 사용한 프로젝트에 적용한 것을 소개하겠다.👋