STUDY/운영체제

[운영체제] 데드락(Dead lock)

디리릭 2022. 2. 13. 23:24
728x90

 

데드락(교착상태)이란, wait 상태인 thread 혹은 프로세스가 다시 자기 상태를 바꾸지 못하는 상태를 뜻한다. 즉 대기만 무한히 하는 상태를 말한다. 

 

 데드락의 충족 조건은 4가지이다. 

  • Mutual Exclusion (상호 배제)
    자원은 한 번에 한 프로세스만 사용할 수 있어야 한다. 
  • Hold and wait (점유 & 대기)
    최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해서는 대기상태인 프로세스가 있다.
  • No preemption (비선점)
    다른 프로세스에 할당 된 자원은 강제로 빼앗을 수 없다. 
  • Circular wait (순환 대기)
    프로세스의 집합이 순환하며 점유 & 대기를 하야한다. 

 

그러면 데드락을 어떻게 핸들링 해야할까?

  • ignore
    (그럼 속이 편~하지 😇)
    예방 또는 회피하는 로직이 성능에 큰 영향을 끼칠 수 있다. 데드락이 발생하는 빈도가 매우 낮아 그냥 무시할 수 있다. 
  • prevent
    데드락이 충족되는 4가지 조건을 중 하나만 막으면 데드락 발생 가능성을 차단할 수 있다. 
    방법은 아래와 같다. 
    • Mutual Exclusion -> 고려하지 말자! 하기 힘드렁
    • Hold and wait -> 점유를 위해 wait 상태를 만들지 않도록, 점유된 프로세스의 작업이 끝나면 모든 프로세스를 다 내려놓고 다시 점유하도록 한다. 
    • No preemption -> 높은 우선순위의 프로세스가 해당 자원을 선점할 수 있도록 한다. 
    • Circular wait -> 자원 순서를 매기자, 일정한 한쪽 방향으로만 자원을 요구하도록 한다. 
    그러나 실용적이지 않고 거의 불가능하다고 볼 수 있다. 
  • avoid
    데드락을 회피하기 위해서는 차례로 모두에게 할당 할 수 있는 안정 상태에 있다면 가능하다. 
    Bank's Algorithm 등을 이용하여 안정상태를 갖출 수 있다. 
  • detect, recover
    데드락을 탐지하고 이를 회복시키는 순서로 진행된다. 
    데드락 탐지는 현재 시스템의 자원 할당 상태로 파악할 수 있다. (Bank's Algorithm처럼)

    데드락에서 순환 대기 조건을 탈피하여 회복시키는 방법이 있다.

     

 

728x90