<h1><center> 교착상태(Deadlock) </center></h1>
###### tags: `💻 TIL`, `Computer Science`, `Operation System`
###### date: `2024-02-02T15:12:33.284Z`
> [color=#724cd1][name=데릭]
> [교착상태](hhttps://www.nossi.dev/d42a6f0e-492a-4a23-ab97-fb30e78f054c)
> [혼공운 - 내 노션](https://www.notion.so/derrickkim/13-01-a57d00fce32a4f9e85d3c8b39bd9a711?pvs=4)
> [Nossi.DEV](https://www.nossi.dev/d42a6f0e-492a-4a23-ab97-fb30e78f054c)
## 교착상태
둘 이상의 Thread가 각기 다른 Thread가 점유하고 있는 자원을 서로 기다릴 때, 무한 대기에 빠지는 상황을 말한다.
## 교착 상태 발생 조건
발생 조건은 총 4가지 있다.
- 상호배제
- 점유와 대기
- 비선점
- 원형 대기
**4가지 중 하나라도 만족하지 않는다면 교착 상태가 발생하지 않지만**, 모두 만족될 때 교착 상태가 발생할 가능성이 생긴다고 보면 된다.
Deadlock 문제를 해결하는 방법에는 무시, 예방, 회피, 탐지-회복 4가지 방법이 있다.

> Deadlock 예시
### 상호 배제
우선 교착 상태가 발생한 근본적인 원인은 해당 자원을 한 번에 하나의 프로세스만 이용했기 때문이다. 한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없을 때, 상호 배제 상황에서 교착 상태가 발생할 수 있다.
- 동시에 한 Thread만 자원을 점유할 수 있는 상황.
- 다른 Thread가 자원을 사용하려면 자원이 방출될 때까지 기다려야 함.
### 점유와 대기
어떠한 자원을 할당받은 상태에서 다른 자원을 할당받기를 기다린다면 교착 상태가 발생할 수 있다. 이렇게 자원을 할당받은 상태에서 다른 자원을 할당받기를 기다리는 상태를 점유와 대기(Hold and Wait)라고 한다.
- Thread가 자원을 보유한 상태에서 다른 Thread가 보유한 자원을 추가로 기다리는 상황.
### 비선점
비선점 자원은 그 자원을 이용하는 프로세스의 작업이 끝나야만 비로소 이용할 수 있다. 즉, 어떤 프로세스도 다른 프로세스의 자원을 강제로 빼앗지 못했기 때문에 교착 상태가 발생했다고 볼 수 있다.
- 다른 Thread가 사용 중인 자원을 강제로 선점할 수 없는 상황.
- 자원을 점유하고 있는 Thread에 의해서만 자원이 방출된다.
### 원형 대기
교착상태가 발생하는 마지막 이유는 여러 프로세스들이 요청하고 할당받은 자원이 원형으로 연결된 구조를 형성했기 때문이다. 다시 말해, 자원 할당 그래프가 원의 형태로 그려지면 교착 상태가 발생할 수 있다. 이렇게 프로세스들이 원의 형태로 자원을 대기하는 것을 원형 대기(Circular Wait)라고 한다.
- 대기 중인 Thread들이 순환 형태로 자원을 대기하고 있는 상황
### 교착 상태 해결 방법
**무시**
> Deadlock 발생 확률이 낮은 시스템에서 아무런 조치도 취하지 않고 Deadlock을 무시하는 방법
- 무시 기법은 시스템 성능 저하가 없다는 큰 장점이 있다.
- 현대 시스템에서는 Deadlock이 잘 발생하지 않고, **해결 비용이 크기 때문에** 무시 방법이 많이 사용됨
**예방**
> 교착 상태의 4가지 발생 조건중 하나가 성립하지 않게 하는 방법
- 순환 대기 조건이 성립하지 않도록 하는 것이 현실적으로 가능한 예방 기법이다.
- **자원 사용의 효율성이 떨어지고 비용이 크다.**
**회피**
> Thread가 앞으로 자원을 어떻게 요청할지에 대한 정보를 통해 순환 대기 상태가 발생하지 않도록 자원을 할당하는 방법
- 자원 할당 그래프 알고리즘, 은행원 알고리즘 등을 사용하여 자원을 할당하여 deadlock을 회피한다.
**탐지-회복**
시스템 검사를 통해 deadlock발생을 탐지하고, 이를 회복시키는 방법
- **자원 사용의 효율성이 떨어지고 비용이 크다.**