본문 바로가기

OS(운영체제)/프로세스

[운영체제] 프로세스 - 교착상태와 해결방안

교착상태란

교착상태는 실행 중인 두 개 이상의 프로세스가 있을 때 서로가 필요한 자원을 점유해놓고 줄 때까지 작업을 멈추고 무한 대기하는 현상을 말한다.

 

쉽게 말해서 A와 B라는 친구가 있을때 A는 해외 음식을 만들기 위해서 물과 설탕이라는 자원이 필요한데 물만 갖고 있기 때문에 설탕을 얻어야 하는 상황이다.

그리고 B도 마찬가지로 국내음식을 만드는데 물과 설탕이 필요하고 B는 설탕만 갖고 있기 때문에 물을 얻어야 하는 상황이다. 이때, A와 B가 서로 물과 설탕을 점유하고 있는 상태에서 상대방이 먼저 남은 자원을 줄 때까지 음식을 만들지 않고 기다리고 있다고 생각하면 된다.

 

 

 

 


교착상태가 발생하기 위한 조건

교착상태는 아래 4가지 조건을 만족해야 발생 가능성이 있고,

하나라도 만족하지 않는다면 발생하지 않는다.

 

상호 배제 : 하나의 자원은 하나의 프로세스만 사용할 수 있는 상태.

점유와 대기 : 프로세스가 A 자원을 갖고 있으면서 다른 프로세스가 갖고있는 B자원을 기다리고 있는 상태.

비선점 : 다른 프로세스가 작업이 끝나고 자원을 반환 할때까지 기다리는 상태.

환형 대기 : 위의 그림처럼 프로세스들은 다음 프로세스가 갖고 있는 자원을 필요로 하고 있는 상태. 순환.


교착상태 해결 방안

교착상태 해결 방안에는 아래와 같은 방법이 있다.

 

1. 교착상태 예방

교착상태를 예방하는 방법은 간단하다. 위의 4가지 조건 중 하나라도 만족하지 않는다면 교착상태는 발생하지 않기 때문에 위의 4가지 방법 중 최소 하나를 부정하는 방법이다.

  • 상호 배제 부정
    한번에 여러 프로세스가 자원을 공유할 수 있도록 조치
  • 점유와 대기 부정
    모든 프로세스한테 자원을 다 할당할 때까지 기다리거나 프로세스가 자원을 점유하고 있지 않은 상태일 때만 자원을 요청할 수 있도록 조치
  • 비선점 부정
    다른 프로세스에게 할당된 자원을 갖고와서 쓸 수 있도록 조치
  • 환형 대기 부정
    선형 대기 상태로 만들어서 필요한 자원을 순차적으로 획득시키게 하는 조치 즉, 자원에 대해 고유번호를 부여하고 프로세스들은 점유하고 있는 자원에 부여된 번호를 기준으로 앞이나 뒤로 요청을 할 수 있도록 조치 

이론적으로는 위의 4가지 방법으로 교착상태를 예방할 수 있지만 현실적으로는 문제점이 존재한다.

  • 상호 배제 문제점
    공유자원에 대한 관리가 제대로 이루어지지 않아서 프로그램의 정상적인 동작이 불가능하다.
    비공유를 전제로 한다.
  • 점유와 대기 문제점
    현실적으로 구현이 불가능한건 아니지만 프로세스가 실행되기 위해 필요한 자원에 대한 정보를 미리 전부 파악하고 있어야 하기 때문에 시간과 비용이 많이들 뿐만 아니라 자원에 대한 관리가 어려워 문제점이 많은 방법이다. 하지만 보통 점유와 대기를 부정하기 위해 프로세스들 마다 우선순위를 부여하여 자원을 사용하게 하는 방법으로 쓰기도 한다.
  • 비선점 문제점
    기존에 자원을 사용 중이던 프로세스는 작업내용이 사라질 우려가 있다.
  • 환형 대기 문제점
    새로운 자원을 추가할 때 신규 번호를 부여해야 하는데 이때 오버헤드가 발생할 확률이 높다. 하지만 위의 3가지 문제점에 비해 괜찮다는 점 때문에 예방 방법에서 환형 대기 부정 방법이 가장 많이 쓰인다.

 

2. 교착상태 회피

교착상태 회피는 교착상태가 일어날 수도 있는 가능성을 인정하고, 교착상태가 일어나도 적절히 피해 가는 기법이다. 이는 교착상태 예방에 비해 훨씬 덜 엄격한 제약조건을 갖고 있어 예방보다 효율적인 방법이다.

이 방법에는 크게 두 가지 방법이 존재한다.

  • 프로세스의 시작 중단
    프로세스 요구로 교착상태가 발생할 수 있다면 시작하지 않는 방법이다.
  • 자원 할당 거부
    은행원 알고리즘을 이용한 방법이다. 우선 프로세스가 자원에 대한 요청 시 자원을 할당했을 때 불안전 상태라면 안전 상태가 될 때까지 지원을 할당하지 않는다.
    이때 안전과 불안전 상태에 대한 판단은 은행원 알고리즘이 수행하고 불안전 상태는 교착상태가 발생할 수 있음을 의미한다.

3. 교착상태 회복

교착상태 회복은 교착상태가 발생했을 때 교착상태를 해결하는 방법이다.

이 방법도 크게 두 가지 방법이 존재한다.

  • 운영자에 의한 해결
    교착상태에 있는 프로세스 중 하나를 운영자가 강제 종료시킴으로써 교착상태를 해결할 수 있다.
  • 시스템에 의한 해결
    이 방법은 프로세스 중단과 자원 선점이라는 방법을 이용한다.
    3.1. 프로세스 중단
      -> 프로세스 중단에는 시스템이 모든 프로세스를 종료시킴으로써 해결하는 방법과 교착상태가 해결될 때까지 프로세스를 하나씩 중단시키는 방법이 있다.
    이러한 방법은 교착상태를 확실하게 해결할 수 있는 방법이지만 모든 프로세스를 중단시킬 경우 지금까지 작업했던 내용을 재시작했을 때 다시 시작해야 하기 때문에 비용이 많이 드는 단점이 있고, 프로세스를 하나씩 중단시키는 경우 비용은 덜 들지만 교착상태 여부를 확인하는 알고리즘을 호출해서 탐지하고 종료시키기 때문에 오버헤드가 발생할 수 있는 단점이 있다.

    3.2. 자원 선점
      -> 프로세스가 갖고 있는 자원을 강제로 빼앗아 다른 자원이 필요한 다른 프로세스에게 자원을 할당해 주는 방식이다. 이 방식을 위해 고려해야 하는 점이 있다.

    첫 번째로 어떤 프로세스에게 어떤 자원을 먼저 줄 것인지에 대한 것이다. 이를 희생자 선택이라 하는데 희생자는 자원을 빼앗기는 프로세스를 의미한다. 희생자를 선택하는 기준은 프로세스들이 점유하고 있는 자원 수와 지금까지 실행하는데 걸린 시간 등을 매개변수로 하여 선택하게 된다.

    두 번째로 안전 상태를 체크하기 어려운 경우 교착상태 해결을 위해 프로세스를 완전히 중지시킨 후 재시작하는 것이다.

    세 번째로 희생자 선택 후 희생자가 기아상태에 빠지지 않도록 고려해야 한다는 점이다. 기아상태란  A 프로세스가 작업을 위해 어떤 자원을 필요로 할 때 그 자원이 다른 프로세스에게 계속 할당돼있어 다른 프로세스가 작업을 마칠 때까지 무한히 기다려되는 현상을 의미한다. 따라서 희생자 선택 후 기아상태에 빠지지 않도록 하기 위해 희생자는 일정 시간 동안만 희생되는 것을 보장해야 한다.