본문 바로가기
컴퓨터공학기초 개념/운영체제

29. 스레드(Thread) - 교착(Deadlock)과 기아(Starvation)상태

by devraphy 2021. 7. 5.

1. 개요

- 스레드 동기화 문제를 해결하기 위해서, 임계영역에 접근하는 순서를 프로그래밍한다.

- 잘못된 로직을 작성하면 모든 스레드가 대기상태에 걸리거나, 특정 스레드가 아예 접근 기회를 얻지 못하게 된다. 

- 교착 상태와 기아 상태의 형태는 이론적으로 존재하지만, 특정한 해결 방안은 존재하지 않는다.

- 그 이유는 프로그램 구조에 따라 해결방법이 천차만별 다르기 때문이다. 

- 그러므로, 본 포스팅에서는 Deadlock과 Starvation의 개념과 원인에 대해 작성한다.

 


2. Deadlock(교착 상태)

- Deadlock은 무한 대기 상태를 의미한다. 

- 즉, 대기중인 두개 이상의 스레드가 서로의 작업이 완료되기를 기다리는 상황을 의미한다.

[Thread A]

a = "임계자원"

lock.acquire(a)

if(enough space) {
    use(a)
    lock.acquire(b)
}
lock.release(a)
[Thread B]

b = "임계자원"

lock.acquire(b)

if(enough space) {
    use(b)
    lock.acquire(a)
}
lock.release(b)

- 위의 코드를 참고해서 상황을 이해해보자.

 

[Thread A의 상황]

▶ Thread A에서 a라는 임계자원에 접근하였고, 다른 스레드의 접근을 방지하기 위해 lock을 건다.

▶ 임계 영역 내부에서 b라는 임계자원의 접근을 요청한다. 

 

[Thread B의 상황]

▶ Thread B에서 b라는 임계자원에 접근하였고, 다른 스레드의 접근을 방지하기 위해 lock을 건다.

▶ 임계 영역 내부에서 a라는 임계자원의 접근을 요청한다. 

 

- Thread A는 임계자원 b를 접근하기 위해서, Thread B는 임계자원 a를 접근하기 위해서 대기상태가 된다.

- 하지만, 서로의 작업이 완료되지 않은 상태에서 다른 임계자원의 사용을 위해 대기상태가 되었기에 작업은 영원히 끝나지 않게 된다.

- 이러한 상태를 Deadlock(교착 상태) 이라고 한다.  

 

 

a) Deadlock의 발생조건

- 아래의 4가지 조건이 모두 성립되는 경우, deadlock이 발생한다.

 

상호배제(Mutual Exclusion)

   - 프로세스들이 필요로 하는 자원에 대해 배타적인(= 독점) 통제권을 요구한다.

 

점유대기(Hold & Wait)

   - 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다린다.

 

비선점(No preemption)

   - 프로세스가 어떤 자원의 사용을 완료할 때까지 해당 자원을 다른 프로세스에서 뺏을 수 없다.

 

순환대기(Circular wait)

   - 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다. 

 

 

b) Deadlock 해결방안

- 간단하다. 위의 4가지 조건 중 하나를 제거하는 것이다. 

- 아래의 스크린샷은 교착상태의 예방, 회피, 발견, 회복에 관한 내용이다. 

- 참고만 하자. 

 


3. Starvation(기아 상태)

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

- Starvation은 스레드의 동기화 이슈에서만 발생하는 문제점은 아니라는 것을 알아두자. 

 

a) Deadlock vs Starvation

교착상태(Deadlock)

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

 

기아상태(Starvation)

   - 여러 프로세스가 부족한 자원을 점유하기 위해서 경쟁하는 상태

   - 우선순위에 의하여 특정 프로세스가 영원히 자원 할당을 받지 못하는 상태 

 

b) Starvation 해결방안

- 프로세스의 우선순위를 수시로 변경한다. 

- 대기시간이 긴 프로세스에게 우선순위를 부여한다.

- 프로세스의 우선순위가 아니라 요청 순서대로 처리하는 FIFO 방식의 요청 Queue를 사용한다. 

 

댓글