본문 바로가기

CS/운영체제(OS)

DeadLock (교착상태)

728x90
  • DeadLock이 무엇이고 언제 발생하는지 저번 포스팅에서 이야기 했지만 복습해보면
    • 두 개 이상의 프로세스나 스레드가 서로 자원을 얻지 못해서 무한정 대기하는 상태를 교착상태라고 한다. 현실 세계에서 두 차량(프로세스)이 하나의 도로(자원)에 들어가려고 할 때, 둘 중 하나가 양보하지 않는 이상 이 자원에는 누구도 도달할 수 없다.

교착상태의 해결법

  1. 예방
  • 교착상태를 예방하려면 어떻게 해야할까? 교착상태는 4가지 필요조건이 있다. 그렇다면 이 조건 중 하나라도 만족하지 않으면 교착상태는 일어나지 않을 것이다.
    • 상호 배제 부정 : 하나의 자원을 여러 프로세스가 접근 가능 → 현실성 X
    • 점유대기 부정 : 프로세스가 실행 전 모든 자원을 할당, 식사하는 철학자의 경우 수저를 한 번에 듦
    • 선점 가능 : 이미 실행중인 프로세스의 자원을 빼앗아올 수 있음. → 수저 빼았기 가능 현실성 X
    • 순환대기 부정 : 순환대기 상태를 알고리즘으로 끊기
    이 방법은 가능하긴 하지만 현실성이 떨어지며 자원의 활용이 심각하게 저하될 수 있다.
  1. 회피
  • 교착 상태를 자원의 잘못된 승인이라 보고, 불안전한 할당시 거절하는 방법이다. 이것을 은행원 알고리즘이라 한다. 미리 결정된 모든 자원의 최대 가능한 할당량을 가지고 시뮬레이션 하여 안전한지 불안전한지 검사하고 안전하면 할당하는 방식이다.
  • 예시) 은행의 대출 가능 금액은 10원. A, B, C고객이 있음.
    • A는 4원을 빌리고 2원을 빌릴 것
    • B는 4원을 빌리고 1원을 빌릴 것
    • C는 2원을 빌리고 5원을 빌릴 것
      • 그렇다면 A, B, C에게 돈을 빌려주고 나면 남은 돈은 0원인데 A, B ,C 는 추가 대출을 무한이 대기하게 된다. 이러면 불안전 상태로 데드락으로 간주하고 요청을 거절한다.
  1. 검출 및 회복
  • 말 그대로 검출하고 데드락 상태를 회복시킨다는 의미. 여기에는 데드락 탐지, 복구 알고리즘을 사용한다.
    • 탐지
      • Allocation, Request 등으로 데드락 발생 여부를 검사한다. 은행원 알고리즘과 비슷하게 현재 시스템의 자원 할당 상태를 점검한다.
    • 회복
      • 프로세스 중단: 연산중이던 프로세스들도 모두 일시에 중단되어 버릴 수 있어 위험하나 가장 효과적
      • 프로세스를 하나씩 중단시키며 데드락을 탐지하고 데드락이 없을 때 까지 반복
    • 그러나 이 방법은 탐지를 계속 할 수록 오버헤드가 발생하고 회복을 위해 계속 상태를 기억해야하기 때문에 시스템 저하로 이어질 수 있다.
  1. 무시
    • 사실 데드락은 자주 발생하지 않는다. 때문에 무시하는 것도 방법이다. 특히 개인용 PC의 경우는 아주 희귀하게 발생하고 4가지 조건도 필요충분도 아닌 필요조건이기 때문이다.