# 교착상태

### 교착상태 (데드락)

💡 여러 프로세스가 서로 다른 프로세스의 작업이 끝나기를 기다리다가, 아무도 작업을 진행하지 못하는 상태이다. 즉, 교착상태는 공유자원 때문에 일어나는 현상이다. (특정 자원을 여러 프로세스가 공유하지 않는다면, 교착상태는 발생하지 않는다.)

### 교착상태의 예시

* 원형 탁자에 세 개의 음식과, 세 개의 포크, 세 명의 사람이 있다. 음식을 먹기 위해서는 반드시 포크 두 개를 사용해야한다.
* 이런 상황에서 세 명의 사람이 각자 포크를 하나씩 들어서 아무도 음식을 먹지 못하는 상태를 교착상태라고 한다.

### 교착상태의 필요조건

💡 필요 조건 중 한 가지라도 충족되지 않으면, 교착상태는 발생하지 않는다. 이에 필요 조건을 활용해 교착상태를 “예방”하려고 하였으나, 제약이 많고 비효율적이었다. 이에 교착상태에 빠진 후 해결하는 방법을 사용하게 되었다.

1. 상호배제
   * 어떤 프로세스가 하나의 리소스를 점유했다면, 다른 프로세스와 공유할 수 없다.

     (내가 집은 포크는 다른 사람이 쓸 수 없다)
2. 비선점
   * 프로세스 A가 자원을 점유했을 때, 프로세스 B가 해당 자원을 뺏을 수 없다.

     (내가 먼저 든 포크는, 다른 사람이 뺏어갈 수 없다)
3. 점유와 대기
   * 프로세스가 리소스A를 가진 상황에서, 또 다른 리소스B를 기다리는 상태여야한다.

     (하나의 포크가 더 필요한 상황)
4. 원형 대기
   * 점유와 대기를 하는 프로세스들이 원형을 이루고 있어야한다.

     (서로가 서로의 포크를 원하고 있어야한다.)

***

### 교착상태의 해결 방법

1. 교착상태의 예방
2. 교착상태 검출 후 해결

### 교착상태 예방 (deadlock avoidance)

* 은행원 알고리즘 등을 사용하여 교착상태가 발생하지 않는 수준만 자원을 할당하는 방식이다.
  * 프로세스가 요청하는 프로세스의 수 뿐만 아니라, 최대 요청 수 및 운영체제가 가지고 있는 자원의 수를 비교하며 안정상태, 불안정상태로 분류한다.
  * 운영체제는 최대한 안정상태로 유지하고자 한다.
  * 불안정상태에 있더라도, 무조건 교착상태에 빠지는 것이 아니라 단순히 확률이 높아지는 것이다. (최대 요청개수를 요청하지 않을 가능성이 존재하기 때문이다) =
* 운영체제는 위 방법을 위해 다음과 같은 정보를 알고 있어야한다.

  * 시스템의 총 자원 (전체 자원의 수)
  * 프로세스의 최대 요구자원
  * 프로세스의 요구자원

  ⇒ 남은 자원을 가지고 교착상태에 빠지지 않을 수 있을지 판단하는것이다.
* 교착상태를 회피하기는 적절하지만, 오버헤드가 발생하므로 비싸고 비효율적이다. (불안정상태라고 항상 교착상태가 발생하는 것은 아니므로)

### 교착상태 검출 방법

💡 \*\*교착상태 해결 방법 :\*\* 일정 시점마다 체크포인트를 만들어 작업을 저장하고, 교착상태가 발생한다면 해당 체크포인트로 롤백하여 교착상태를 해결한다.

1. 가벼운 교착상태 검출
   * 타이머를 이용한다.
   * 프로세스가 일정시간동안 작업을 하지 않는다면, 교착상태라고 판단한다.
2. 무거운 교착상태 검출
   * 자원 할당 그래프를 이용한다.
   * 운영체제는 프로세스가 어떤 자원을 사용하는지, 요청하는지 확인하며, 해당 그래프에 순환구조가 생긴다면 교착상태를 일으킨 프로세스를 종료시킨다. (체크포인트로 롤백)
   * 해당 방법은 운영체제가 지속적으로 자원 할당 그래프를 유지하고 검사해야하는 오버헤드가 발생하지만, 가벼운 교착 상태 검출에서 발생하는 억울하게 종료되는 프로세스는 발생하지 않는다.
