CS/OS

[OS] Deadlock 없애는 방법1 - prevent deadlock

Yeji Heo 2023. 2. 26. 15:32

Prevent deadlock: 앞선 글의 Deadlock의 필요충분조건 중 1개를 없앤다.

- Indirect:

mutualExclusion / holdAndWait / noPreemtion 중 하나를 없애는 방식

- Direct

circular wait을 없애는 방식


Indirect방식을 먼저 살펴보자.

1. MutualExclusion을 없애기

즉, 한 번에 1개의 프로세스만 자원 접근이 가능하게 한다는 것이다.

다르게 생각해보면 이 말은 자원 공유가 불가능해진다는 얘기이다.

따라서 MutualExclusion을 없애기는 어렵다.

 

2. Hold-and-wait를 없애기

모두 hold시키거나 / 모두 wait 시킨다.

즉, 한꺼번에 모든 자원을 할당하거나 / 놓는 방식

=> 아무 연산도 못하고 대기하게될 수 있으므로(Starvation) 효율이 떨어짐. (한편, circular wait은 자연히 사라질 것이다.)

 

3. No preemtion을 없애기(= Preemption을 허용하기)

강제로 자원을 뺏는다는 뜻. wait될 것 같으면 강제로 뺏는다. (hold-and-wait도 자연히 방지된다)

그러나 이 방식은 중간에 끝내버리니 작업 손실 등 많은 문제 발생

 

Direct방식으로는 Circular wait를 없애는 방식이 있다.

4. circular wait를 없애기

자원을 할당받아가는 순서를 같게 하면 된다.

P1이 a,b순서로 요청했다면 P2도 a,b 순서로 요청하도록 하는 것이다.

그럼 circular wait이 생길 일은 없다.

=> 하지만 P2는 a가 아닌 b부터 필요한 경우도 있다. 결국은 문제가 발생.

 

 

그러므로 데드락을 피하는 2번째 방법인 Avoid deadlock이 있다.

다음 글에서 이어 Avoid deadlock을 알아본다.