- Deadlock
일련의 프로세스들이 서로가 가진 자원을 기다리며 block되어 더이상 진행이 될 수 없는 상태.
(한 스레드 집합 내의 모든 스레드가 그 집합 내의 다른 스레드에 의해서만 발생될 수 있는 이벤트를 기다리는 상황)
DeadLock이 발생하기 위한 4가지 조건
Resource Allocation Graph(자원 할당 그래프)
R:자원
P:프로세스
· : 자원(인스턴스)의 개수
자원-> 프로세스 간선은 해당 자원을 프로세스가 보유(Allocate)
프로세스-> 자원 간선은 프로세스가 해당 자원을 요청(Request)
그래프에 cycle이 없다면 deadlock이 아니고, 사이클이 있다면 deadlock이 발생할 필요조건이다.
자원 당 하나의 인스턴스만 있는 경우에는 deadlock이지만 여러 인스턴스가 존재하는 경우에는 deadlock일 수도 있고 아닐수도 있음.
: Circular Wait 조건을 발견하기 위한 목적으로 사용한다.
교착상태를 발생하게 하는 4가지 조건 중 적어도 하나가 일어나지 않게 보장함으로써 교착상태를 예방.
상호배제(Mutual Exclusion)
Critical Section Problem을 해결하기 위해서는 이 조건은 반드시 만족해야 하므로 공유자원이 존재한다면 이 조건은 만족시킬 수밖에 없다.
보유대기(Hold and Wait)
프로세스가 자원을 요청할 때 다른 어떤 자원도 가지고 있지 않도록 하여 보유대기조건을 제거한다.
방1)프로세스를 시작할 때 모든 필요한 자원을 할당받게 함 : 동적 요청이 아니므로 실용적이지 않음.
방2)자원이 필요한 경우 보유하고 있던 자원을 모두 반납하고 다시 요청하는 방식(자원을 가지고있지 않을 때만 요청 가능) : Low 자원 utilization, starvation 발생 가능성 존재
비선점(No Preemptive)
선점이 가능하도록 하여 비선점조건을 제거한다.
자원 점유중인 스레드(프로세스)가 할당 불가한 자원을 요청하면 현재 점유하고 있는 모든 자원이 선점된다(다른 프로세스,스레드가 사용 요청시 넘겨줌). 스레드,프로세스가 요청중인 새로운 자원을 할당받고, 대기 중 선점되었던 모든 자원을 회복할 때만 다시 시작 가능하다.
순환대기(Circular Wait)
할당 순서를 정하여 정해진 순서대로만 자원을 할당해 순환대기 조건을 제거한다.
모든 자원 유형에 전체적인 순서를 부여해 각 프로세스가 열거된 순서대로 오름차순으로 자원을 요청하도록 요구.
Deadlock이 발생할 가능성이 있는 경우엔 아예 자원을 할당하지 않는 방식. 데드락 발생 가능성 없는 경우만 자원 할당
회피 알고리즘은 자원 할당 후에도 시스템이 항상 safe state에 있을 수 있도록 할당을 허용함.
t=t0 | max | allocation | need | available |
---|---|---|---|---|
P0 | 10 | 5 | 5 | |
P1 | 4 | 2 | 2 | |
P2 | 9 | 2 | 7 |
max:각 프로세스별 최대 자원 요청량
allocation : 현재 프로세스에 할당중인 자원 양
need : 남은 필요한 자원의 양(max-allocation)
처음 시스템이 총 12개의 자원을 가지고 있음 가정.
처음 프로세스에 할당된 자원의 합은 5+2+2로 0개이고 availble은 12-9로 3개이다.
safe sequnce를 찾아보면 P1,P0,P2가 safe sequence에 해당한다.
1. P1에 2개를 할당함으로써 P1이 가지고있던 자원 반환-> available 5
2. P0에 5개를 할당함으로써 P0가 가지고있던 자원 반환-> availble 10
3. P2에게 7개 할당함으로써 P2 max 만족.
-> 모든 프로세스 실행 가능.
정리하자면
현재 가용자원과 각 프로세스들이 작업 완료하기위한 필요 자원 비교해 당장 작업 마칠 수 있는 프로레스부터 자원을 할당, 그 프로세스가 작업을 완료하고 반환하는 자원으로 다시 할당->반환 -> 할당하며 가용자원을 늘려가는 것.
이 때 최대한 자원을 뱉어내도록 할당 해줬는데 최종적으로 availble이 부족하다면 unsafe한 것이다. (allocation들 중 하나를 선택해서 뱉어내게하던 방법들이 필요.)
Allocation, Request, Available 등 시스템에 데드락이 발생했는지 여부를 탐색. bankers algorithm과 유사하게 현재 시스템 자원 할당 상태로 파악. (multiple instance)
자원 할당 그래프를 탐지하는 방법도 존재.(single instance)
detection된 deadlock을 circular wait을 해결해 deadlock으로부터 recovery하는 방법 사용.
데드락은 드물게 발생하므로 데드락에 대한 조치 자체가 overhead가 될 수 있고,
데드락이 발생하는 경우 프로그래머가 직접 process를 죽이는 방법으로 대처. 리눅스, windows등 대부분 OS가 채택하고있다.