티스토리 뷰

Operating System

6. Deadlock

김남김 2023. 1. 19. 16:26

교착 상태란?

먼저 결론부터 말하면, 진행되던게 trafic에 의해 더 이상 진행 될수 없게된 상태다. 

예시로는 교차로를 들 수 있다. 

교차로에 신호등이 고장나서 전부 초록불에다가 다들 바쁘다고 한다면?

서로 가겠다 바빠 서로의 앞길을 막게되는 경우가 생길 것이다.

 

그런데 이상태에 앞에 차들이 전부 재활용 마크 모양새로 막게 된다면? (ㅋㅋ 아 후진을 해야지 )

 

이러한 문제는 프로세스 실행과정에서도 생기는데, 두개 이상의 프로세스가 각자 가지고 있는 자원을 가진 채 다른 자원이 생기길 기다리고 있다면 그 어떤 프로세스도 진행할 수 없는 교착 상태가 된다. 

 

다른 대표적인 예시로 식사하는 철학자 문제가 있다. 

소크라테스 : 자 다들 밥 묵자

이 철학자들은 고상하신 분들이기 떄문에 앞에 파스타를 먹기위해 두개의 포크가 필요하다.

각자 한 개씩 잡고 식사를 하려는데!!!

각자 두 개를 짚으려고 하니 책상에 포크가 남지않는다...! 

그래서 밥을 드시지 못한단다... (이게 무슨 ㅋㅋ) 

 

다들 고상하게 다른 분들께서 한개 내려놓겠지~ 하고 그냥 들고 무한정 기다리고 있는 상환인 것이다.

이게 바로 교착 상태다.. 

이 교착 상태에 대해 발생조건은 4가지가 있다. 상호 배제, 점유와 대기, 비선점, 원형대기다.

 

상호배제 

우선 교착상태가 발생한 원인은 한번에 하나의 프로세스만 이용가능했기 때문이다.(임계구역을 떠올려도 된다) 

한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없는(상호배제)상황에서 교착 상태가 발생할 수 있다. 

 

점유와대기

식사하는 철학자 문제에서 각 철학자는 포크를 들고, 다른 이의 포크를 기다렸다.

프로세스도 마찬가지로 자원을 할당 받은 상태에서 다른 자원을 할당받기를 기다리는 상태 "점유와 대기"

떄문에 교착 상태가 발생할 수 있다. 

 

비선점

만약 기다리고 있는 한 철학자가 고상하지 않게 다른 철학자의 포크를 빼앗을 수 있었다면?

교착상태는 발생하지 않았을 것이다. 그러나 뺴았지 않고 각자가 다 사용하고 자원을  release하기를 기다렸는데 이러한 행동은 빈선점 했기 때문이다. 비선점을 통해 다른 프로세스의 자원을 강제로 뺴앗지 못한다면 교착상태가 발생할 수 있다. 

 

원형대기

교착상태가 발생한 마지막 이유로서, 프로세스들끼리 요청 및 할당 받은 자원이 원의 형태를 이루었기 때문이다.

위에 식사하는 철학자 문제 그림과 같이 점유와 대기를 원형의 방식으로 갖게되면 무한정.. 기다리는 상황이 올 수 있다. 

 

 

그럼 의문이 생긴다. 위와 같은 교착상태 발생조건 4가지를 제해주면 되지않을까?!

해당 발생조건을 부합하지 않게하여 예방할 수도 있으며,

교착상태의 위험이 보이면 자원을 할당하지 않는 회피도 있고,

자원을 제약없이 할당하다가 교착상태가 검출되면 회복하는 방법도 있다. 

 

일단 예방을 살펴보자 

예방하는 방법으로 우선 우선자원의 상호배제를 없앤다면?!

동기화에서 일어났던 문제가 일어난다..( 난 집에있는 똥이 보고싶어..)

 

그럼 점유와 대기를 없애보자?!

아예 자원을 모두 할당하거나 아예 할당시키지 않으면 당장에 자우너이 필요해도 다른 프로세스들은 기다리게되는 상황이온다... 즉 효율적으로 프로세스가 활동할 수 없게된다. (멀티프로세스로 우린 작동시켜야지!)

 

그럼.. 비선점을 없애보자?!

선점하여 사용할 수 있는 일부 자원에 대해서는 효과적이겠지만 프린터같은 자원을 빼앗아 사용하기란...문제가 발생한다..

 

마지막으로 원형 대기 조건을 없앤다면?!

철학자들을 일자의 책상에 앉혀 먹이게 되는 상황을 생각할 수 있는데,

이전의 원형 책상에서 생각해보면 철학자들과 포크에 각 번호를 매겨 선택된 포크만을 집도록 하게 하는 것이다.

꽤나 괜찮은 방법 같지만 각 자원에 어떤 번호를 붙이는 지에 따라 활용률이 떨어질 수도 있으며 수많은 자원에 번호를 붙이기란 쉽지가 않다.. 

 

 

이번에는 회피를 살펴보자

회피는 교착상태가 발생하지 않을 정도로만 조심히 자원을 할당하는 방식이다. 

교착 상태 회피 방식에는 교착상태를 한정된 자원의 무분별한 할당으로 인한 문제로 간주하기 때문에 ,

모든 프로세스가 정상적으로 자원을 할당받고 종료 될 수 있는 안전상태,

교착상태가 발생할 수 있는 불안전 상태로 나누어 할당하게된다. 

 

안전 순서열이라고 하여 교착 상태없이 안전하게 프로세스들에게 자원을 할당할 수 있는 순서가 있다.

banker's algorithm

해당 순서대로 프로세스가 자원을 할당받게되면 안전하게 모두 자원을 받아 실행될 수 있게되는데,

반면 안전 순서열이 없는 상황 혹은 시스템이 불안전한 상태에 놓이면 교착 상태에 놓일 수 있는 위험이있다.

즉, 교착 상태 회피는 안전 상태를 유지하도록 자원을 할당하는 방식이다. 

 

이번에는 교착 상태 검출 후 회복을 살펴보자

해당 방법은 교착 상태 발생을 인정하고 사후에 조치하는  방식인데,

프로세스들이 자원을 요구할 때마다 모두 그때마다 할당해주며 교착 상태 발생 여부를 주기적으로 검사한다.

이후 교착상태가 검출되면! 비로소 선점, 강제종료를 통해 회복한다. 

 

선점을 통한 회복

교착상태가 해결될 때까지 한 프로세스씩 자원을 몰아주는 방식이다.

 

프로세스 강제종료를 통한 회복

교착 상태에 놓인 프로세스를 모두 강제 종료할 수도 있고, 교착 상태가 없어질 떄까지 한 프로세스씩 강제 종류할 수도 있다.  모두 강제 종료하게되면 작업내역을 잃게 될 가능성이 있고, 하나씩 줄일 경우 작업 내역을 잃는 프로세스는 줄어들 수 있지만 교착 상태 여부를 확인하는 과정이 늘어 오버헤드를 야기한다. 

 

 

다양한 교착상태 해결방법에 대해 알아봤는데 아예 무시하는 방법도 존재한다.

어차피 교착상태는 매우매우 드물게 일어나기 때문에 발생하는 잠재적 문제를 무시하는 대처 방식으로 타조 알고리즘을 쓴다. 과학자나 수학자의 경우 완벽한 상황을 즐기지만 우리는 개발자로서 심각성에 따라 최대 효율을 추구하는 엔지니어기 때무에 이 방식이 적합한 경우가 많다. 

 

그림참고) 

https://ko.wikipedia.org/wiki/%EC%8B%9D%EC%82%AC%ED%95%98%EB%8A%94_%EC%B2%A0%ED%95%99%EC%9E%90%EB%93%A4_%EB%AC%B8%EC%A0%9C

'Operating System' 카테고리의 다른 글

5. Process Synchronization  (0) 2023.01.19
4. CPU Scheduling  (0) 2023.01.19
3. Thread  (0) 2023.01.16
2. Process  (0) 2023.01.15
1. Operating System  (0) 2023.01.15
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함