[운영체제] 데드락(Deadlock, 교착 상태)이란?

이민우·2024년 3월 19일

CS_운영체제

목록 보기
8/14

데드락(Deadlock, 교착 상태)이란?


📌데드락(Deadlock)

운영체제에서 데드락(교착상태)이란, 시스템 자원에 대한 요구가 뒤엉킨 상태입니다.

즉, 둘 이상의 프로세스가 다른 프로세스가 점유하고 있는 자원을 서로 기다릴 때 무한 대기에 빠지는 상황을 일컫습니다.

👨‍💻 데드락(Deadlock)의 발생조건

데드락이 발생하기 위한 조건은 크게 4가지로 말할 수 있습니다.

  • 상호 배제
    한 번에 프로세스 하나만 해당 자원을 사용할 수 있다. 사용 중인 자원을 다른 프로세스가 사용하려면 요청한 자원이 해제될 때까지 기다려야 한다.
  • 점유 대기
    자원을 최소한 하나 보유하고, 다른 프로세스에 할당된 자원을 점유하기 위해 대기하는 프로세스가 존재해야 한다.
  • 비선점
    이미 할당된 자원을 강제로 빼앗을 수 없다(비선점).
  • 순환 대기
    대기 프로세스의 집합이 순환 형태로 자원을 대기하고 있어야 한다.

👨‍💻 데드락(Deadlock)의 해결법


데드락의 해결법을 크게 3가지로 분류할 수 있습니다.

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

🚀 데드락 예방(Prevention)

데드락의 발생조건 4가지 중 하나라도 발생하지 않게 하는 것이 데드락을 예방하는 방법입니다. 즉, 각각의 조건을 방지(부정)하여 데드락 발생 가능성을 차단합니다.

  • 자원의 상호 배제 조건 방지 : 한 번에 여러 프로세스가 공유 자원을 사용할 수 있게 합니다.

    • 그러나 추후 동기화 관련 문제가 발생할 수 있습니다.
  • 점유 대기 조건 방지 : 프로세스 실행에 필요한 모든 자원을 한꺼번에 요구하고 허용할 때까지 작업을 보류해서, 나중에 또다른 자원을 점유하기 위한 대기 조건을 성립하지 않도록 합니다.

  • 비선점 조건 방지 : 이미 다른 프로세스에게 할당된 자원이 선점권이 없다고 가정할 때, 높은 우선순위의 프로세스가 해당 자원을 선점할 수 있도록 합니다.

  • 순환 대기 조건 방지 : 자원을 순환 형태로 대기하지 않도록 일정한 한 쪽 방향으로만 자원을 요구할 수 있도록 합니다.

이러한 조건을 방지해서 데드락을 예방하는 방법은 시스템의 처리량이나 효율성을 떨어트리는 단점이 발생할 수 있습니다.

다음에 살펴볼 데드락 회피법은 예방법보다는 조금 덜 제한적인 방법으로 예방법의 단점을 일부 해결할 수 있습니다.


🚀 데드락 회피(Avoidance)

데드락 회피법에서는 `Safe sequence, Safe state 등이 키워드입니다.

시스템의 프로세스들이 요청하는 모든 자원을, 데드락을 발생시키지 않으면서도 차례로 모두에게 할당해 줄 수 있다면 안정 상태(safe state)에 있다고 말합니다.

그리고 이처럼 특정한 순서로 프로세스들에게 자원을 할당, 실행 및 종료 등의 작업을 할 때 데드락이 발생하지 않는 순서를 찾을 수 있다면, 그것을 안전 순서(safe sequence)라고 부릅니다.

반면 불안정 상태는 안정 상태가 아닌 상황을 말합니다. 즉, 데드락 발생 가능성이 있는 상황이며, 교착 상태(데드락)는 불안정 상태일 때 발생할 수 있습니다. 불안정 상태가 교착 상태보다 좀 더 큰 집합입니다.(즉, 교착 상태가 불안정 상태의 부분집합)

이처럼 회피 알고리즘은 자원을 할당한 후에도 시스템이 항상 Safe state에 있을 수 있도록 할당을 허용하자는 것이 기본 특징입니다.

이러한 특징을 살린 알고리즘으로 유명한 것이 은행원 알고리즘 입니다.

🔑 은행원 알고리즘(Banker’s Algorithm)

다익스트라가 제안한 기법으로, 어떤 자원의 할당을 허용하는지에 관한 여부를 결정하기 전에, 미리 결정된 모든 자원들의 최대 가능한 할당량을 가지고 시뮬레이션 해서 Safe state에 들 수 있는지 여부를 검사합니다. 즉 대기중이 다른 프로세스들의 활동에 대한 교착 상태 가능성을 미리 조사하는 것입니다.

교착 상태 회피의 문제점

  • 프로세스 자신이 사용할 모든 자원을 미리 선언해야 한다.
    • 모든 프로세스가 자신이 사용할 자원을 미리 선언해야 하는데 이는 쉬운일이 아니다
  • 시스템 전체 자원수가 고정되어야 한다.
    • 은행원 알고리즘에서 안정, 불안정 상태를 파악하려면 시스템의 전체 자원수가 고정적이어야 한다. 그러나 일시적인 고장이나 새로운 자원이 추가되는 일이 빈번하므로 시스템의 자원 수가 유동적..
  • 자원 낭비
    • 모든 불안정 상태가 교착 상태가 되는 것은 아님에도 불구하고 자원을 할당하지 않는 것은 자원 낭비

🚀 데드락 검출(Detection) 및 회복(Recovery)

교착 상태 회피는 실제로 구현이 어렵고, 구현할 수는 있지만 자원을 낭비하는 문제가 있다. 따라서 가장 현실 적인 교착 상태 해결 방법은 교착 상태 검출이다.
먼저 시스템이 데드락 예방이나 회피법을 사용하지 않았을 때, 데드락이 발생할 수 있으니 여기에서 회복하기 위해 데드락을 검출하고, 회복하는 알고리즘을 사용합니다.

  • 탐지 기법
    • 타임 아웃을 이용한 교착 상태 검출
      • 타임아웃을 이용한 교착 상태 검출은 일정 시간 동안 작업이 진행되지 않은 프로세스를 교착상태가 발생한 것으로 간주하여 처리하는 방법
      • 단점
        • 엉뚱한 프로세스가 종료될 수 있다.
        • 모든 시스템에 적용할 수 없다
          • 여러 군데에 데이터가 나뉘어 있는 분산 DB는 데이터가 여러 시스템에 나뉘어 있고 각 시스템이 네트워크에 연결되어 있어 프로세스의 응답이 없는 것이 교착 상태 때문인지, 네트워크 때문인지 단순히 처리가 늦어지는 것이 정확히 알수 없다.
    • 자원 할당 그래프를 이용한 검출

업로드중..

  • 회복 기법

    데드락을 탐지 기법을 통해 발견했다면, 순환 대기에서 벗어나 데드락으로부터 회복하기 위한 방법을 사용합니다.

    • 단순히 프로세스를 1개 이상 중단시키기

      • 교착 상태에 빠진 모든 프로세스를 중단시키는 방법 : 계속 연산중이던 프로세스들도 모두 일시에 중단되어 부분 결과가 폐기될 수 있는 부작용이 발생할 수 있음

      • 프로세스를 하나씩 중단 시킬 때마다 탐지 알고리즘으로 데드락을 탐지하면서 회복시키는 방법 : 매번 탐지 알고리즘을 호출 및 수행해야 하므로 부담이 되는 작업일 수 있음

    • 자원 선점하기
      프로세스에 할당된 자원을 선점해서, 교착 상태를 해결할 때까지 그 자원을 다른 프로세스에 할당해 주는 방법

정리

💡 데드락에 대해 설명해주세요.

둘 이상의 프로세스들이 자원을 점유한 상태에서 서로 다른 프로세스가 점유하고 있는 자원을 요구하며 무한정 기다리는 상황을 말합니다.예를 들어, 자원 A를 가진 프로세스 P1과 자원 B를 가진 프로세스 P2가 있을 때, P1은 B를 필요로 하고 P2는 A를 필요로 한다면 두 프로세스는 서로 자원을 얻기 위해 무한정 기다리게 됩니다.
데드락의 4가지 조건
  • 비선점 (Nonpreemptive) : 다른 프로세스의 자원을 뺏을 수 없음.
  • 순환 대기 (Circular wait) : 두 개 이상의 프로세스가 자원 접근을 기다릴 때, 관계가 순환적 구조.
  • 점유 대기 (Hold & Wait) : 공유 자원에 대한 접근 권한을 가진 채로 다른 자원에 대한 접근 권한을 요구.
  • 상호 배제(Mutual Exclusion) : 한 번에 한 프로세스만 공유 자원에 접근 가능하며, 접근 권한이 제한적일 경우.

참고

https://github.com/gyoogle/tech-interview-for-developer

profile
백엔드 공부중입니다!

0개의 댓글