DeadLock(교착상태)

JM1107·2022년 12월 6일
0

DeadLock이란

: 두 개 이상의 작업이 서로 상대방의 작업이 끝나기만을 기다리고 있기 때문에 다음 단계로 진행하지 못하는 상태

ThreadA에서는 X 임계 자원을 사용하고 그 내부에서 Y 임계 자원을 요청한다.
ThreadB에서는 Y 임계 자원을 사용하고 그 내부에서 X 임계 자원을 요청한다.
Thread A 에서 Y임계자원을 요청 -> Thread B에서 사용중이기 때문에 대기
Thread B 에서 X임계자원을 요청 -> Thread A에서 사용중이기 때문에 대기
-->결국 서로 사용하지 못하고 끝나기만을 기다리는 상태이다.

프로세스, 쓰레드 둘 다 이와같은 상태가 일어날 수 있다.

DeadLock 조건

  1. 상호 배제(Mutual Exclusion) : 프로세스들이 필요로 하는 자원에 대해 배타적이 통제권을 요구한다. ( Process A가 X라는 임계자원을 사용중이면 다른 어떤 Process도 X에 접근하지 못한다.)

  2. 점유 대기(Hold & Wait) : 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다린다.

  3. 비선점(No preemition): 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없다.

  4. 순환 대기(Circular Wait) : 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다.

DeadLock 해결방법

  1. DeadLock 예방

    DeadLock 조건 중 하나를 제거함으로써 해결하는 방법.

    1-1. 상호 배제 조건 제거

    • 모든 자원의 공유를 허용함.

    1-2. 점유 대기 조건 제거

    • 필요한 모든 자원을 할당함.(자원 낭비 발생)

    • 자원을 점유하고 있지 않을 때만 다른 자원을 요청할 수 있도록 함.(기아 상태 가능성)

    1-3. 비선점 조건 제거

    • 할당 받을 수 없는 자원을 요청할 때 점유하고 있는 모든 자원을 반납하고 대기하게 함.(자원 낭비 발생)

    1-4. 순환대기 조건 제거

    • 자원에 고유 번호를 매기고 번호 순서대로 특정 방향으로만 자원을 요구하도록 함.(자원 낭비 발생)
  1. DeadLock 회피

    교착상태가 발생하기 전 교착상태를 예측하고 회피하는 방법이다. 회피할 수 있는 조 건을 달성하기 어렵고 자원을 요청할 때마다 회피 알고리즘을 사용하면 오버헤드가 크기 때문에 현실성 없는 방법이다.

  1. DeadLock 탐지, 복구

    3-1. 교착상태 탐지

    교착 상태를 허용하되 탐지 알고리즘으로 교착상태를 탐지하면 복구하는 방법이다. 탐지 알고리즘을 너무 자주 호출할 경우 오버헤드가 커지기 때문에 적절한 시점과 주기에 호출할 필요가 있다.

    3-2. DeadLock 복구

    • 프로세스 종료 : DeadLock인 프로세스를 모두 종료 하거나 DeadLock이 제거 될때까지 한 프로세스씩 중지하는 방법
    • DeadLock이 제거될 때까지 프로세스가 점유한 자원을 선점해 다른 프로세스에 할당하는 방법
profile
개발자준비

0개의 댓글