이번 글에서는 데드락이 무엇인지 그리고 그 데드락을 예방 및 회피하는 방법에 대해서 공부한다.
데드락이란?
여러 프로세스들이 실행되면서 서로가 서로를 끝날 때까지 기다리면서 결국 모두 실행되지 못하는 상황을 말한다.
[데드락이 걸리는 조건]
데드락을 방지하기 위해 먼저 데드락이 걸리는 조건을 알아보자.
1 ) Mutual exclusion : 자원을 상호배타적으로 사용한다.
→ 최소한 하나의 자원이 비공유 모드로 점유되어야 함. (비공유 모드에서는 한 번에 한 스레드만이 그 자원을 사용할 수 있음.)
2 ) Hold and wait : 자원을 가지고 있으면서 다른 자원을 기다리는 프로세스로 구성됨.
3 ) No preemption : 강제로 자원을 뺏는 선점을 하지 않는다.
4 ) Circulalr wait : p1 → p2 → p3 → p4 (다른 프로세스의 자원을 기다리는 형태로 순환 되는 경우)
이런 데드락이 걸리는 조건을 하나만 부정해도 데드락을 예방할 수 있다.
데드락을 방지하기 위해서는 데드락이 걸리는 조건 중 하나만 부정하면 된다.
1 ) Mutual exclusion : 이 경우 자원을 쉐어해야하는 경우가 있기 때문에 부정할 수 없다.
2 ) Hold and Wait : 미리 자원을 할당 후 프로세스를 실행하는 식으로 부정할 수 있다.
→ 안쓰고 있는 자원도 할당이 되어 있는 상태이기 때문에 자원의 활용도가 떨어지는 단점이 있다.
3 ) No Preemption : p1이 r1을 가지고 r2를 기다리고 있다면 r1을 다른 프로세스가 가져갈 수 있게 해줌. r2가 오면 r1을 기다렸다가 r1,r2를 가질 때 실행함
→ 자원을 뺏김으로써 똑같은 작업을 반복해야함.
→ 기아 문제 발생 할 수 있음.
4 ) Circular Wait : 자원에다 번호를 할당해서 오름차순 또는 내림차순으로 사용할 수 있도록 한다.
clear