교착상태(deadlocck)와 기아상태(Starvation)

교착상태란?

  • 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에, 다음 단계로 진행하지 못하는 상태
  • 배치 처리 시스템에서는 일어나지 않는 문제
  • 프로세스,스레드 둘다 이와 같은 상태가 일어날 수 있음
  • 예를 들어, 파이썬 코드상에서 쓰레드 A는 lock.acquire(a)를 통해서 a를 locking하고 내부에서 lock.acquire(b)를 하였다. 쓰레드 B는 lock.acquire(b)를 하고 내부에서 a를 사용한 후 lock.acquire(a)를 하도록 코드가 작성되어 있다.
    • 쓰레드 a는 a를 locing하고 b를 요청
    • 쓰레드 b는 b를 locking하고, a를 요청
    • 쓰레드 a가 자원 a를 소유, 쓰레드 b가 자원 b를 소유한 상태인데 각각 의 쓰레드는 서로가 서유한 쓰레드를 요청하기 때문에 무한대기상태에 빠지게된다.
      image.png

교착상태 발생 조건

다음 네 가지 조건이 모두 성립될 때, 교착상태 발생 가능성이 있음

  • 상호배제 : 프로세스들이 필요로 하는 자원에 대한 배타적인 통제권을 요구한다.
  • 점유대기 : 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다린다.
  • 비선점 : 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없다.
  • 순환대기 : 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다.

기아상태(starvation)

  • 특정 프로세스의 우선순위가 낮아서 원하는 자원을 계속 할당 받지 못하는 상태
  • 교착상태와 기아상태
    • 교착상태는 여러 프로세스가 동일 자원 점유를 요청할 때 발생
    • 기아상태는 여러 프로세스가 부족한 자원을 점유하기 위해 경쟁할 때, 특정 프로세스는 영원히 자원이 할당이 안되는 경우를 의미