두 개 이상의 프로세스나 스레드가 자원을 얻지 못하고 무한 대기 상태로 있는 경우를 의미하며, 시스템적으로 한정된 자원을 여러 곳에서 사용하려고 할 때 발생한다.
아래 4가지 조건이 모두 성립해야 데드락이 발생한다.
상호 배제
점유 대기
비선점
순환 대기
크게 3가지로 분류할 수 있다.
데드락의 발생조건 4가지 중 하나라도 발생하지 않게 하는 것이 데드락을 예방하는 방법이다. 즉, 각각의 조건을 방지(부정)하여 데드락 발생 가능성을 차단한다.
상호 배제 조건 방지
점유 대기 조건 방지
비선점 조건 방지
순환 대기 조건 방지 : 자원에 고유 번호 할당 후 순서대로 자원 요구할 수 있도록 한다.
단점 : 자원 사용의 효율성이 떨어지고 비용이 많이 든다.
시스템의 프로세스들이 요청하는 모든 자원을, 데드락을 발생시키지 않으면서도 차례로 모두에게 할당해 줄 수 있다면 안정 상태(safe state)에 있다고 말한다.
특정한 순서로 프로세스들에게 자원을 할당, 실행 및 종료 등의 작업을 할 때 데드락이 발생하지 않는 순서를 찾을 수 있다면, 그것을 안전 순서(safe sequence)라고 부릅니다.
회피 알고리즘은 자원을 할당한 후에도 시스템이 항상 Safe state에 있을 수 있도록 할당을 허용하는 것이다.
회피 알고리즘으로는 자원 할당 그래프 알고리즘과 은행원 알고리즘이 존재한다.
어떤 자원의 할당을 허용하는지에 관한 여부를 결정하기 전에, 미리 결정된 모든 자원들의 최대 가능한 할당량을 가지고 시뮬레이션 해서 Safe state에 들 수 있는지 여부를 검사합니다. 즉 대기중이 다른 프로세스들의 활동에 대한 교착 상태 가능성을 미리 조사하는 것입니다.
예시) 시스템이 총 12개의 자원을 가지고 있다고 가정했을 때
| 현재 t0 | 프로세스의 최대 자원 요청량 | 프로세스에 할당 중인 자원 수 | 필요한 자원 수 |
|---|---|---|---|
| P0 | 10 | 5 | 5 |
| P1 | 4 | 2 | 2 |
| P2 | 9 | 2 | 7 |
t0 일때 총 할당된 자원의 합은 5 + 2 + 2 = 9개로
시스템 자원 12개에서 할당 가능한 자원은 3개가 남았다.
여기서 순서가 p1 -> p0 -> p2 일 때 안전 순서를 만족한다.
이렇게 자원의 부족함 없이 올바르게 할당하여 모든 프로세스가 실행 할 수 있었다.
만약 t0일 때 p2가 2개가 아닌 3개를 할당받았다면?
따라서 운영체제가 사전에 p2가 자원을 3개를 요청했을 때 할당해 주지않고 대기하거나 2개만 할당했다면 데드락이 발생하지 않았을 것이다. 은행원 알고리즘을 사용해 자원 할당량을 사전에 파악하고 데드락을 회피할 수 있도록 하면 된다.
단점 : 미리 최대 자원 요구량을 알아야 하고, 할당할 수 있는 자원 수가 일정해야 하는 등 사용에 있어 제약조건이 많고, 자원 이용도가 떨어진다.