날짜 : 2023-11-26 17:15
주제 :
개요
Deadlock(데드락)은 멀티스레딩 프로그래밍에서 발생하는 중요한 문제 중 하나로, 여러 스레드 또는 프로세스가 서로의 자원을 기다리며 영원히 대기하는 상태를 말합니다. 이 상태에서는 어떤 스레드도 진행할 수 없으며, 프로그램이 멈춘 것처럼 보이는 상황이 발생합니다.
Deadlock의 발생 조건
데드락이 발생하기 위해서는 다음 네 가지 조건이 모두 충족되어야 합니다:
-
상호 배제(Mutual Exclusion)
- 자원은 한 번에 하나의 스레드에 의해서만 사용될 수 있습니다.
-
보유 대기(Hold and Wait)
- 최소한 하나의 스레드가 자원을 보유한 상태에서 추가 자원을 기다리고 있어야 합니다.
-
비선점(No Preemption)
- 다른 스레드가 이미 보유하고 있는 자원은 강제로 뺏을 수 없습니다.
-
순환 대기(Circular Wait)
- 두 개 이상의 스레드가 서로 다음 스레드가 보유한 자원을 기다리는 순환 구조를 형성합니다.
Deadlock의 예시
일반적인 예로, 두 스레드가 두 개의 자원(예: 두 개의 파일, 두 개의 락 등)을 사용해야 하는 상황을 생각해볼 수 있습니다. 스레드 A가 자원 1을 보유하고 자원 2를 기다리는 동안, 스레드 B가 자원 2를 보유하고 자원 1을 기다리는 상황이 발생하면, 두 스레드 모두 진행할 수 없게 되어 데드락에 빠집니다.
Deadlock 해결 및 예방 방법
-
데드락 예방(Deadlock Prevention)
- 데드락 발생 조건 중 하나 이상을 제거하여 데드락을 예방합니다.
- 예를 들어, 자원을 요청할 때 다른 모든 자원을 먼저 해제하도록 하여 '보유 대기' 조건을 제거할 수 있습니다.
-
데드락 회피(Deadlock Avoidance)
- 자원 할당에 대해 더 안전한 방법을 사용하여 데드락의 가능성을 회피합니다.
- 대표적인 예로 '은행원 알고리즘(Banker's Algorithm)'이 있으며, 시스템이 안전 상태를 유지할 수 있는지를 체크하여 자원을 할당합니다.
-
데드락 탐지 및 복구(Deadlock Detection and Recovery)
- 데드락이 발생했을 때 이를 탐지하고, 시스템을 복구하는 방법을 사용합니다.
- 이는 주로 자원 할당 그래프를 분석하여 데드락을 탐지하고, 데드락에 빠진 스레드를 종료하거나 할당된 자원을 해제하는 방법으로 수행됩니다.
-
자원 할당 전략 변경
- 자원 할당 전략을 변경하여 데드락 발생을 줄일 수 있습니다.
- 예를 들어, 모든 필요한 자원을 한 번에 요청하고 할당받도록 하여 순환 대기 조건을 방지할 수 있습니다.
데드락은 특히 복잡한 시스템이나 다중 스레드 애플리케이션에서 주의해야 하는 중요한 문제입니다. 프로그래밍 설계 단계에서 데드락을 고려하고 적절한 예방 및 해결 전략을 적용하는 것이 중요합니다.
출처(참고문헌)
연결문서