CS/운영체제

[운영체제] 교착상태가 무엇일까?

mhko411 2021. 10. 12. 11:18
728x90

프로세스가 실행되기 위해서는 CPU, 메모리, 파일 등과 같은 여러가지 자원이 필요하다. 이 중 하나의 자원만 부족해도 프로세스가 실행되지 못한다. 따라서 운영체제는 이러한 자원을 관리하여 프로세스에게 적절히 배분해줘야 한다. 이때 교착상태가 일어나는데 교착상태의 개념과 교착상태의 원인, 해결법을 알아보자.


교착상태란?

입구가 두 개이고 한 명만 지나갈 수 있는 골목이 있다. 이 때 양쪽의 입구에서 사람들이 골목을 지나가려고 한다. 하지만 서로 반대편 사람이 먼저 지나가는 것을 기다리고 있어 아무도 골목을 들어서지 못하고 있다. 이처럼 두 개 이상의 서로 다른 프로세스가 다른 프로세스의 작업이 끝나기만을 기다리고 있어 어떠한 프로세스도 완료되지 못하는 것을 교착상태라 한다.

 

프로세스 A와 B가 있을 때 프로세스 A는 프로세스 B가 가지고있는 자원이 부족해서 실행하지 못하고 프로세스 B는 프로세스 A가 가지고있는 자원이 부족해서 실행하지 못하고 있다. 한 쪽의 프로세스가 모두 완료되어야 다른 프로세스가 실행되지만 서로 실행도 못하고 있어 무한루프에 빠지게된다.

 

교착상태가 발생하는 조건

교착상태가 발생하기 위해서는 아래의 네 가지 필요 조건이 충족되어야 한다. 이 중 한 가지라도 만족하지 않으면 교착 상태는 발생하지 않는다.

 

상호배제

한 번에 한 개의 프로세스만 공유 자원을 사용할 수 있어야 한다. 사용 중인 자원을 다른 프로세스가 사용하려면 해당 자원이 해제될 때까지 기다려야 한다.

 

점유와 대기

최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가적으로 대기하는 프로세스가 있어야 한다.

 

비선점

다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없다.

 

순환대기

공유자원을 점유하기 위해 대기하는 프로세스들이 원형으로 구성되어 있어 자신에게 할당된 자원을 점유하면서 앞이나 뒤에 있는 프로세스의 자원을 요구해야 한다. 즉 첫 번째 프로세스와 마지막 프로세스가 기다리고 있는 공유자원이 겹쳐서 원형으로 모든 프로세스가 자원 할당을 받고자 기다리는 형태가 되는 것이다.

 

교착상태 해결하기

교착상태를 해결하는 방법에는 크게 세 가지가 존재한다.

  • 교착상태 예방하기
  • 교착상태 발생할 가능성을 고려하여 회피하기
  • 교착상태 탐지 및 복구하기

교착상태 예방하기

교착상태 예방 기법은 교착상태가 발생하지 않도록 교착상태 발생 조건 중에 하나를 제거하는 것이다. 하지만 예방 기법은 자원의 낭비가 심하다는 단점이 있다.

  • 상호 배제 제거 : 한 번에 여러 개의 프로세스가 공유 자원을 사용할 수 있도록 한다.
  • 점유와 대기 제거 : 프로세스가 실행되기 전에 필요한 모든 자원을 할당하여 프로세스 대기를 없애거나 자원이 점유되지 않은 상태에서만 자원을 요구하도록 한다.
  • 비선점 제거 : 자원을 점유하고 있는 프로세스가 다른 자원을 요구할 때 점유하고 있는 자원을 해제하고 요구한 자원을 기다린다.
  • 순환대기 제거 : 자원을 선형으로 분류하여 고유 번호를 할당하고 각각의 프로세스는 현재 점유한 자원의 고유 번호보다 앞 또는 뒤에서 자원을 요구하도록 한다.

 

교착상태 회피하기

교착상태 회피 기법은 교착상태가 발생할 가능성을 고려하고 교착상태가 발생하면 적절히 회피하는 방법으로 주로 은행원 알고리즘이 사용된다.

 

은행원 알고리즘은 각각의 프로세스에게 자원을 할당하여 교착상태가 발생하지 않으며 모든 프로세스가 완료될 수 있는 상태를 안전상태, 교착상태가 발생할 수 있는 상태를 불안전 상태라고 정의한다. 또한 은행원 알고리즘 적용을 위해 자원의 양과 프로세스 수가 일정해야하며 프로세스의 모든 요구를 유한한 시간 내에 할당해야 한다.

 

교착상태 탐지 및 복구하기

먼저 교착상태가 발생했는지 교착상태 발견 알고리즘과 자원 할당 그래프를 통해 탐지한다. 이후 교착상태가 탐지되면 교착상태를 일으킨 프로세스를 종료시킨다. 

 

또는 교착상태의 프로세스가 점유하고 있는 자원을 선점하여 다른 프로세스에게 할당하며 해당 프로세스를 일시 정지시킨다. 자원을 선점할 때는 최소의 피해를 줄 수 있는 프로세스를 선택해야 하며 한 프로세스가 계속해서 자원 선점 대상이 되지 못하도록 해야한다.