Deadlock (교착 상태)


→ 두 개 이상의 프로세스나 스레드가 서로 상대방의 작업이 끝나기를 기다리며 무한히 대기하는 상황



발생 조건


상호 배제 (Mutual Exclusion)

: 리소스는 한 번에 하나의 프로세스만 사용할 수 있어야 한다. (동시에 여러 프로세스가 리소스 공유 불가능)

점유 대기 (Hold and Wait)

: 프로세스가 최소한 하나의 리소스를 보유하고 있으면서 다른 리소스를 얻기 위해 대기하고 있어야 한다.

비선점 (No Preemption)

: 프로세스가 어떤 리소스를 이미 보유하고 있을 때, 해당 리소스를 다른 프로세스로부터 선점할 수 없어야 한다. 다른 프로세스는 해당 프로세스가 리소스를 자발적으로 반납할 때까지 대기해야 한다.

순환 대기 (Circular Wait)

: 프로세스 간에 리소스 요청 순서가 사이클을 형성하도록 대기 관계가 형성되어야 한다. 한 프로세스가 다음 프로세스의 요청을 대기하고, 다음 프로세스는 그 다음 프로세스의 요청을 대기하며, 마지막 프로세스가 첫 번째 프로세스의 요청을 대기하는 상황

해결 방안

  • 데드락이 발생하지 않도록 예방(prevention)
  • 데드락 발생 가능성을 인정하면서도 적절하게 회피(avoidance)
  • 데드락 발생을 허용하지만 데드락을 탐지(detection)하여 데드락 회복(recovery)

예방

  • 상호배제 부정 → 여러 프로세스가 한번에 한 공유 자원을 사용할 수 있도록
  • 점유 대기 부정 → 프로세스 실행 전 필요한 모든 자원을 할당하여, 다른 프로세스에 점유 중인 자원을 대기하지 않도록
  • 비선점 부정 → 자원 점유 중인 프로세스가 다른 프로세스에서 사용 중인 자원을 요구할 때 가진 자원 반납하게 하고 요구한 자원 사용하기 위해 대기하도록
  • 순환 대기 부정 → 자원에 고유 번호를 할당하여 번호 순서대로 자원을 할당 받도록

회피

  • 은행원 알고리즘 → 최소한 고객 한 명에게 대출해줄 금액은 항상 은행이 보유하고 있어야 한다
    : 교착 상태에 빠질 가능성이 있는지 판단하기 위해 상태를 안전 상태와 불안전 상태로 나누고, 안전 상태를 유지할 수 있는 요구만을 수락하고, 불안전 상태를 초래할 수 있는 사용자의 요구는 만족될 수 있을 때까지 계속해서 거절하는 방법.

회복

  • 프로세스 종료

    • 교착 상태의 프로세스 모두 종료
    • 교착상태가 해결될 때까지 한 프로세스씩 중지
  • 자원 선점

    • 프로세스들로부터 자원을 빼앗아 교착상태가 해결될 때까지 다른 프로세스들에게 자원을 할당




references
👉 https://chanhuiseok.github.io/posts/cs-2/
👉 https://velog.io/@smallcherry/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-Deadlock%EA%B5%90%EC%B0%A9%EC%83%81%ED%83%9C%EC%9D%98-%EC%A0%95%EC%9D%98%EC%99%80-%ED%95%84%EC%88%98%EC%A1%B0%EA%B1%B4-%EC%98%88%EB%B0%A9-%ED%9A%8C%ED%94%BC-%ED%9A%8C%EB%B3%B5-%EA%B8%B0%EB%B2%95 👉 https://jhnyang.tistory.com/102