본문 바로가기

CS/O.S

(운영체제) DeadLock & Starvation

DeakLock이란?

두 개 이상의 작업이 서로 상대방의 작업이 끝나기만을 기다리고 있기 때문에 다음 단계로 진행하지 못하는 상태

a, b라는 임계 자원이 있다고 가정하자

ThreadA에서는 a 임계 자원을 요청하고 그 내부에서 b 임계 자원을 요청한다.
ThreadB에서는 b 임계 자원을 요청하고 그 내부에서 a 임계 자원을 요청한다.

이러한 경우에 ThreadA에서 b 임계 자원을 요청하려고 하지만 ThreadB에서 b 임계 자원은 이미 사용 중이기 때문에 lock이 걸려있다.
(ThreadA는 b가 끝날 때까지 기다리는 상태)
반면 ThreadB에서는 a 임계 자원을 요청하지만 ThreadA에서 b를 기다리는 상태이기 때문에 lock이 걸려있다. 결국 서로 사용하지 못하고 끝나기만을 기다리는 상태이다.

 

데드락은 배치 처리 시스템에서는 일어나지 않는다.
프로세스 스레드 둘 다 이와 같은 상태가 일어날 수 있다.

교착상태 발생 조건

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

Starvation이란?

특정 프로세스의 우선순위가 낮아서 원하는 자원을 계속 할당받지 못하는 상태

 

예를 들어서 50개의 Task가 있고 50개 중 49개는 1번 우선순위를 갖고 나머지 1개는 2번 우선순위를 갖는다고 가정하자.
또한 해당 프로그램은 10번의 실행 과정을 거치면 종료된다.

이때 2번의 우선순위를 갖는 작업은 자원을 할당받을 수 없다. 자원을 할당받더라도 우선순위가 높은 자원에게 자원 할당을 뺏기기 때문이다.

Starvation과 DeadLock

DeadLock은 여러 프로세스가 동일 자원 점유를 요청할 때 발생한다.

Starvation은 여러 프로세스가 부족한 자원을 점유하기 위해 경쟁할 때 특정 프로세스는 영원히 자원 할당이 안 되는 경우를 주로 의미한다.

 

Starvation은 어떻게 해결할까?

우선순위 변경

  • 프로세스 우선순위를 수시로 변경해서 각 프로세스가 높은 우선순위를 가질 기회를 준다.
  • 오래 기다린 프로세스의 우선순위를 높여준다.
  • 우선순위가 아닌 요청 순서대로 처리하는 FIFO 기반 요청 큐를 사용한다.