What?

여러 프로세스가 같은 자원을 기다리며 blocked된 상태.

롸?//지금 충분하게 있는 자원상태 혹은 자원이랑 뱉어낼 애 있는 상태 합,...<-이 시퀀스가 되면  safe하다고 함.

Why? 

상호배제(Mutual exclusion) : 한번에 여러 프로세스가 쓸 수 없는 자원이다

 

2.점유대기 : 자원을 사용중인 프로세스가 자원을 내놓지 않는다

 

3.비선점 : 다른 프로세스로부터 자원을 빼앗을 수 없다

 

4.순환대기 : 프로세스가 순환적으로 자원을 요구한다. 1번 자원을 사용하며 2번 자원을 기다리고, 2번 자원을 사용하며 3번 자원을 기다리고, 3번 자원을  사용하며 1번 자원을 기다리는 세 개의 프로세스.

Solution?

예방-> 데드락 성립조건 4가지중 하나라도 충족되지 않도록  만든다.

 

1.상호배제-> 상호배제 조건을 제거한다

 

2.보유대기->한 프로세스에게 가용 자원을 모두 할당시키고 결국 스스로 내놓게 만듬

Issue->일어나지도 않은 일을 위해 자원들 몰아서 써서 성능이 낮아진다.

 

3.비선점-> 선점 가능한 프로토콜을 만든다. (ex. 프로세스가 cpu 선점 시 상태를 저장해둠)

 

4.순환대기->사이클이 없도록 순서를 정한다.(ex.1번을 획득해야만 2번획득)

 

 

 

 

회피-> 미리 사용할 자원을 모두 정의해둔 것을 바탕으로 데드락을 발생시킬 가능성이 높은 프로세스에게는 자원 할당을 안해준다. 

 

실선은 자원을 사용중이라는 뜻, 점선은 언젠가 한번은 쓸 자원이라는 뜻일 때,

 

점선이 향하는 자원을 p1에게 주면 사이클이 생겨서 데드락이 발생할 것을 알고 자원을 할당해주지 않는다.

or

가용자원에서 최대를 쓸 수 있는 프로세스에게'만' 자원을 줘서 보유대기예방과 같은 효과를 낸다.(은행원 알고리즘)

 

 

 

 

발견->

 

1)자원할당그래프를 그려서 사이클을 찾아본다

그래프에 사이클이 있으면 데드락'일 수도 있다.'

(인스턴스가 하나면 무조건 데드락인데 인스턴스가 두개면..)

 

왼쪽: 데드락이다.

 

오른쪽: 데드락 아니다. 사이클이 있긴하지만 P4가 여분을 쓰다가 반납하면 쓸 수 있는 상황이기 때문이다. 

 

 

 

 

다양한 그래프 종류가 있다..

롸?// 사이클 찾는 시간복잡도? n^2! 간선 다 따라가보면 된느데

간선이 결국 하나에서 모든 곳에 다 뻗쳐도 n-1개기 때문.

 

 

 

 

 

 

 

2)자원할당테이블을 그려서 가용자원들 쌓아서 생각해보고 시퀀스가 가능한지 합쳐나가면서 체크한다.(추천)

 

 

a 7,b 2,c 6개가 있는데 allocation처럼 프로세스들에게 분할이 되어있는 상태이다. 

이 상태에서 p1,p2,p3,p4가 request와 같이 자원을 추가 요청한다.

이때, 가용자원은 없지만 낙관적으로 생각해서, p0같은 경우 반납할거라고 생각한다. 그럼  요청을 받아들이는 시퀀스가 존재하므로 다 만족할 수 있어서 데드락이 아니다 .

 

 

 

 

 

 

하지만 p2가 자원 c를 더 요청한다면 ,

요청한 자원도 만족할 때까지 본인이 가진 자원을 내놓지 않기 때문에 시퀀스가 불가능하고, 데드락이다.

 

 

 

 

 

 

 

 

*데드락은 최대한 낙관적이게 생각해도 데드락인 경우에만 데드락이라 판정한다*

 

 

회복->

1.모두 죽인다.

2.차례로 하나씩 죽여본다.

3.특정 기준으로 하나만 지목하여 죽인다.(Issue:꼭 자원이 적은걸로만 하면 기아현상 될수도..)

4.회복 안하고 무시한다.( 데드락 판별 알고리즘을 코드로 넣는 것 등은 성능을 저하시키므로, 차라리 인간이 직접 처리하는 것이 낫기 때문에 요즘 채택하는 방식이다.)

 

+ Recent posts