[OS] deadlock 조건과 예방법
데드락
- 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태이다.
- 프로세스가 자원을 얻지 못해 다음 처리를 하지 못하는 상태로, ‘교착 상태’라고도 하며 시스템적으로 한정된 자원을 여러 곳에서 사용하려고 할 때 발생한다.
데드락이 발생하는 경우 예시
- Process1과 Process2가 리소스 A, B 둘 다를 얻어야 실행 가능하다고 가정할 때,
- 첫 번째 타임에 Process1이 리소스 A를 사용하고 Lock을 걸고 Process2가 리소스 B를 사용하며 Lock을 건 경우
- 두 번째 타임에 Process1은 Lock 상태인 리소스 B를, Process2는 Lock 상태인 리소스 A를 기다리게 된다.
- 하지만 서로 원하는 리소스가 상대방에게 할당되어 있기 때문에 이 두 프로세스는 무한정 기다리게 되는데 이러한 상태를 DeadLock상태라고 한다.
데드락 조건
1. 상호배제(Mutual exclusion)
- 자원을 한 번에 한 프로세스만이 사용하는 경우.
2. 점유대기(Hold and wait)
- 최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 있는 경우.
3. 비선점(No preemption)
- 다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없는 경우.
4. 순환대기(Circular wait)
- 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있는 경우.
- ex) 프로세스의 집합 {P0, P1, ,…Pn}에서 P0는 P1이 점유한 자원을 대기하고 P1은 P2가 점유한 자원을 대기하고 P2…Pn-1은 Pn이 점유한 자원을 대기하며 Pn은 P0가 점유한 자원을 요구해야 한다.
데드락 해결(예방) 방법
1. 상호배제 조건의 제거
- 데드락은 두개 이상의 프로세스가 공유 불가능한 자원을 사용하여 발생하는 것이므로 공유 불가능한 상태를 제거하면 교착상태를 해결할 수 있다.
2. 점유와 대기 조건의 제거
- 프로세스가 실행되기 전 필요한 모든 자원을 할당한다. 한 프로세스에 수행되기 전에 모든 자원을 할당시키고 나서 점유하지 않을 때에는 다른 프로세스가 자원을 요구하도록 하는 방법.
단, 자원 과다 사용으로 인한 효율성. 프로세스가 요구하는 자원을 파악하는 데에 대한 비용, 자원에 대한 내용을 저장 및 복원하기 위한 비용,
기아상태, 무한 대기 등의 문제점이 있다.
3. 비선점 조건의 제거
- 자원을 점유하고 있는 프로세스가 다른 자원을 요구할 때 점유하고 있는 자원을 반납하고, 요구한 자원을 사용하기 위해 기다리게 한다.
4. 순환대기 조건의 제거
- 자원에 고유한 번호를 할당하고, 번호 순서대로 자원을 요구하도록 한다.
데드락 상태에서 복구
- 교착 상태를 일으킨 프로세스를 종료하거나, 할당된 자원을 해제함으로써 회복하는 것을 의미한다.
- 프로세스를 종료하는 방법
- 데드락 상태의 프로세스를 모두 중지
- 데드락 상태가 제거될 때까지 한 프로세스씩 중지
출처: sunghyunjo TIL
출처: jwprogramming 블로그
출처: 유토피아 블로그
Comments