[CS] 데드락(DeadLock, 교착상태)

giggle·2023년 7월 29일
1

📌 데드락이란?


데드락이란 둘 이상의 프로세스나 스레드가 한정된 자원을 얻지 못해 다음 상태를 진행하지 못하는 상황입니다.

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

ex) DB에서 상호 거래 패턴

📌 데드락 발생조건

상호배제

한 번에 프로세스 하나만 해당 자원을 사용할 수 있다. 사용 중인 자원을 다른 프로세스가 사용하려면 요청한 자원이 해제될 때까지 기다려야 한다.

점유대기

자원을 최소한 하나 보유하고, 다른 프로세스에 할당된 자원을 점유하기 위해 대기하는 프로세스가 존재해야 한다.

비선점

프로세스에 이미 할당된 자원을 강제로 빼앗을 수 없다.

순환대기

대기 프로세스의 집합이 순환 형태로 자원을 대기하고 있어야 한다.

📌 데드락 해결법

데드락 예방

  • 데드락이 발생되지 않도록 사전에 예방하는 방법
  • 네 가지 발생 조건 중 하나를 제거함으로써 해결하는 방법
  • 일반적으로 자원 사용 효율성이 떨어지고 비용이 많이 드는 방법
  1. 상호배제 제거 : 하나의 자원에 둘 이상의 프로세스가 요청 가능 -> 현실적 구현의 어려움
  2. 점유대기 제거 : 프로세스가 필요한 자원을 미리 요청해 할당받은 다음에 작업을 진행 -> 자원을 효율성이 떨어짐, 프로세스가 필요한 자원이 어떤 것인지 확인하는 과정에서 오버헤드 발생
  3. 비선점 조건 제거 : 프로세스가 특정 자원을 요청하기 위해서는 자신이 가지고 있는 자원을 반납 -> 현재까지의 작업을 잃을 수 있다는 단점
  4. 순환대기 제거 : 각각의 자원들에게 고유 번호를 할당하여 특정 프로세스는 오름차순이나 내림차순으로 자원 요청

데드락 회피

  • 데드락을 인정하고 피해가자(ex. 은행원 알고리즘-시스템을 안전,불안전 상태로 구분하고 불안정 상태일 땐 대기)

회피 과정
1. 프로세스가 자원 요청시. 자원을 할당한 후에도 안정 상태로 남아 있는지 사전 검사
2. 안정 상태라면 자원을 할당
3. 불안정 상태라면 다른 프로세스가 자원을 해지할 때까지 대기

또한 회피는 자원을 요청할 때 마다 시스템의 상태를 판단하고 회피하는 전략이므로 오버헤드가 심하게 발생하고 은행원 알고리즘의 경우 전제 조건이 많습니다.

데드락 탐지 및 복구(회복)

데드락이 자주 발생하는 시스템에서 일반적으로 사용하는 방법으로 데드락을 허용하지만 상태를 탐지하고 회복하는 방식입니다.

알고리즘을 주기적으로 실행함으로써, 시스템에 발생한 데드락을 체크하고 회복합니다.

  • 탐지 : 데드락이 존재 여부 및 교착 상태에 연관된 프로세스와 자원을 알아내는 방법입니다.(순환 대기 존재 여부에 초점 / 자원할당 그래프 소거)
  • 복구 : 데드락을 일으킨 프로세스를 종료하거나, 할당된 자원을 해제합니다.
    1. 프로세스 종료 : 데드락의 프로세스를 모두 중지, 데드락이 제거될 때까지 한 프로세스 씩 중지
    2. 자원 선점 : 데드락이 제거될 때까지 프로세스가 점유한 자원을 선점해 다른 프로세스에게 할당

데드락 무시

데드락이 드물게 발생하는 시스템에서 일반적으로 사용하는 방법입니다. (윈도우, 유닉스)

데드락 해결 비용 문제가 더 비효율적이라서 만약 데드락이 발생한다면 사용자가 프로세스를 강제로 종료하거나 시스템을 재부팅하는 방법을 택합니다.


참고


피드백 및 개선점은 댓글을 통해 알려주세요😊

profile
배움을 글로 기록하는 개발자가 되겠습니다.

0개의 댓글