가끔 단순히 행이 걸린 상태를
데드락이라며 혼용하여 사용하는 사람이 있는데 엄밀한 의미에서 틀린 사용법이다. 그 차이를 알아보자.
행(hang)은 프로그램 수행 중 멈춰서 더이상 진행이 되지 않는 상황을 의미한다. 데드락처럼 분명한 정의가 있는 게 아니라 우리 말로 '먹통되었다'와 같은 정도의 느낌의 말이다. 대신 먹통 수준의 속어적인 표현은 아니고 책이나 논문에서도 무난히 쓸 수 있는 정도의 표현이다.
데드락(deadlock)은 전산 분야에서 많이 연구된 전문용어이다. 간단한 예를 들면, 내가 어떤 자원을 가지고 있으면서 다른 자원을 기다리고 있는데 다른 쪽에서도 내가 필요로 하는 자원을 가지고 있으면서 나의 자원을 기다리고 있어서 진행할 수 없는 상황을 의미한다.
따라서 데드락 상태에 의해 행이 걸렸다고 표현할 수는 있어도, 행이 걸린 상태를 데드락이라고 단정할 수는 없다.
데드락이 발생하기 위해서는 아래 조건을 충족해야 한다(E.G. 코프만, 1971).
- Mutual exclusion - 특정 자원은 한 프로세스 밖에 못 가진다(배타적인 통제권).
- Hold and wait - 프로세스가 자원을 가지고 있으면서 다른 자원을 기다린다.
- No preemption - 다른 프로세스가 강제로 그 자원을 뺏을 수 없다.
- Circular wait - 필요한 자원을 가지고 있는 프로세스들끼리 원을 형성. ex) a -> b -> c -> d -> a
이 조건 중에서 한 가지라도 만족하지 않으면 데드락은 발생하지 않는다
컴퓨터 과학에서는 데드락을 주제로 여러 연구가 있는데, 아래 같은 주제를 이야기 할 수 있겠다.
- 어떻게 하면 데드락을 방지할 수 있는지 (Deadlock prevention)
- 어떻게 하면 데드락을 피할 수 있는지 (Deadlock avoidance)
- 데드락이 발생할지 어떻게 알아낼 수 있을지 (Deadlock detection)
- 데드락이 발생하면 어떻게 해결할지 (Deadlock recovery)
마지막으로 데드락을 탐지하는 것은
정말로 간단한 일이 아니다.
참고