(ex) 은행은 100원 갖고 있음. A,B,C는 각각 40,50,60원이 필요함. 빌리려는 돈이 충족되어야 일을 할 수 있고, 돈을 갚을 수 있는 상황.
-> 일단 25원씩 주기로함. 그러면 A,B,C는 각각 15,25,35원이 더 필요. 은행이 남은 돈은 25원
sol)
1. 15원이 필요한 A에게 15원을 빌려줌 -> A가 일을 해결, 갚을 때까지 기다렸다가 다른 고객에게 돈을 빌려주면 됨.
2. 25원이 필요한 B에게 25원을 빌려줌 -> B가 일을 해결, 갚을 때까지 기다리고 다른 고객에게 빌려줌
but) C에게는 35원이 필요하기 때문에 돈을 빌려줄 수 없음.
-> 돈을 빌려줄 수 있고, 다시 돌려받을 수 있는 상태 : safe state
if) 60원이 필요한 고객3이 45원을 요구. -> 세 고객 중 아무도 해결해 줄 수 없는 상황 (unsafe state/ deadlock)
Available[j]=k: j번째 자원을 k개 사용할 수 있다는 의미.
Max[i,j]=k : 프로세스 Pi는 자원 Rj를 최대 k개까지 요청 가능
Allocation[i,j]=k: 프로세스 Pi는 자원 Rj를 k개 할당 받고 있음.
Need[i,j]=k: 프로세스 Pi는 자신의 작업을 종료하려고 Rj를 k개 더 필요로 함.
Work, Finish 초기화.
Work의 초기값은 Available 값과 같고, Finish의 길이는 process의 수, false로 초기화.
Work=(3,3,2)
Finish=(False,False,False,False)
각 프로세스 별로 자원이 할당 가능한지 체크한다.
만족 조건은 Finish[i]=False & Need[i]<=Work 이어야 함.
(1) P1 : (7,4,3) <=(3,3,2) : 부등호가 성립하지 않음. P1에는 자원 할당 X
(2) P2: (1,1,2)<=(3,3,2) : 부등호가 성립. P2에 할당 가능. 근데 P4도 가능 (여러가지 순서로 safe state가 성립 가능)
(3) Work=Work+Allocation[i]=(3,3,2)+(2,0,0)= (5,3,2)/ Finishi[i]=True 로 수정.
이제 다시 P1 부터 확인..
-> P2-P4-P1-P3 순서로 safe state 조건이 성립한다.
https://hackernoon.com/synchronization-primitives-in-python-564f89fee732
참조
https://hoyeonkim795.github.io/posts/bankers/
https://velog.io/@seorim0801/%EC%9D%80%ED%96%89%EC%9B%90-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98