교착상태가 없는 프로그램을 설계하는 것은 프로그래머의 책임이다.
System model
프로세스의 자원 사용 순서: 요청(후 대기), 사용, 방출
다중 응용 스레드에서 교착상태
Live lock: 라이브니스 장애, 스레드가 실패한 행동을 계속 시도할 때 발생. 실패한 작업을 동시에 재시도. 실패한 행동을 재시도하는 시간을 무작위로 정해 회피
길에서 앞에 사람이왔을 때 왼 오왼오 왼오 왼오
Necessary conditions
1. Mutual exclusion
2. Hold and wait
3. No preemption
4. Circular wait
Resource allocation graph
T -> R (request edge)
R -> T (assignment edge)
사이클이 포함되면 교착상태가 존재할 수 있다.
4가지 필요조건 중 하나가 성립되지 않도록 보장함으로써 예방
Mutual exclusion
Hold and wait
No preemption
Circular Wait
자원이 어떻게 요청될지에 대한 추가 정보를 제공하도록 요구
각 요청에 대해 교착 상태를 회피하고자 스레드가 대기해야 하는지 여부를 알 수 있다.
Safe state
Resource-Allocation graph algorithm
예약간선(claim edge) 도입 T-> R 미래에 T가 R을 요청할 것이라는 뜻.
Banker’s algorithm
스레드가 시작될 때 스레드가 가지고 있어야할 최대의 자원 개수를 종류마다 신고해야한다. 이 숫자가 최대 자원수를 넘어서면 안 된다. 스레드가 자원을 요청하면 시스템은 그것을 들어줬을 때 안전상태에 머무는지 판단해야 한다. 안전하다면 요청을 들어주고 아니면 스레드는 대기한다.
N: 스레드의 수 M: 자원의 종류 수
Available: 각 종류별로 가용한 자원의 개수를 나타내는 벡터, 크기 M
MAX: 각 스레드가 최대로 필요로 하는 자원의 개수 . 크기 N*M
Allocation: 각 스레드에게 현재 할당된 자원의 개수 크기 N*M
Need: 각 스레드가 향 후 요청할 수 있는 자원의 크기를 나타내는 행렬, 크기N*M
Safety algorithm: 시스템이 안전한지 알아낼 수 있는 알고리즘은 아래와 같다.
1. Work와 Finish는 크기가 m과 n인 벡터
2. Finish[i]==false, Need[i]<=Work를 만족하는 i를 찾는다. 찾을 수 없다면 4로 간다.
3. Work=Work+Allocation, Finish[i]=true
4. 모든I 값에 대해 Finish[i]==true이면 아전상태
이 알고리즘으로 안전 여부를 알아내는 대에는 개의 연산이 필요하다.
Resource-Request Algorithm: 자원 요청을 안전하게 들어줄 수 있는지 검사하는 알고리즘
Request[i][j]==k, T[i]가 R[j]를 k개 까지 요청 하고 있다./ T[i]가 자원을 요청하면 아래와 같이 조치
1. Request[i]<=Need[i]이면 2번. 아니면 시스템에 있는 개수보다 많은 수를 요청했음으로 오류
2. Request[i]<=Available[i] 이면 3번. 아니면 요청한 자원이 당장 없으므로 T[i]는 대기
3. 시스템이 T[i]에게 자원을 할당해준 것처럼 시스템 상태 정보를 아래처럼 바꿔 본다.
4. Available=Available-Request[i]
Allocation[i]+=Request[i]
Need[i]=Need[i]-Requesst[i]
만약 이렇게 바뀐 상태가 안전하면 T[i]에 여기에 반영된 정보대로 자원을 준다.
불안전하면 자원할당 상태를 원상태로 복원하고 T[i]는 Request[I]가 만족되기를 기다려야 한다.
Single instance of each resource: wait for graph 사용.
T1-> R1, R1 ->T2 , T1 -> T2
주기적으로 사이클 탐지 알고리즘 호출 n은 정점의 수
Several Instance of a resource Type: Available, Allocation, Request 사용
Detection- algorithm usage: 위의 알고리즘들은 언제 사용할까?
1. 교착 상태가 얼마나 자주 일어나는지
2. 교착 상태가 일어날 때 몇 개의 스레드가 연루되어 있는지.
CPU 이용률 40% 이하 && 한 시간에 한번
Recovery from Dead Lock: 스레드를 중지하거나 자원을 선점하거나
Process and Thread Termination: 교착상태 프로세스 모두중지, 하나씩 중지
Resource preemption: selection of a victim, roll back, starvation