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를 사용한다.
'컴퓨터공학기초 개념 > 운영체제' 카테고리의 다른 글
31. 가상메모리 - 페이징 시스템 (0) | 2021.07.06 |
---|---|
30. 가상메모리(Virtual Memory System) - 개념 (0) | 2021.07.06 |
28. 스레드(Thread) - 세마포어(Semaphore) (0) | 2021.07.05 |
27. 스레드 동기화 이슈 해결방법 (0) | 2021.05.11 |
26. 스레드(Thread) - 동기화(Synchronization) (0) | 2021.05.11 |
댓글