데드락 DeadLock 교착 상태 해결 방법 일어나는 조건 4 가지

2022. 9. 5. 16:13컴퓨터사이언스(CS)

728x90

데드락 ( DeadLock ) 교착 상태는 한자원을 가지고 서로 양보하지 않아서 둘 다 계속 대기하는

상태가 되는 것이다 즉 

 

 

만약 A 는 물을 가지고 있고  B는 빵이 있다고 가정해보자

A는 물을 많이 먹었지만 배고프다  하지만 B는 배는 부르지만 목이 마르다 이럴 때는 어떡하면

좋을까?

 

 

A 한 테 B는  물을 받아먹고 빵을 주면 되고 B는 그 반대로 빵을 주고 물을 얻어먹으면 된다 하지만

서로서로 양보하지 않으려고 한다 그러면 서로는 빵과 물이라는 자원이 필요하지만 서로에게

양보하지 않아서 A B 둘 다 아무것도 하지 못하는 상태가 된다 이것을 교착상태다

 

 

 

 

더 쉽게 한 줄로 설명하자면 서로 자원을 먼저 양보하지 않아 스레드 또는  프로세스들이 기다리는 상태이다

교착 상태에서는 위에 사진처럼 어디한곳도 양보를 안 하고  자기가 들어가 자원들 즉 자기가 사용할 수 있는

도로를 점유하는 동시에 다른 도로를 지나가려고 기다리는 것이다 누구 하나만 양보하면 될 텐데 전부 양보를

하지 않고

 

이거를 일어나는 조건은 총 4 개 가있다

 

1 공유해서 사용하지 못하는 자원 즉 한 명만 사용 가능한 자원

2 자신이 사용하고 있는 자원 외 에 다른 자원을 요청하는 것

( 자기가 a 자원을 사용하면서 b 자원도 사용하려고 하는 것 즉 a자원과 b자원을 동시에 사용하려고 하는 것)

3  자기 자신이 가지고 있는 자원이 나아지면 포기할 수 없는 자원 

( 자기 자신이 획득한 리소스를 자기 자신이 아니면 반환이 불가능하다 꼭 스스로 자원을 반납해야 하는 상황 )

4  기다리는 자원을 하나하나 이어 보면  서로 기다리는 자원들에 대한 서클 모양을 그릴 수 있음

 

총 이렇게 4가지의  교착 상태를 일어나게 하는 4가지 상황을 적어봤다 

모든 운영체제 나 모든 프로그래밍은 교착 상태가 일어난다 그럼 교착상태가 일어나지 않게 하는 방법은

무엇이 있을까?

 

 

교착 상태가 일어나려면 위의 조건을 4 가지가 만족해야 한다고 했다  그럼 하나 중에서라도 단 한 가지만 

조건에서 배제시키면 되지 않을까 라는 생각이 든다 

 

 

맞다 단 한 가지라도  일어나 지 않으면 된다 그럼 1번부터 해결책을 하나하나 생각해보자

( 위에 단 한 가지라도 일어나지 않게 하는 방법을 데드락 방지라고 한다)

 

 

1번 해결책 :  1번은 자원을 공유해야 한다는 것은 현실적으로 불가능하다 만약 print를 사용할 때 다음 것이 끝나야 다음것이 실행되는 등 프로그래밍은 절차를 적는 글쓰기이다 그래서 하번에 하나만 해야 할 때가 있다

 

2번 해결책:  자신이 사용하고 있는 자원이 아무것도 없거나 또는 필요한 자원을 확보한 후에 한번에 가지고 들어가는것이다 하지만 이것도 문제가있을것 같다 만약 하나의 프로세스나 스레드가 여러개의 자원을 확보한후에 들어갔다고 가정해보자 근대 만약에 하나의 스레드가 다 끝난 자원인데 도일이 끝나지 않았다면 굉장히 비효율 적인 프로그램이 될 것 같다

 

3번째 해결책 : 자기의 자원을 시간을 정해서 다하지 않았더라도 자원을 풀게 하는 것이다 즉 시간을 분할하는 것의 알고리즘을 짜는 것이다 실제 운영체체가 CPU를 점유하는  알고리즘을 사용하는데 많이 사용한다

즉 한 프로세스 또는 스레드들이 점유하는 시간을 분할하며 돌아가는 것이다 다 끝나지 않았더라도 PCB에

정보를 저장하며 컨텍트 스위칭을 일으키는 방법이다 

( 윈도 맥 등 여러 운영 채재는  프로세스가 CPU를 점유하는 방법을 시분할 즉 시간을 지정해줘서 끝나지 않더라도 시간이 지나면 다른 프로세스가 점유할 수 있는 알고리즘을 사용하고 있다)

 

4번째 해결책 : 만약 자기 자신이 점유한 리소스가 다른 프로세스가 점유하려고 하면 자기 자신의 자원을 포기하는 방법이다 또는 오름차순대로 정리하여  만약  1 2 3 4 5번 리소스 중에 5번 리소스를 사용하고 있다면 

1 2 3 4를 사용하지 못하고 5 위에 있는 6번을 사용하는 것이다 이러면 순환은 발생하지 않는다

 

 

 

 

 

 

 

 

 

 

 

728x90