- 교착 상태 예방의 경우 부수적인 문제로는 장치의 이용률이 저하되고, 시스템 총 처리율이 감소한다.
- 이러한 방식을 보안하고자 나왔고, 자원이 어떻게 요청될지에 대한 추가정보로 교착 상태를 회피하는 방법
- 대표적인 추가정보로는 스레드의 수량으로 교착상태를 회피하는 법이 있다. 아래의 방법들이 이 예이다.
1) 안전 상태
- 어떤 순서로든 스레드들이 요청하는 모든 자원을 교착 상태를 야기하지 않고, 차례로 모두 할당시킬 수 있는 것을 뜻한다.
⇒ 즉 안전 순서를 찾을 수 있다면, 시스템은 안전 상태에 있다 볼 수 있다.
- 만약 이 안전 순서를 찾지 못한다면 불안전하다고 볼 수 있다.
- 안전 상태 : 교착 상태 발생 x , 불안전 상태 : 교착 상태가 발생할 수 도 안 할 수도 있는 상태
2) 자원 할당 그래프 알고리즘
- 예약 간선 : 후에 요청할지도 모르는 것에 점선을 자원 할당 그래프에 표기하는 형태
- 사이클 탐지 알고리즘을 통해 순환 대기가 된는 것을 발견한 다면, 이를 충족할 때까지 반드시 대기
3) 은행원 알고리즘
- 자원 할당 그래프의 알고리즘의 경우 종류마다 여러 개씩 있게 되면 사용할 수 없다. 이를 보안한 것이 은행원 알고리즘이지만 효율은 떨어진다.
- 이 시스템의 경우 스레드가 시작할 때 스레드가 갖고 있어야 할 자원의 최대 개수를 자원 종류마다 미리 신고하여야 한다.
- 자료구조 (n이 스레드의 수, m이 자원의 종류 수)
- Available: 각 종류 별로 사용한 자원의 개수 $Available[j] = k$ 라면 현재 $R_i$를 최대 k개 까지 요청 가능
- Max: 각 스레드가 최대로 필요로 하는 자원의 개수를 나타내는 행렬로 크기가 $n * m$ 이다.
$Max[i][j] = k$ 라면 $T_i$가 $R_j$에게 최대 k개의 자원을 요청할 수 있다.
- Allocation: 각 스레드에 현재 할당된 자원의 개수를 나타내는 행렬로 크기가 $n * m$이다.
$Allocation[i][j]=k$라면 현재 스레드 $T_i$가 $R_j$를 k개 사용 중 임을 알 수 있다.
- Need: 각 스레드가 향후 요청할 수 있는 자원의 개수로 크기는 $n * m$이다.
$Need[i][j] = k$ 라면 $T_i$ 가 $R_j$에게 최대 k개 만큼 요청할 수 있음을 알 수 있다.
- 은행원 알고리즘 적용
- 안전성 알고리즘
- 초기값 설정 Work = Available , Finish[i] = false [i = 0,1,2,3….]
- 만족값 탐색 False[i] = false, Need[i] ≤ Work , 해당하는 i값이 없을 시 4로 이동
- Work = Work + $Allocation_i$. Finish[i] = true
- 모든 Finish[i] = true 라면 안전 상태에 있다는 뜻
- 자원 요청 알고리즘
- Request[i][j] = k는 $T_i$ 가 $R_j$ 에게 k개의 자원을 요청한다는 뜻
Request ≤ Need 라면 2로 이동, 아니면 요청보다 최대가 작으니 오류 발생
- Request ≤ Available 이면 3번으로 이동
- 마치 시스템이 자원을 할당해준 것처럼 아래 적용
Available = Available - Request
Allocation = Allocation + Request
Need = Need - Request