본문 바로가기
운영체제

운영체제 12장 - 프로세스 관리(9) : 교착상태 처리 -

by ChocoPeanut 2017. 4. 23.

운영체제 12

- 프로세스 관리(9) : 교착상태 처리 -

 

교착상태는 모든 프로세스들이 필요한 자원을 할당 받지 못해 대기를 하고 있는 상태를 말한다. 프로세스는 실행을 위해 여러 자원이 필요한데 어떤 자원은 갖고 있으나 다른 자원은 할당을 받기 위해 대기해야한다. 하지만 다른 프로세스 역시 다른 자원을 가지려고 대기를 하고 있어 모든 프로세스들이 자원을 할당받지 못한다. 위와 같은 교착상태에 빠지는 필요조건은 상호배타, 보유 및 대기, 비선점, 환형대기가 있다. 이에 대해서는 앞장인 교착상태 장에서 설명하였으니 생략하도록 한다. 또한 이를 자원 할당도로 확인하는 방법을 알아보았다.



교착상태가 발생하면 모든 프로세스가 중지하는 현상이 생기므로 큰 문제가 생긴다. 일반 PC의 경우에는 컴퓨터를 껐다가 켜면 되지만 항공이나 군사적 요소와 같이 실시간으로 문제를 처리하는 부분에서는 교착상태가 발생하면 매우 위험한 상황에 빠질 수 있다. 그러므로 교착상태를 해결하는 일은 매우 중요하다.


교착상태를 처리하는 방법은 크게 4가지 방식이 있다.


(1) 교착상태 방지 방식은 교착상태 4가지 필요조건 중 한 가지 이상을 불만족 시키는 방법이다. 앞의 상호배타, 보유 및 대기, 비선점, 환형 대기 중 하나만이라도 만족하지 못하는 상태가 되면 교착상태가 발생하지 않기 때문이다.


먼저 상호배타를 불만족하게 하는 방법으로는 자원을 공유 가능하게 만드는 것이다. 하나의 프로세스가 자원을 사용하고 있을 때 다른 프로세스도 자원을 사용가능하게 만드는 방식이다. 하지만 이런 방식은 동기화의 문제를 만들 수 있어 원천적으로 불가능한 방식이다. 교착상태를 없애려다가 더 큰 문제를 발생시킬 수도 있기 때문이다.


보유 및 대기를 불만족 시키기 위해서는 자원을 가지고 있으면 다른 자원을 기다리지 않게 처리하는 방식이 있다. 일부 자원만 잡고 있는 경우를 없애는 것이다. 따라서 프로세스들은 모든 자원을 가지고 있거나 아니면 자원을 아예 가지고 있지 않는 상태로만 존재하게 만드는 것이다. 하지만 이런 경우 자원 활용률이 매우 저하되고 더 심각하게는 starvation을 만들 수 있다.


비선점을 불만족 시키는 것은 반대로 선점으로 만들어 주는 것이다. 자원이 할당되어 있다고 하더라도 다른 프로세스가 자원을 뺏어올 수 있게 하는 것이다. 하지만 이런 경우는 프로세스를 처리할 때 문제가 발생할 확률이 더 높아진다. 예를 들어 프린터라는 자원이 있는데 프로세스1이 처리 도중 프로세스2가 뺏어오게 되면 프린트에 출력되는 내용이 섞이게 될 것이다. 따라서 원천적으로 불가능한 방식이다.


마지막은 환형대기를 깨는 방법은 자원에 번호를 부여하여 번호 오름차순으로 자원을 요청하는 방식이다. 프로세스가 자원을 할당 받는 부분에 순서를 부여하여 원형의 모양을 깨는 방식이다. 식사하는 철학자의 예시를 사용하게 되면 철학자 프로세스1은 자원1을 먼저 할당받아야하고 프로세스2는 자원2를 이렇게 해서 프로세스4는 자원4를 먼저 할당 받는다. 하지만 프로세스5의 경우에는 양 옆에 자원1과 자원5가 있으므로 먼저 자원 할당을 받아야하는 자원은 1번 자원이다. 따라서 프로세스4는 자원4와 자원5를 먼저 할당 받을 수 있게 되어 원형의 모양이 깨어지게 된다. 이 방법이 교착상태를 방지하는 가장 좋은 방법이라고 할 수 있다.




(2) 교착상태 회피는 운영체제가 자원을 나누어 주는 과정에 대한 문제를 고려하는 방식이다. 자원을 어떻게 잘 할당하여 줄 것인가에 대한 방식을 생각하는 것이다. 따라서 교착상태라고 하는 것을 자원 요청에 대한 잘못된 승인으로 해석한다. 예를 들어서 한 번 보도록 해보자. 현재 자원이 12개가 있고 프로세스가 3개가 동작한다고 생각을 하자.


 


표를 보게 되면 프로세스에 따라 각자 모든 처리를 위해 필요한 양과 현재 할당한 양을 나타내고 있다. 현재 할당한 양은 운영체제 의해 자원이 할당된 것을 의미한다. 따라서 12개 중에서 5, 2, 2개를 할당한다. 그러면 자원은 3개가 남게 된다. 그러면 이 프로그램은 안전한가? 그걸 판단하기 위해서는 프로세스를 모두 처리할 수 있는지를 생각해보면 된다. 우선 프로세스1이 남은 자원 3개 중 2개를 더 사용하면 프로세스 처리를 끝낼 수 있다. 처리가 끝나고 나면 자원을 다시 반납하므로 총 7개의 자원이 생기게 된다. 7개의 자원을 가지고 있으면 프로세스0이나 프로세스2 중 우선순위가 있는 프로세스에 자원을 할당에 프로세스를 끝내고 자원 반납 후 다른 프로세스도 종료 시킬 수 있다. 그러면 자원을 활용해서 모든 프로세스가 사용할 수 있게 된다. 이렇게 되면 자원 할당이 안전한 할당이 되었다고 한다.



그러면 다른 경우를 보도록 하자. 위와 똑같이 12개의 자원과 3개의 프로세스가 있다고 하자. 그런데 바뀐 점을 보면 프로세스2에 현재 할당된 양이 3개가 되었다. 그러면 남는 자원은 2개가 된다. 자원 할당을 통해 프로세스들이 모두 종료가 될 수 있는지 살펴보자. 우선 프로세스1은 앞의 경우와 같이 프로세스를 처리 가능하다. 그러면 프로세스1이 종료되고 자원 4개가 반납이 되었다. 그런데 자원 4개를 가지고 처리를 할 수 있는 프로세스가 존재하지 않는다. 따라서 이러한 할당은 모든 프로세스를 종료시킬 수 없다. 이런 경우를 불안전한 할당이라고 하고 교착상태에 빠졌다고 한다. 따라서 교착상태 회피는 자원을 할당할 때 안전한 할당을 하게 하는 것을 의미한다.



(3) 교착상태 검출 및 복구 방법은 교착상태가 일어나는 것을 허용하고 주기적인 검사를 통해 교착상태 발생 시 복구를 하는 방식이다. 검사에 대해서는 계산이나 메모리 사용과 같은 추가적인 부담이 필요하고 복구에 대해서는 프로세스를 일부 강제 종료하거나 자원을 선점하여 일부 프로세스에게 할당하는 방식이 사용된다.


(4) 교착상태 무시는 말 그대로 교착상태가 발생하는 것에 준비를 하지 않는 것이다. 교착상태는 실제로 잘 일어나지 않는다. 필요조건인 4가지의 조건이 모두 만족하더라도 실제로 교착상태는 잘 일어나지 않는다. 만약 일어난다면 모두 꺼버리고 재시동을 하는 방법으로 교착상태를 벗어난다.