Deadlock#2. 교착상태와 뱅커 알고리즘 (Deadlocks & Banker's Algorithm) : 교착상태 회피 (Deadlock Avoidance)
교착상태 방지(Prevention) 방법의 한계
- 교착 상태가 발생 만족 조건 4가지인 상호배제, 점유와 대기, 선점불가, 원형 대기중 조건을 하나라도 막는다면 교착상태를 막을 수 있다.
- 그러나 조건을 막는다 하더라도 근본적인 문제 해결이 불가능 하거나 비실용적인 경우가 대부분이였다.
- 제일 실용적인 원형 대기 조건을 방지한다 하더라도 교착상태가 일어나지 않는 것을 보장 할 수는 없다.
교착상태 회피(Deadlock Avoidance)
- 교착상태 회피 시스템은 미래의 발생가능한 교착상태를 회피하기 위해서 쓰레드가 대기를 해야하는지 안해야야하는지에 대한 각각의 요청을 결정하는 시스템이다.
- 교착상태 회피 시스템은 회피해야할지 결정하기를 위해서 자원들이 어떻게 요청되었는지에 대한 추가적인 정보를 요구한다.
- ex) R1, R2, 자원이 있다고 가정
- Thread P 가 R1을 요청하고, R2를 요청한다.
- Thread Q는 R2를 요청하고, R1을 요청한다.
- 위 상황으로 원형대기가 발생하여 교착상태가 발생한다.
- 회피 시스템은 위와 같은 상황을 파악하여 거부(Reject) 한다.
교착상태 회피 알고리즘
- 회피 알고리즘은 교착상태로 진입하지 않도록 보장하는 알고리즘을 구성하는 것이 가능하다.
- 각각의 자원 유형의 최대 개수가 필요하다.
- 자원 할당의 상태는 이용가능한 자원의 개수, 할당된 자원의 개수, 쓰레드의 최대 수요 개수를 알고 있어야한다.
안전 상태 (Safe State)
- 안전 상태는 만약 시스템에서 각각의 쓰레드에게 특정한 순서로 자원을 할당하여 교착상태를 회피한 상태를 말한다.
- 시스템에서 안전 상태에 들게 하는 자원 할당의 특정한 순서를 안전 시퀀스 (safe Sequence)라고 한다.
안전상태(Safe State)와 위험상태(Unsafe State)의 관계
- 안전 상태는 교착상태가 될 수 없는 상태를 의미
- 반대로 말하면, 교착상태는 안전상태의 반대인 위험 상태 (unsafe state)에만 존재
- 모든 위험 상태가 교착 상태는 아니지만 어느 특정 위험 상태는 교착상태가 될 수 있다.
안전상태(Safe State)의 개념
- 시스템이 절대로 교착상태로 들어가지 않으려고 하는것을 보장하는 회피 알고리즘을 정의할 수 있다.
- 회피 알고리즘의 핵심은 시스템이 언제나 안전 상태에 있는 것을 보장 하는 것
- 시스템은 초기에 안전 상태에 있음
- 시스템은 어떤 한 쓰레드가 현재 이용가능한 자원을 요청할 때마다 그 자원을 할당해도 될지 안될지 결정
- 시스템은 해당 자원 요청이 안전상태에서 위험 상태로 전환된다면 그 요청을 거부
자원-할당 그래프의 재방문
- 시스템이 각각의 자원 유형에 대해서 오직 하나의 인스턴스만 가진다고 가정할때, 간선의 새로운 타입인 차후-요청 간선(Claim Edge)를 표현할 수 있다.
- 차후-요청 간선은 Ti -> Rj로 표현하며 어떤 한 쓰레드가 차후 미래의 어느 시점에 자원을 요청할 수 있다는 것을 의미
- 시스템은 차후-요청 간선을 자원-할당 그래프에 넣어서 교착상태가 발생하는지 확인한다.
- 차후-요청 간선을 넣었을 때, 원형 대기가 발생하면 교착상태가 발생할 수도 있고, 발생하지 않을 수도 있다.
- 차후-요청 간선을 넣었을 떄, 원형 대기가 발생하지 않는다면 안전 상태로써 자원 요청을 수락한다.
- 위 그림에서 점선 간선이 차후-요청 간선(Claim Edge)이다.
- T1과 T2가 차후에 R2 자원을 사용하고 싶다고 추후에 요청할 예정
- 시스템은 차후-요청 간선을 자원-할당 그래프에 넣고 계산한 결과 T1에 할당 또는 T2에 할당해도 교착상태가 발생하지 않는 안전 상태라고 판단할 수 있다.
- T1이 R2자원을 사용하고 싶어서 추후에 요청할 예정
- 시스템은 추후-요청 간선(T1 ->R2)을 자원-할당 그래프에 넣어 교착상태가 발생하는지 계산함
- 계산 결과 원형 대기가 발생하여 해당 요청을 거부
2. 뱅커 알고리즘 (Banker's Algorithm)
- 각가의 자원 유형의 다수의 인스턴스가 있는 자원 할당 그래프를 적용할 수 없다. 이 문제를 해결하기 위해서 뱅커 알고리즘이 사용된다.
- 뱅커 알고리즘은 각각의 자원 유형의 다수의 인스턴스가 있는 자원 할당 그래프에 적용할 수는 있지만, 효율적이지 않고 더욱 복잡한 알고리즘이다.
- 뱅커알고리즘은 쓰레드의 자원과 관련된 구성과 Resource-Request Algorithm, safety Akgiruthm을 이용하여 특정 쓰레드의 자원 요청을 승인 또는 거절하여 교착상태를 막는 알고리즘
뱅커 알고리즘의 데이터 구성
- 시스템에서 n개의 쓰레드와 m개의 자원 유형이 있다고 가정
- Available: 이용가능한 자원 유형의 개수를 나타내는 벡터
- Max: 각각의 쓰레드가 요구하는 최대 개수를 정의한 매트릭스
- Allocation: 각각의 쓰레드에 현재 할당된 각각의 자원 유형의 개수를 정의하는 매트릭스
- Need: 각각의 쓰레드가 앞으로 요청할 자원을 나타내는 매트릭스
뱅커 알고리즘의 데이터 구성 의미
- Available[m]: 만약 Available[j] == k 이라면 Rj의 k개의 인스턴스가 이용가는하다는 의미
- Max[n x m]: 만약 Max[i][j] == k라면 쓰레드 i가 자원 유형 Rj에 대해서 최대 k개까지 요청할 수 있다는 의미
- Allocation[n x m]: 만약 Allocation[i][j] == k 라면 쓰레드는 i는 자원유형 Rj에 대해서 k개의 인스턴스를 할당 됨을 의미
- Need[n x m]: 만약 Need[i][j] == k라면 쓰레드 i가 자원 유형 Rj에 k개 요청할 것이라는 의미
Safety Algorithm
- Work와 Finish는 m과n의 길이를 가진 배열로 지정. Work = Available로 초기화 하고 Finish 배열의 각각의 모든 요소를 false로 초기화함
- work 배열의 각각의 요소는 이용가능한 자원 유형의 인스턴스 개수를 의미. ex) work = {3,3,2} 이라면 이용가능한 자원 A의 개수 =3, 자원B의 개수 =3, 자원 C의 개수 = 2를 의미
- Finish 배열의 각각의 요소는 각각의 쓰레드가 작업 수행을 맞쳤는지를 의미. True이면 작업을 마친 것이고 False이면 작업을 마치지 않은 것을 의미
- 두 조건을 만족하는 인덱스 i를 탐색한다. 만약 그러한 인덱스 i가 존재하지 않으면 4번 과정으로 이동한다.
- Finish[i] == False
- Need_i <= Work
- 다음 로직을 수행하고 2번 과정으로 되돌아간다.
- Work = Work +Allocation_i
- Finish[i] = True
- 만약 모든 i에 대해서 Finish[i] == true라면 시스템은 안전 상태에 있는 것을 의미
Resource-Request Algorithm
- 만약 Request_i <= Need_i라면 2번 과정으로 이동한다. 그 외에는 에러를 발생시킨다. -> 그 쓰레드는 최대 차후 요청 Claim을 초과했기 때문
- 만약 Request_i <= Available 이라면 3번 과정으로 이동한다. 그외에는 쓰레드 i는 대기해야한다. -> 그 자원들은 이용이 불가능 하기 때문
- 시스템은 쓰레드 i에게 요청한 자원을 할당한다. 할당할때 다음과 같은 과정이 수행된다.
- Available = Available - Request_i : 이용 가능한 자원에서 요청한 자원을 차감
- Allocation_i = Allocation_i + Request_i : 할당된 자원 집합에서 요청한 자원을 추가
- Need_i = Need_i - Request_i : 쓰레드가 요청한 자원중에서 방금 요청한 자원을 차감
알고리즘 예제
- T = {T0, T1, T2, T3, T4}, 다섯개의 쓰레드가 있는 집합 T
- R = {A,B,C}, 3개의 자원 유형이 있는 집합 R
- 각각의 자원 유형의 인스턴스 개수: A = 10, B = 5, C=7
- Allocation: 현재 쓰레드에 할당된 각각의 자원 유형의 인스턴스 개수를 의미
- ex) thread T0은 B자원 인스턴스 1개 가지고 있음
- Max: 해당 thread가 요청할 수도 있는 각각의 자원 휴영의 인스턴스 최대 개수를 의미
- ex) thread T0은 A자원의 인스턴스를 최대 7개, B의 자원의 인스턴스를 최대 5개, C 자원의 인스턴스를 최대 3개가지 요청할 수 있다.
- Available: 현재 이용가능한 각각의 자원 유형의 인스턴스 개수를 의미
- ex) 현재 A자원의 인스턴스 개수는 3개까지 이용 가능하다
- 모든 쓰레드의 할당 Allocation된 A자원의 인스턴스 개수의 합은 7개이다. 집합 R의 A자원의 초기화된 인스턴스 개수는 10이므로 이용가능한(Available) 자원은 3개이다.
Need 배열의 계산식 : Need[i][j] = Max[i][j] - Allocation[i][j]
Safety Algorithm 수행 과정
- work 배열과 Finish 배열을 초기화
- 이용가능한 자원 Available 배열의 요소값을 work배열에 초기화
- Work = {3,3,2}
- 모든 Thread T0~ T4에 대해서 False로 초기화, Finish[0] = Fals의 의미는 thread T0가 아직 작업을 마치지 못햇다는 의미이다.
- Finish = {false, false, false, false, false}
- 아직 작업을 마치지 못하고 필요한 자원이 이용가능한 자원안에서 수행하는 thread를 탐색
- i=0 to n-1까지 반복합니다.
- Finish[i] = false && need[i] <= Work 조건을 만족하는 인덱스 번호 i를 탐색
- 만약 조건을 만족하는 인덱스 번호 i가 존재하지 않으면 4번 과정으로 이동한다
- 2번 과정의 조건에 만족하는 thread를 탐색하였다면 필요한 자원으로 작업을 수행하고 다음 과정을 수행
- Work = Work + Allocation[i]: 이용가능한 자원에 thread Ti에 할당된 자원을 추가함
- Finish[i] = true: thread Ti가 작업을 마쳤다는 것을 의미
- 2번 과정으로 이동
- 모든 thread가 작업을 마쳤는지 확인
- 만약 Finish 배열의 모든 요소가 true이면 시스템은 안전한 상태 (safe state)이다.
- 아니라면 2번 과정으로 이동
정리
- 교착상태를 해결하는 방지, 회피, 탐색 후 회복의 방법중 회피하는 방법에 대해 알아봄
- 교착상태를 회피하는 대표적인 알고리즘이 뱅커 알고리즘이다
- 뱅커 알고리즘은 자원과 관련된 데이터 구성과 Resource-Request Algorithm, Safety Algorithm을 ㅇ용하여 어떤 쓰레드의 특정 자원요청이 safe Sequence를 만들어 낼 수 있는지 계산
- Saft Sequence를 만들어 내지 못한다면 Reject거부 하고 아니라면 승인
반응형
'Etc' 카테고리의 다른 글
[운영체제]chapter 09. Main Memory_#01 주 메모리의 관리 (1) | 2024.06.13 |
---|---|
[운영체제]chapter 08. Deadlock_#03 교착상태 탐색 후 회복 (1) | 2024.06.13 |
[운영체제]chapter 10. Vurtual Memory_#02 (0) | 2024.06.12 |
[운영체제]chapter 10. Vurtual Memory_#01 (0) | 2024.06.11 |
[운영체제]chapter 08. Deadlock_#01 교착상태의 이해 (1) | 2024.06.10 |