modeling
:
있는 그대로를 다 고려하여 일을 진행할 수 없다. 주변을 깨끗하게 정리하고 일을 체계적으로 만든다.
System Modeling
:
현대의 모든 OS에 deadlock이 있다.
안 생기게 할 수도 있다. 그런데 왜 생길까?
➡️ 우선 deadlock이 해결되기 위해서 deadlock을 정의해야 하고,
정의하기 위해서 System을 Modeling해야 한다.
Mutual Exclusion
Hold and Wait
:No preemption
:Circular Wait
:Vertex
: Vertex에 올 수 있는 것은 Process or Resource
Edge(Directed Edge)
Example 1
1, 2, 3 조건이 만족하지만 4 조건이 만족하지 않아 Deadlock 상태에 빠지지 않는다.
Example 1
이 Cicurlar Wait을 만족하도록 만들면?1, 2, 3, 4를 모두 만족하기 때문에 Deadlock 상태가 발생할 가능성이 있다.
위 예제에서는
를 가 requset하는 순간,
는 더 이상 받을 수 없어 는 기다림,
는 에 allocation된 를 기다림,
은 allocation된 을 기다림.
➡️ Deadlock 상태에 빠짐
Example 2
의 두번째 instance를 Circular와 상관없는 가 allocation하고 있다.
의 첫번째 instance를 Circular와 상관없는 가 allocation하고 있다.
위 그래프에서는 다음과 같은 cycle을 갖는다.
➡️ ➡️ ➡️ ➡️
당장은 Deadlock 상태가 가능할 것처럼 보이지만,
가 release하면 Deadlock 상황이 안 생기기 때문에
위 그래프는 Deadlock 상황이 생기지 않는 그래프이다.
만약 의 instacne가 1개였거나 의 instance가 1개였다면 Deadlock이 생겼을 것이다.
Deadlock을 Prevention하기 위해
4가지 중 하나만 발생하지 않게 하여 Deadlock이 발생하지 않도록 할 수 있다.
Mutual Exclusion
: 한 개의 Resource를 한 개의 Process만 가지도록 한다.
➡️ 비공유 resource를 전제로 한다.
➡️ 비현실적
➡️ 안 발생하게 할 수 없다.
Hold and Wait
: Process가 Resource를 request할 때마다 다른 Resource들을 점유하지 않도록 보장해야 한다.
➡️ 한 두개의 process 때문에 나머지 모든 Process가 starvation 상태.
➡️ 비효율적
➡️ 안 발생하게 할 수 없다.
No Preemption
: Resource를 사용하고 Process가 있는데,
똑같이 그 Resource를 필요로 하는 Process가 있으면 뺐어옴.
➡️ 질서가 없어짐. 비효율, 비현실적
➡️ 안 발생하게 할 수 없다.
Ciruclar Wait
: 순환대기가 발생하지 않도록 하는 것.
➡️ 가장 현실적인 방법
➡️ 하지만 OS가 모든 Process간의 관계를 계속 살펴봐야 하고, 모든 Resource를 파악해야 한다.
➡️ OS의 Resource 낭비가 매우 심하다.
1, 2, 3, 4 모두 문제가 발생하지 않도록 하여 Deadlock을 안생기게 할 수는 있지만,
Deadlock 하나 안생기게 하기 위해서 전체 system이 엉망이 된다.
그래서 Deadlock이 안생기게 할 수는 있지만 현실적으로는 Prevention을 하지 않는다.
그렇다면 Deadlock을 완전히 막는 Prevention보다
Resource를 덜 사용하더라도 Deadlock이 발생할 것 같은 순간에만 회피시키도록 Avoidance하는 것은 어떨까?
unsafe
: Deadlock이 언제든지 생길 수 있는 상태safe
: Deadlock이 절대 안 생기는 상태.safe state
로 만들어보자.safe state
: 모든 Process에 safe sequence
가 존재하면 시스템은 safe state에 있다고 한다.Safe Sequence
라고 한다.Safe Sequence
가 존재하면, 그 system은 Safe State
에 있다고 한다.새로운 process가 system에 들어가면, 필요로하는 resource의 형태들의 최대수를 선언해야 한다.
safe sequence 유지
process가 resource를 요구할 때,
system은 resource를 할당한 다음에도 safe state로 남아 있는지를 결정해야 한다.
safe state로 남아 있으면 할당하고,
그렇지 않으면 다른 process들이 resource를 충분히 해제할 때까지 대기해야 한다.
를 봤을 때, MAX가 [7, 5, 3]이고,
Allocation [0, 1, 0]이므로
언제든지 언제든지 [7, 4, 3]을 요구할 수 있다.
➡️ 시작을 로 하면 부도가 난다.
그래서 부터 시작하면, MAX [3, 2, 2]이고,
Allocation [2, 0, 0]이므로
언제든지 [1, 2, 2]를 요구할 수 있다.
➡️ Available [3, 3, 2]이기 때문에 [1, 2, 2]를 빌려줄 수 있다.
➡️ 이 끝나고 resource를 release하면, Available [5, 3, 2]가 된다.
다음으로 는 [6, 0, 0]을 요구할 수 있고, Available은 [5, 3, 2]이므로 빌려줄 수 없다.
그래서 다음으로 은 Max[2, 2, 2]이고,
Alloaction [2, 1, 1]이므로 언제든지 [0, 1, 1]을 요구할 수 있다.
➡️ Available [5, 3, 2]이기 때문에 [0, 1, 1]를 빌려줄 수 있다.
➡️ 이 끝나고 resource를 release하면, Available [7, 4, 3]가 된다.
다음으로 는 Max[4, 3, 3]이고,
Allocation [0, 0, 2]이므로 언제든지 [4, 3, 1]을 요구할 수 있다.
➡️ Available [7, 4, 3]이기 때문에 [4, 3, 1]를 빌려줄 수 있다.
➡️ 이 끝나고 resource를 release하면, Available [7, 4, 5]가 된다.
다음으로 는 Max[7, 5, 3]이고,
Allocation [0, 1, 0]이므로 언제든지 [7, 4, 3]을 요구할 수 있다.
➡️ Available [7, 4, 5]이기 때문에 [7, 4, 3]를 빌려줄 수 있다.
➡️ 이 끝나고 resource를 release하면, Available [7, 5, 5]가 된다.
다음으로 는 Max[9, 0, 2]이고,
Allocation [3, 0, 2]이므로 언제든지 [6, 0, 0]을 요구할 수 있다.
➡️ Available [7, 5, 5]이기 때문에 [6, 0, 0]를 빌려줄 수 있다.
➡️ 이 끝나고 resource를 release하면, Available [10, 5, 7]가 된다.
Safe Sequence :
➡️ ➡️ ➡️ ➡️
➡️ ➡️ ➡️ ➡️
(더 있을 수도? 계산은 안 해봄)
이러한 Safe Sequence대로 하면, Deadlock은 절대 안 생긴다.
경우 중에 Safe Sequence는 여러 개 있을 수 있다.
➡️ Deadlock을 Prevention할 수 없으니까,
발생하게 내버려 두고 Detection하여 회복해야 한다.
Detection하기 위해서는 modeling이 또 필요하다.
wait-for graph
이렇게 요청관계만 남겨보니, Circulation이 있는지를 알아보기 쉽다.
(Circulation이 있으면 Deadlock이 생길 수 있다. )
(Criculation이 없으면 Deadlock이 절대 없다.)
이러한 wait-for graph의 용도는 Deadlock Detection이다.
victim(희생자) process
을 찾아보자.Victim process를 중지(abort)시킴으로써 Deadlock 상태를 제거한다.
➡️ Victim process는 Deadlock만 생기면 abortion당하니까 Starvation이 생김.
자원 선점을 이용해 교착 상태를 제거하려면, 교착 상태가 깨어질 때까지 프로세스로부 터 자원을 계속 선점해 이들을 다른 프로세스에 주어야 한다.
Rollback
: return to some safe state, restart process for that stateStarvation
: same process may always be picked as victim, include number of rollback in cost factor