Deadlock이란
교착 상태는 두 개 이상의 스레드들이 서로 점유한 자원을 해제할 때까지 무한정 기다리는 상태를 의미한다. (실행하지 않음)
B) 교착상태 발생 조건
교착 상태는 한 시스템 내에서 다음의 네 가지 조건이 동시에 성립 할 때 발생한다. 따라서, 아래의 네 가지 조건 중 하나라도 성립하지 않도록 만든다면 교착 상태를 해결할 수 있다.
-
상호배제 (Mutual Exclusion)
- 자원은 한 번에 한 프로세스만이 사용할 수 있어야 한다.
-
점유 및 대기 (Hold And Wait)
- 최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 있어야 한다.
-
비선점 (No preemption)
- 해당 작업이 완료되기 전까지는 자원이 반환되지 않는 것.
- 다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없어야 한다.
-
환형대기 (Circular Wait)
- 연쇄적 (꼬리에 꼬리를 무는, 뫼비우스) 으로 자원을 기다리는 형태.
- 프로세스의 집합 에서 는 이 점유한 자원을 대기하고 은 가 점유한 자원을 대기하고 … 은 이 점유한 자원을 대기하며 은 가 점유한 자원을 요구해야 한다.
C) Deadlock 대비 방법
교착 상태가 일어나기 전에 미리 대비하는 방법
C.1) 예방 (Prevention)
교착 상태 발생 조건 중 하나를 제거함으로써 해결한다. 발생하지 않은 상태를 대비하므로, 자원의 낭비가 심하다.
- 상호 배제 (Mutual exclusion) 부정
- 여러 개의 프로세스가 공유 자원을 사용할 수 있도록 한다.
- 점유 대기 (Hold and wait) 부정
- 프로세스가 실행되기 전 필요한 모든 자원을 할당한다.
- 비선점 (No preemption) 부정
- 자원을 점유하고 있는 프로세스가 다른 자원을 요구할 때 점유하고 있는 자원을 반납하고, 요구한 자원을 사용하기 위해 기다리게 한다.
- 순환 대기 (Circular wait) 부정
- 자원에 고유한 번호를 할당하고, 번호 순서대로 자원을 요구하도록 한다.
C.2) 회피 (Avoidance)
교착 상태가 발생하면 피해가는 방법이다.
- 은행원 알고리즘 (Banker’s Algorithm): 다익스트라가 제안한 방법
- 교착 상태에 빠질 수 없는 안정 상태를 유지할 수 있는 요구만을 수락하고, 불안전 상태를 초래할 사용자의 요구는 나중에 만족될 수 있을 때까지 계속 거절
- 안정 상태에 있으면 자원을 할당하고, 그렇지 않으면 다른 프로세스들이 자원을 해지할 때까지 대기함
- 사용자 수 그리고 할당할 수 있는 자원의 수가 일정해야함
- 항상 불안전 상태를 방지해야 하므로 자원 이용도가 낮음
D) Deadlock 처리 방법
교착 상태가 일어난 후 처리하는 방법
D.1) 탐지 (Detection)
- 자원 할당 그래프를 통해 교착 상태를 탐지
- 교착 상태가 탐지되면 회복 기법을 사용
D.2) 회복 (Recovery)
- 프로세스 종료: 교착 상태에 있는 프로세스를 종료시킴
- 교착 상태의 프로세스를 모두 중지
- 교착 상태가 해결될 때까지 하나씩 프로세스를 중지
- 자원 선점: 교착 상태에 있는 프로세스로부터 자원을 빼앗아 다른 프로세스에게 할당