본문 바로가기
CS/OS(운영체제)

데드락(Deadlock)

by 계범 2022. 1. 5.
운영체제 관련 글 순서

- 프로세스란
- 쓰레드
- CPU 스케줄링
- 동기화 툴
- 동시성 제어 예제
- 데드락
- 주 메모리
- 페이징과 스와핑
- 가상 메모리와 디맨드 페이징
- 페이지 교체 알고리즘(FIFO, OPT, LRU), 쓰레싱, working set

 

 

 

데드락이란?

: 두개 이상의 프로세스(쓰레드)가 서로 상대방의 작업이 끝나기만을 기다리고 있어서 무한 대기에 빠지는 상황.

 

데드락 예시코드

 

데드락이 발생하는 조건

  1. 상호배제(Mutual Exclusion) : 자원은 한 프로세스만이 사용 가능
  2. 점유대기(Hold and Wait) : 한 개이상의 자원을 점유하고 있으면서 다른 프로세스가 점유하고 있는 자원을 점유하기 위해 대기
  3. 비선점(No preemption) : 다른 프로세스가 자원의 사용을 끝내기전까진 뺏을 수 없음
  4. 순환대기(Circular Wait) : 서로 순환하여 자원을 얻기 위해 대기

4가지가 다 만족해야 데드락이 발생한다.

 

Resource-Allocation Graph(RAG:자원할당 그래프)

  • 데드락을 정확하고 쉽게 알아보기 위한 그래프
  • 쓰레드의 집합을 T
  • 자원의 집합을 R
    • 여기선 순환대기 사이클이 없기 때문에 데드락 발생하지 않음.
    • 순환대기 사이클이 존재하고 해당 그래프에선 데드락 발생
    • 순환대기 사이클이 존재하지만 해당 그래프에선 데드락 발생하지않음.
    • T2 또는 T4가 작업이 끝나고 자원의 인스턴스를 반환해주면 해결되기 때문.

 

데드락 해결 방법

  • 데드락 발생여부를 신경쓰지 않고 프로그래밍
  • 데드락을 방지하거나 데드락을 피할 수 있게 하는 방법.
  • 데드락이 발생했을때, 알림을 통해 회복시켜주는 방법.

 

데드락을 예방하는 방법

  • 위에서 말했던 4가지 조건 중에 한가지를 방지하는 방법
    • 상호배제 방지
      • 모든 리소스가 공유 가능하게 만들면 데드락이 발생하지 않음.
      • 이건 말이 안되는게 뮤텍스로 동기화 시에 일어날 문제들을 막고, 뮤텍스는 공유가 가능하면 안된다.
    • 점유대기 방지
      • 쓰레드가 어떤 리소스를 획득하기위해선 다른 리소스를 내려 놓기.
    • 선점
      • 쓰레드가 어떤 리소스를 요청할때, 다른 쓰레드가 그 리소스를 사용중이다면 선점하기
    • 순환대기 방지
      • 자원이 순환 형태로 대기하지 않게 일정한 방향으로만 자원을 요구.
      • 각 리소스에게 순서를 정해두고 점유하고 있는 리소스보다 높은 리소스만 요청.
  • 이 방법들은 현실적으로 불가능하거나 시스템의 처리량 또는 효율성을 떨어트림.

 

데드락 회피방법

  • 요청이 왔을때 받아주기 전에 데드락이 걸릴지 확인하고, 걸릴 것 같다면 기다리는 것.
  • Safe State
    • 프로세스들이 요청하는 모든 자원을 데드락이 발생시키지않게 모두에게 할당 가능한 상태
    • 데드락이 발생하지 않는 순서를 안전순서(safe sequence) 라고 부름
  • Unsafe State
    • 데드락이 걸릴 수도 있는 상태
  • 회피하는 방법은 Safe State에만 있어서, 데드락에 걸릴 상황자체를 가지 않는 것.
  • 대표적인 알고리즘이 Banker's Algorithm

Banker's Algorithm

  • 다익스트라 알고리즘을 개발하신 다익스트라씨가 개발한 알고리즘
  • Safety Algorithm을 통해 요청을 받아들이거나 했을때 safe state 인지 미리 확인 하는 알고리즘.

Safety Algorithm

  • 모든 자원들의 최대 할당량을 가지고 각 쓰레드의 요구량과 비교하여 safe sequence를 찾고 safe state인지 확인하는 알고리즘.
  • 자료구조
    • 쓰레드(T)의 개수가 N , 리소스(R)의 개수 M개일 때
    • Available: 리소스 타입 별 현재 사용할 수 있는 개수
    • Max: 각 스레드가 요청할 리소스의 최대개수
    • Allocation: 쓰레드에 할당된 리소스
    • Need: 각 스레드가 추가적으로 요청할 리소스
    • 맥스값을 통해 각 쓰레드별 추가적으로 필요한 리소스(need)를 구할 수 있음.
    • To 쓰레드 기준
      • 현재 할당된 리소스(Allocation) A: 0, B: 1. C: 0
      • 최종 요구하는 리소스 개수(Max) A: 7, B: 5, C: 3
      • 할당된 리소스 제외 필요한 리소스 개수(need) A: 7, B: 4, C: 3
    • 위와 같이 need가 구해짐
    • 이때, 쓰레드별로 가능한지 확인하는 방법은 Need 각각의 숫자가 Availavle보다 작거나 같으면 가능.
    • 각 쓰레드별로 가능한지 Boolean 배열
      {false,false,false,false,false}
      
      
      T(o) Need = 7 4 3
      Available = 3 3 2 불가
      T(1) Need = 1 2 2
      Availabe =  3 3 2 가능
      
      가능할때 계산 시작
      T(1)에 자원을 할당하여 끝냈다는 가정하에
      T(1)에 할당되어있던 자원이 해제되고 Available에 합류됨
      Available = Available + Allocation
      Available = 5 3 2
      T(1)은 끝. 
      {true,false,false,false,false}
      
      T(2) Need = 6 0 0
      Available = 5 3 2 불가
      T(3) Need = 0 1 1
      Available = 5 3 2 가능 t(3)의 Allocation 2 1 1
      Available = 7 4 3
      {t,f,t,f,f}
      ...
      
      계속 진행하면 전부 가능한지 파악 가능 {t,t,t,t,t}
      Safe sequence는 <T(1),T(3),T(4),T(2),T(0)> 또는 <T(1),T(3),T(4),T(0),T(2)>

Resource-Request Algorithm

  • 새로운 요청이 들어왔을때 데드락이 발생하는지 확인하는 알고리즘
  • 새로운 요청이 왔을때 요청 리소스의 수(Request)가 Available 보다 작거나 같을때 Need,Allocation,Available을 변경해준 뒤에 Safety Algorithm 적용

Banker's Algorithm 단점

  • 프로세스 별 최대 자원 요구량을 알고 있어야함.
  • 할당할 수 있는 자원 수가 일정해야함.
  • 무조건 불완전 상태(Unsate State)를 방지해야해서 자원 이용도가 하락

 

 

데드락 감지 방법(Detection)

  • 리소스 타입의 자원이 1개일때, wait for graph 구성
    • 오른쪽이 wait-for graph. 여기서 상호대기가 일어날만한 사이클이 존재하는지 확인 가능.
  • 리소스 타입의 자원이 여러개일땐, 뱅커스 알고리즘과 비슷한 구조로 확인.
  • 기존엔 다 true여서 데드락이 없을때만 진행하지만, 몇개 false여도 데드락을 발견하고 진행한다.
  • 단점
    • 데드락 감지 방법도 호출 시 오버헤드가 있기때문에 빈도를 조절해야함
    • 감지 방법을 사용할때 고려사항
      • 교착 상태가 얼마나 자주 일어나는가?
      • 교착 상태가 일어나면 몇개의 쓰레드가 데드락에 포함되는가?
    • 예시와 같은 상황에 호출
      • 자원 요청했는데 즉시 할당 실패했을때
      • 일정시간마다
      • CPU 이용률이 특정 값 이하로 떨어질때

 

데드락 회복 방법

  • 데드락(교착 상태)가 발생 했을 때 복구방법
  • 프로세스 종료(Termination)
    • 방법1: 교착 상태의 프로세스 모두 중지
    • 방법2: 교착 상태 제거될 때까지 한개씩 프로세스 중지
  • 자원 선점(Resource Preemption)
    • 최소한의 피해를 주는 프로세스를 선택(희생자 선정)
    • 선정된 프로세스의 자원을 해제하고 safe state로 롤백 및 재시작
    • 매번 선정되는 프로세스는 기아현상이 발생할 수 있으므로, 선점 될때마다 우선순위를 높여서 해결

참조

주니온님의 인프런 운영체제강의(공룡책)

탐지 알고리즘, 데드락 회복방법 참조 블로그: yoongrammer

'CS > OS(운영체제)' 카테고리의 다른 글

페이징과 스와핑  (0) 2022.01.07
주 메모리(Main Memory)  (0) 2022.01.07
동시성 제어 예제(Bounded-Buffer, Readers-Writers  (0) 2022.01.05
동기화 툴(프로세스 동기화)  (0) 2022.01.05
CPU 스케줄링  (0) 2022.01.05

댓글