DeadLock : 교착상태

eunsol Jo·2021년 11월 15일
0

⚙️  os

목록 보기
3/4
post-thumbnail

DeadLock?

  • 시스템의 잘못된 자원 관리로 멀티프로그래밍 환경에서 멈춰 버리는 현상
  • 다른 프로세스가 점유하고 있는 자원을 기다리면서 둘 이상의 프로세스가 무한대기에 빠지는 상태

교착상태 필요조건

  1. 상호배제(Mutual exclusion) : 자원은 한 프로세스에 의해서만 점유가능
  2. 점유대기(Hold and wait) : 최소한 하나의 자원을 점유한 상태에서, 다른 프로세스가 점유한 자원을 기다리는 프로세스가 존재해야함
  3. 비선점(No preemption) : 다른 프로세스가 점유한 자원은 강제로 빼앗을 수 없음
  4. 순환대기(Circular wait) : 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있음

→ 위 조건들을 모두 만족해야 발생하며, 이들은 완전 독립적인 조건은 아니다. 순환대기=점유대기+비선점

교착상태 해결방법

1. 예방기법(Prevention)

  • 상호배제 조건의 제거 : 자원을 여러 프로세스가 공유 가능하게 처리
  • 점유와 대기 조건의 제거 : 프로세스 수행전 모든 필요자원을 할당 & 자원이 점유되지 않은 상태에서만 자원을 요구하게함
    → 자원 과다사용, 필요자원 파악을 위한 비용, 기아상태, 무한대기 등의 문제점 발생
    • 기아상태(Starvation) : 우선순위가 낮아서 자원을 계속 할당 받지 못하는 상태
  • 비선점 조건의 제거 : 다른 프로세스가 점유한 자원에 대해 우선순위에 따라 선점을 할 수 있게 처리
  • 순환형 대기 조건의 제거 : 자원 유형에 따라 순서를 매겨 순환되지 않게 처리

→ 교착상태의 필요조건 하나를 제거함으로서 해결. 자원 사용의 효율성이 떨어지고 비용이 많이 드는 문제점이 있다.

2. 회피기법(Avoidance)

  • 크게 두 가지 알고리즘이 있다.
    • 자원 할당 그래프 알고리즘 (Resource Allocation Graph Algorithm)
    • 은행원 알고리즘 (Banker's algorithm) : 각 프로세스들의 점유/필요 자원 상태와 시스템에 여유 자원을 파악하여, 데드락이 걸리지 않게끔 자원 점유 순서를 준다. (다익스트라 알고리즘)
  • 현재 시스템의 자원 할당 상태를 알아야 한다.

안전상태(Safe state) : 데드락을 발생시키지 않으면서 모든 프로세스를 처리하는 상태
안전순서(Safe sequence) : 데드락이 발생하지 않는 프로세스 순서를 찾을 수 있는 상태

3. 발견/회복기법(Detection)

발견기법(Detection)

  • 현재 시스템의 자원 할당 상태를 통해 교착상태 발생을 발견
  • 알고리즘 or 자원 할당 그래프

회복기법(Recovery)

  1. 프로세스 종료 :
    1) 데드락이 걸린 모든 프로세스 중단 → 모든 작업에 대한 결과가 폐기됨
    2) 하나씩 중단 후 데드락을 재탐지 → 재탐지 비용발생
  2. 자원 선점 : 프로세스에 할당된 자원을 선점해 다른 프로세스에 할당

→ 이 역시 성능에 큰영향을 줄 수 있다.

Pessimistic Lock & Optimistic Lock

Pessimistic Lock

  • 비관적락
  • 선점락
  • 먼저 선점한 자원을 다른 프로세스가 사용하지 못하도록 하는것
  • 무결성에서 낙관적락 보다 우수하나, 교착상태가 발생할 수 있다.
  • DB의 SELECT FOR UPDATE 방식
    *가장 먼저 LOCK을 획득한 SESSION에서 SELECT 된 ROW가 UPDATE후 COMMIT되기 전 까지 다른 SESSION이 ROW를 수정하지 못하도록 하는 것

Optimistic Lock

  • 낙관적락
  • 비선점락
  • 자원을 선점하지 않고, version을 부여하는 방식을통해 데이터의 정합성을 맞춘다.
    *update {table_name} set version = version+1, {colums...} where version = read시 가져온 버전and {condition...}
    과 같이 관리를 하면, update전 다른 프로세스에 의해 수정이 발생 하였다면 적용로우 0로 리턴됨
  • version은 날짜, 타임스탬프, 해시등의 방식을 사용한다.
  • JPA(hibernate)에서는 위와같은 상황에서 Optimistic Lock Execption을 발생시킨다.

DeadLock In DB

DeadLock을 줄이기 위해서는 다음과 같은 방법들이 있다.

1) 인덱스를 설정한다. 인덱스가 없으면 Lock이 걸리는 범위가 훨씬 넓어지기 때문에 교착상태가 발생하기 쉬워진다.
2) 자원들을 한쪽으로 사용한다. A와 B라는 테이블이 있다면 모든 세션에서 A->B 순서로 사용하도록 한다.
3) 트랜잭션은 가급적이면 짧게 만든다.
4) 테이블의 크기를 작게 쪼갠다. (정규화)
5) Transaction Isolation Level을 "Read Uncommitted"로 설정한다.

Reference

profile
Later never comes 👩🏻‍💻

0개의 댓글