✨ 데드락이란? → 일련의 프로세스들이 서로가 가진 자원을 기다리며 block 되어 더 이상 진행이 될 수 없는 상태
✨ Resource (자원)
✨ Deadlock Example 1
✨ Deadlock Example 2
P₀ P₁
P(A); P(B);
P(B); P(A);
✨ Mutual exclusion(상호 배제)
✨ No preemption(비선점)
✨ Hold and wait(보유 대기)
✨ Circular wait(순환 대기)
P₀은 P₁이 가진 자원을 기다림
P₁은 P₂가 가진 자원을 기다림
Pₙ₋₁은 Pₙ 이 가진 자원을 기다림
Pₙ은 P₀ 이 가진 자원을 기다림
💡 4가지 조건을 모두 만족해야 데드락이 생긴다
프로세스 간의 관계를 그래프로 도식화해 보면 데드락이 발생할지 예상할 수 있다. 이 그래프를 Resource-Allocation Graph(자원 할당 그래프)라고 한다. 예시를 하나 살펴보자.
R = 리소스 P는 프로세스 R 내의 동그라미는 인스턴스의 개수
💡 그림 1,2 는 데드락일까 아닐까?
Answer
→ 그림1은 R2의 인스턴스 두개가 전부 사이클을 형성되서 데드락이 걸린다.
→ 그림2는 P1과 P3가 사이클을 이루었지만 R2와 R1에서 다른 각각의 인스턴스가 할당된 P4, P2의 작업이 끝이나면 사이클이 풀리기 때문에 데드락이 이니다.
💡 위의 두가지 방법은 데드락을 방지 한다. 밑의 두가지 방법은 데드락을 나둠
✨ Deadlock Prevention (데드락 방지)
✨ Deadlock Avoidance (데드락 회피)
✨ Deadlock Detection and recovery (데드락 감지 및 복구)
✨ Deadlock Ignorance (데드락 무시)
1. Mutual Exclusion
→ Critical Section Problem을 해결하기 위해서는 이 조건은 반드시 만족해야 하므로 공유자원이 존재한다면 이 조건을 방지할 수 없다.
→ 공유해서는 안되는 자원의 경우 반드시 성립해야 함.
2. Hold and Wait
→ 프로세스가 자원을 요청할 때 다른 어떤 자원도 가지고 있지 않도록 해야 한다.
방법 1. 따라서 프로세스를 시작할 때 모든 필요한 자원을 할당받게 하거나,
방법 2. 자원이 필요한 경우 보유하고 있던 자원을 모두 반납하고 다시 요청하는 방식을 이용할 수 있다.
3. No preemption
→ process가 어떤 자원을 기다려야 하는 경우 보유하고 있던 자원이 선점된다.
→ 모든 필요한 자원을 얻을 수 있을 때 그 프로세스는 다시 시작된다.
→ State를 쉽게 save하고 restore할 수 있는 자원에서 주로 사용(CPU, memory)
4. Circular wait
→ 모든 자원 유형에 할당 순서를 정하여 정해진 순서대로만 자원을 할당한다.
🏴 하지만 이 방법은 Utilization(효율성) 저하, throughput(처리량) 감소, starvation문제를 가짐.
✨ 정의
자원 요청에 대한 부가정보를 이용해서 자원 할당이 deadlock으로부터 안전(safe)한지를 동적으로 조사해서 안전한 경우에만 할당. 즉 Deadlock이 발생할 가능성이 있는 경우엔 자원을 할당하지 않는 방식
가장 단순하고 일반적인 모델은 프로세스들이 필요로 하는 각 자원별 최대 사용량을 미리 선언하도록 하는 방법임
📌 safe state
- 시스템 내의 프로세스들에 대한 safe sequence가 존재하는 상태
📌 safe sequence
- 프로세스의 sequence<P₁, P₂.....Pₙ>이 safe하려면 Pᵢ(1<=i<=n)의 자원 요청이
"가용 자원 + 모든 Pj( j < i )의 보유 자원" 에 의해 충족되는 경우 sequence를 safe하다고 말한다.- 현재가 안전하다
✨ 시스템이 safe state에 있으면 → no deadlock
✨ 시스템이 unsafe state에 있으면 → possibility of deadlock
✨ Deadlock Avoidance
✨ 2가지 경우의 avoidance 알고리즘
Claim edge Pᵢ → Rj
✓ 프로세스 Pᵢ 가 자원 Rj 를 미래에 요청할 수 있음을 뜻함 (점선으로 표시)
✓ 프로세스가 해당 자원 요청시 request edge로 바뀜 (실선)
✓ 프로세스가 해당 자원을 받으면 assignment edge(실선)로 바귐
✓ Rj가 release되면 assignment edge는 다시 claim edge로 바뀐다.
assignment edge : 프로세스가 자원을 다시 돌려주는 방향
request edge : 프로세스가 자원을 요청하는 방향
Claim edge : 미래에 이 프로세스가 자원을 요청할 수 있음
request edge의 assignment edge 변경시 (점선을 포함하여) cycle이 생기지 않는 경우에만 요청 자원을 할당한다.
Cycle 생성 여부 조사시 프로세스의 수가 n일 때 O(n²) 시간이 걸린다
그림의 상황은 unsafe한 상황이다.
✨ Deadlock Detection
Deadlock이 발생했는지는 Deadlock을 미리 회피하는 방법과 유사하게 확인할 수 있다.
Resource type 당 single instance인 경우
✓ 자원할당 그래프에서의 cycle이 곧 deadlock을 의미
✓ 그래프를 통해서 사이클이 생겼는지를 확인
Resource type 당 multiple instance인 경우
✓ Banker's algorithm 과 유사한 방법 활용
✓ 총 요청 자원의 수가 남은 자원의 수보다 적은 프로세스가 존재하지 않는다는 것을 이용
✨ 데드락 Recovery 방법
1. Process termination(프로세스 종료)
Abort all deadlocked processes (프로세스를 한번에 다 죽이는 방법)
Aobrt one process at a time until the deadlock cycle is eliminated (데드락이 해결될 때 까지 프로세스를 하나씩 죽이는 방법)
Deadlock을 해결하기 위해 어떤 프로세스를 종료시켜야 할까?
여기에는 몇 가지 판단 기준이 있다.
1. 프로세스의 중요도
2. 프로세스가 얼마나 오래 실행됐는가
3. 얼마나 많은 자원을 사용했는가
4. 프로세스가 작업을 마치기 위해 얼마나 많은 자원이 필요한가
5. 프로세스가 종료되기 위해 얼마나 많은 자원이 필요한가
6. 프로세스가 batch인가 interactive인가
2. Resource Preemption(자원을 빼앗는 방법)
✨ Wait-for graph 알고리즘
Resource type single instance인 경우
Wait-for graph
✓ 자원할당 그래프의 변형
✓ 프로세스만으로 node 구성
✓ Pᵢ가 가지고 있는 자원을 Pₓ가 기다리는 경우 Pₓ→ Pᵢ
Algorithm
✓ Wait-for graph에 사이클이 존재하는지를 주기적으로 조사
✓ O(n²)
✨ Deadlock이 일어나지 않는다고 생각하고 아무런 조치도 취하지 않음
📌 데드락은 굉장히 고전적인 문제이다. 현재는 점점 중요도가 줄어 드는 문제. 따라서 현대의 범용체제는 대부분 Deadlock을 Ignorance하고 있다.