Deadlock이란

교착 상태는 두 개 이상의 스레드들이 서로 점유한 자원을 해제할 때까지 무한정 기다리는 상태를 의미한다. (실행하지 않음)

B) 교착상태 발생 조건

교착 상태는 한 시스템 내에서 다음의 네 가지 조건이 동시에 성립 할 때 발생한다. 따라서, 아래의 네 가지 조건 중 하나라도 성립하지 않도록 만든다면 교착 상태를 해결할 수 있다.

  1. 상호배제 (Mutual Exclusion)

    • 자원은 한 번에 한 프로세스만이 사용할 수 있어야 한다.
  2. 점유 및 대기 (Hold And Wait)

    • 최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 있어야 한다.
  3. 비선점 (No preemption)

    • 해당 작업이 완료되기 전까지는 자원이 반환되지 않는 것.
    • 다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없어야 한다.
  4. 환형대기 (Circular Wait)

    • 연쇄적 (꼬리에 꼬리를 무는, 뫼비우스) 으로 자원을 기다리는 형태.
    • 프로세스의 집합 에서 이 점유한 자원을 대기하고 가 점유한 자원을 대기하고 이 점유한 자원을 대기하며 가 점유한 자원을 요구해야 한다.

C) Deadlock 대비 방법

교착 상태가 일어나기 전에 미리 대비하는 방법

C.1) 예방 (Prevention)

교착 상태 발생 조건 중 하나를 제거함으로써 해결한다. 발생하지 않은 상태를 대비하므로, 자원의 낭비가 심하다.

  1. 상호 배제 (Mutual exclusion) 부정
    • 여러 개의 프로세스가 공유 자원을 사용할 수 있도록 한다.
  2. 점유 대기 (Hold and wait) 부정
    • 프로세스가 실행되기 전 필요한 모든 자원을 할당한다.
  3. 비선점 (No preemption) 부정
    • 자원을 점유하고 있는 프로세스가 다른 자원을 요구할 때 점유하고 있는 자원을 반납하고, 요구한 자원을 사용하기 위해 기다리게 한다.
  4. 순환 대기 (Circular wait) 부정
    • 자원에 고유한 번호를 할당하고, 번호 순서대로 자원을 요구하도록 한다.

C.2) 회피 (Avoidance)

교착 상태가 발생하면 피해가는 방법이다.

  • 은행원 알고리즘 (Banker’s Algorithm): 다익스트라가 제안한 방법
    • 교착 상태에 빠질 수 없는 안정 상태를 유지할 수 있는 요구만을 수락하고, 불안전 상태를 초래할 사용자의 요구는 나중에 만족될 수 있을 때까지 계속 거절
    • 안정 상태에 있으면 자원을 할당하고, 그렇지 않으면 다른 프로세스들이 자원을 해지할 때까지 대기함
    • 사용자 수 그리고 할당할 수 있는 자원의 수가 일정해야함
    • 항상 불안전 상태를 방지해야 하므로 자원 이용도가 낮음

D) Deadlock 처리 방법

교착 상태가 일어난 후 처리하는 방법

D.1) 탐지 (Detection)

  • 자원 할당 그래프를 통해 교착 상태를 탐지
  • 교착 상태가 탐지되면 회복 기법을 사용

D.2) 회복 (Recovery)

  • 프로세스 종료: 교착 상태에 있는 프로세스를 종료시킴
    • 교착 상태의 프로세스를 모두 중지
    • 교착 상태가 해결될 때까지 하나씩 프로세스를 중지
  • 자원 선점: 교착 상태에 있는 프로세스로부터 자원을 빼앗아 다른 프로세스에게 할당