데드락이란?
데드락이란?
두 개 이상의 프로세스가 서로 상대방의 작업이 끝나기만을 기다리는 현상이다.
예를 들어보자.
점원1과 점원2는 계산을 하려고 한다. 점원1은 캐셔를 점유했다. 점원2는 계산할 옷을 점유했다.
점원1은 옷이 필요한 상황이고, 점원2는 캐셔가 필요한 상황이다. 이 상태로는 절대로 결제가 일어날 수 없다.
이런 상황을 데드락이라고 한다.
데드락 발생 조건
데드락이 발생하기 위한 조건은 아랭 네 가지가 모두 성립되어야 한다.
상호 배제
자원은 한 번에 하나의 프로세스만이 사용할 수 있다.
점유 대기
하나의 프로세스가 자원을 점유하고 있고, 다른 프로세스가 점유하고 있는 자원에 요청하고 대기해야 한다.
비선점
다른 프로세스에 할당된 자원은 사용이 끝날 때 까지 강제로 빼았을 수 없다.
순환 대기
대기 프로세스의 집합이 순환 형태로 자원을 대기하고 있어야 한다.
데드락 해결 방법
총 네 가지로 나눌 수 있다.
교착 상태 예방
데드락 발생 조건을 한 개 이상 부정하는 방법이다.
효율성이 떨어지고 비용이 많이 들기 때문에 많이 사용하지 않는다.
- 상호 배제 조건 제거
- 하나의 자원을 같이 사용할 수 있도록 한다.
- 점유 대기 조건 제거
- 프로세스가 필요한 자원을 모두 할당을 받고 시작하는 방법이다.
- 한 번에 모두 점유하기 때문에 다른 프로세스에서 점유하지 못하기에 효율성이 떨어지고,
모두 가져와야 하기 때문에 비용이 많이 드는 단점이 있다.
- 비선점 조건 제거
- 자원을 점유 중인 프로세스가 다른 자원을 요구할 때 기존 자원을 반납하는 것이다.
- 순환 대기 조건 제거
- 자원에 고유 번호를 할당해서 순서대로 자원을 요구하도록 한다.
교착 상태 회피
데드락 발생 가능성을 검사해서 발생 가능성이 있으면 회피
하는 전략이다.
프로세스가 자원 요청 시 데드락이 발생할지 안할지 검사를 사전에 하고, 안전하다면, 할당하고,
불안정하다면, 다른 프로세스가 자원을 해지할 때 까지 대기시키는 방식이다.
사전에 검사를 하므로 비용이 많이든다.
교착 상태 탐지 및 회복
교착 상태를 허용하지만 상태를 주기적으로 감지해서 회복하는 방식이다.
하지만 너무 자주 탐지를 하게 되면, 오히려 교착 상태 회피와 다를게 없어지기 때문에 실행 시간을 고려해야 한다.
회복하는 방식으로는 프로세스 종료와 자원 선점 방식이 있다.
- 프로세스 종료
- 교착 상태의 프로세스를 모두 중지
- 교착 상태가 제거될 때 까지 프로세스를 하나씩 중지
- 모두 중지했을 시 데이터 유실을 유함.
- 자원 선점
- 교착 상태가 제거될 때 까지 자원을 빼았아 다른 프로세스에게 제공
교착 상태 무시
데드락 자체를 무시하고 조치를 하지 않는 방법으로 데드락 발생률이 낮을 경우 사용한다.
정리
- 데드락이란?
- 두 개 이상의 프로세스가 다른 프로세스가 점유하는 자원에 요청하여 대기하는 상태
- 발생 조건
- 점유 대기, 순환 대기, 상호 배제, 비선점
- 해결 방법
- 예방, 회피, 탐지 및 회복, 무시
'기타 IT' 카테고리의 다른 글
OAuth2 개념 이해하기 (0) | 2022.12.18 |
---|---|
인프콘 2022 나의 첫 컨퍼런스! 후기 (4) | 2022.08.27 |
RedisTemplate CastClassException(직렬화, 역직렬화 이슈) (0) | 2022.05.12 |
Spring Data Redis에서 O(N) 명령어인 Keys를 Scan으로 대체하기 (0) | 2022.05.11 |
Redis는 언제 사용해야 할까? (0) | 2022.05.11 |