Search

데드락 해결방법

class
운영체제
상태
완료
날짜
목차

데드락 해결방법

이전 주제인 데드락에서 배운 것처럼, 데드락은 여러 프로세스 또는 쓰레드를 영원히 대기 상태로 만드는 위험한 상황입니다.
따라서, 데드락이 발생하지 않도록 개발자의 노력이 필요합니다.
이 페이지에서는 데드락 해결을 위한 다양한 방법에 대해 공부하겠습니다.

데드락 해결방법의 종류

1. 데드락 예방

데드락 예방 방법은 데드락의 네 가지 필요 조건(상호 배제, 점유 대기, 비선점, 순환 대기) 중 최소 하나를 만족하지 않도록 시스템을 설계함으로써 데드락 발생 자체를 차단하는 방식입니다.
상호 배제 : 자원은 한 번에 하나의 프로세스만 사용할 수 있습니다. 상호 배제 조건을 제거하기는 어렵지만, 가능한 경우 자원을 공유 가능하게 만들어 이 조건을 완화할 수 있습니다.
상호 배제 조건의 단점
자원 공유의 제한성 : 특정 자원은 본질적으로 공유가 불가능하며, 상호 배제를 완화하거나 제거하는 것이 불가능할 수 있습니다. 예를 들어, 프린터와 같은 하드웨어 자원은 동시에 여러 프로세스에 의해 안전하게 공유될 수 없습니다.
일관성 유지 문제 : 자원을 공유하게 할 경우, 데이터의 일관성과 무결성을 유지하기 위한 추가 메커니즘이 필요합니다. 최악의 경우 데이터의 일관성과 무결성을 유지할 수 없을 수도 있습니다.
점유 대기 : 프로세스가 자원을 보유한 채로 다른 자원을 대기할 수 있습니다. 이를 방지하기 위해 프로세스가 실행되기 전에 필요한 모든 자원을 한 번에 할당받도록 하여 점유 대기 조건을 없애거나, 자원을 요청할 때는 보유하고 있는 자원을 모두 해제하고 요청하도록 하는 방법이 있습니다.
점유 대기 조건의 단점
자원 활용도 저하 : 프로세스가 실행 전에 모든 필요 자원을 한 번에 할당받도록 하면, 일부 자원이 실제로 사용되지 않는 시간 동안 불필요하게 점유될 수 있습니다. 이는 전체 시스템의 자원 활용도를 저하시킬 수 있습니다.
시작 시 자원 요구량 파악의 어려움 : 프로세스가 실행되기 전에 모든 필요 자원을 요구하도록 하는 것은 실제로 실행 시간에 필요한 자원의 양을 정확히 예측하기 어렵다는 문제를 가집니다. 이는 자원 할당의 비효율성을 초래할 수 있습니다.
비선점 : 한 프로세스가 어떤 자원을 사용 중일 때, 다른 프로세스가 그 자원을 강제로 빼앗을 수 없습니다. 비선점 조건을 제거하기 위해, 필요하다면 운영 시스템이 자원을 강제로 회수하여 다른 프로세스에게 할당할 수 있는 메커니즘을 도입합니다.
비선점 조건의 단점
시스템 성능 저하 : 운영 시스템이 프로세스로부터 자원을 강제로 회수하고 다른 프로세스에게 할당하는 메커니즘은 추가적인 오버헤드를 발생시킵니다. 이는 특히 자원의 선점과 재할당이 빈번히 발생할 때 시스템 성능을 저하시킬 수 있습니다.
심지어 위의 강제 회수 과정에서 해당 프로세스를 종료시킬 수도 있습니다.
데이터 일관성 위험: 자원을 강제로 선점할 경우, 작업 중이던 프로세스의 데이터가 일관성 없는 상태로 남을 수 있습니다. 이는 데이터 손실이나 무결성 문제를 일으킬 수 있습니다.
순환 대기 : 프로세스의 집합 {P1, P2, ..., Pn}에서 P1은 P2가 가진 자원을 대기, P2는 P3가 가진 자원을 대기, ..., Pn은 P1이 가진 자원을 대기하는 순환 형태의 대기가 발생합니다. 순환 대기 조건을 제거하기 위해 자원에 고유 번호를 부여하고, 프로세스가 번호 순서대로 자원을 요청하도록 함으로써 순환 대기를 방지할 수 있습니다.
순환대기 조건의 단점
자원 할당 순서의 제약 : 자원에 고유 번호를 부여하고 프로세스가 번호 순서대로 자원을 요청하도록 하는 것은 자원 할당의 유연성을 크게 제한합니다. 특히, 복잡한 자원 할당 요구 사항을 가진 시스템에서 이러한 접근 방식은 비효율적일 수 있습니다.
관리 오버헤드 증가 : 자원 할당 순서를 관리하고 강제하는 데 추가적인 관리 오버헤드가 발생합니다. 이는 시스템의 복잡성을 증가시키며, 실수로 인한 오류 발생 가능성을 높일 수 있습니다.

2. 데드락 회피

데드락 회피는 시스템이 데드락에 빠지지 않는 안전 상태를 유지하도록 자원 할당 결정을 신중하게 하는 방법입니다.
안전 상태(Safe State)
시스템이 안전 상태에 있을 때, 그것은 시스템이 현재의 자원 할당 상태에서 모든 프로세스가 자신의 최대 자원 요구량까지 필요한 모든 자원을 순서적으로 할당받아 정상적으로 완료될 수 있는 순서가 존재함을 의미합니다. 즉, 어떤 순서로 프로세스가 자원을 요청하더라도 시스템이 데드락에 빠지지 않고, 모든 프로세스가 자신의 작업을 성공적으로 마칠 수 있는 상태를 말합니다.
안전 상태는 데드락이 발생하지 않음을 보장하지만, 모든 안전 상태가 효율적인 자원 사용을 의미하는 것은 아닙니다. 다만, 시스템이 안전 상태에 있으면, 어떤 자원 할당 요청에 대해서도 데드락 없이 자원을 할당할 수 있는 방법이 존재함을 의미합니다.
불안전 상태(Unsafe State)
불안전 상태는 시스템이 현재의 자원 할당 상태에서 데드락을 유발하지 않는 특정한 프로세스 실행 순서가 존재하지 않는 상태를 말합니다. 이 상태에서는 시스템이 데드락에 빠질 가능성이 있으며, 자원 할당 요청에 따라 데드락으로 이어질 수 있습니다.
불안전 상태가 반드시 데드락을 의미하지는 않습니다. 즉, 시스템이 불안전 상태에 있을 때 데드락으로 진행될 수도 있지만, 실제로는 데드락 없이 실행이 계속될 수도 있습니다. 하지만 불안전 상태에서는 데드락을 회피할 수 있는 모든 가능성을 보장할 수 없습니다.
뱅커스 알고리즘은 데드락 회피를 위한 대표적인 알고리즘으로, 각 프로세스가 최대로 요구할 수 있는 자원의 양을 미리 알고 있을 때 사용할 수 있습니다.
뱅커스 알고리즘
뱅커스 알고리즘의 핵심은 시스템이 항상 '안전 상태(Safe State)'에 있도록 하는 것입니다. 안전 상태란 모든 프로세스가 요구할 수 있는 최대 자원에 대해 요청하더라도, 그 요구를 모두 충족시킬 수 있어 결국 모든 프로세스가 완료될 수 있는 상태를 말합니다.
뱅커스 알고리즘 주요 요소 설명.
1.
가용 자원 : 시스템에서 사용 가능한 각종 자원의 수량.
2.
최대 요구량 : 각 프로세스가 완료될 때까지 필요로 하는 각 자원의 최대 수량.
3.
할당량 : 현재 각 프로세스에 할당된 각종 자원의 수량.
4.
요구: 각 프로세스가 현재 상태에서 완료될 때까지 추가로 필요로 하는 자원의 수량. 이는 최대 요구량과 현재 할당량의 차이로 계산됩니다.
뱅커스 알고리즘의 실행 과정
1.
안전성 검사: 시스템이 프로세스의 자원 요청을 수락할 때마다, 그 요청이 시스템을 안전 상태로 유지할 수 있는지를 검사합니다. 만약 요청이 안전 상태를 유지할 수 있다면, 요청을 승인하고 자원을 할당합니다. 그렇지 않다면, 요청을 거부하거나 대기 상태로 전환합니다.
2.
자원 요청: 프로세스가 실행 중에 추가 자원을 요청할 경우, 시스템은 요청된 자원이 '요구'를 초과하지 않는지, 그리고 요청을 승인해도 여전히 안전 상태를 유지할 수 있는지를 검사합니다.
3.
자원 할당 : 안전성 검사를 통과하면, 시스템은 요청된 자원을 프로세스에 할당합니다. 할당 후에도 시스템은 안전 상태를 유지해야 합니다.
4.
자원 반납 : 프로세스가 작업을 마치고 자원을 반납하면, 시스템은 해당 자원을 가용 자원 풀에 다시 추가합니다.
데드락 회피 방법의 단점
알고리즘의 복잡성: 데드락 회피, 특히 뱅커스 알고리즘 같은 기법은 상당한 계산 비용을 요구하며, 프로세스의 자원 요구량을 미리 알아야 합니다. 이는 동적으로 변화하는 실제 시스템 환경에서는 구현하기 어렵고, 관리하기가 복잡합니다

3. 데드락 탐지 및 복구

데드락 탐지 및 복구 방법은 시스템에서 데드락을 주기적으로 검사하고, 데드락이 발생했다는 것을 탐지한 후, 데드락을 해결하기 위해 특정 프로세스를 중지시키거나 롤백하는 방법입니다.
실질적으로 많은 시스템은 데드락 탐지 및 복구방법을 선호합니다. 이는 시스템의 자원 활용도와 유연성을 유지하면서도 데드락을 효과적으로 처리할 수 있는 방법이기 때문입니다. 데드락이 자주 발생하지 않는 시스템에서는 탐지 후 복구하는 비용이 예방이나 회피를 위한 높은 자원 활용 비효율성보다 낮을 수 있습니다.
가벼운 교착 상태 검출
가벼운 교착 상태 검출 방법은 시스템에 미치는 오버헤드가 상대적으로 적은 방식으로 데드락을 탐지하는 접근법입니다. 이 방법은 일반적으로 데드락 가능성이 낮은 시스템, 또는 데드락의 영향이 비교적 덜 심각한 환경에서 사용됩니다
가벼운 교착 상태 검출 특징
낮은 오버헤드 : 주기적인 탐지 알고리즘의 실행 빈도가 낮거나, 탐지 알고리즘 자체가 가볍습니다.
간단한 알고리즘 : 자원 할당 그래프와 같은 간단한 메커니즘을 사용하여 데드락을 탐지합니다.
제한적인 탐지 : 모든 유형의 데드락을 탐지하지 못할 수도 있으며, 주로 명확한 데드락 상황에 초점을 맞춥니다.
예를 들어, 한 프로세스가 10초 동안 대기 상태인 상황에 따라 해당 프로세스를 종료하거나 자원 할당 전 상태로 되돌리는 방법입니다. 이를 휴리스틱 이론이라고 합니다.
무거운 교착 상태 검출
무거운 교착 상태 검출 방법은 보다 복잡하고, 실행 비용이 높으며, 시스템에 더 큰 오버헤드를 주는 데드락 탐지 방식입니다. 이 방식은 데드락이 빈번하게 발생하거나, 데드락의 영향이 매우 큰 시스템에서 주로 사용됩니다.
무거운 교착 상태 검출 특징
높은 오버헤드 : 데드락 탐지 알고리즘의 실행이 더 빈번하고, 탐지 알고리즘 자체도 더 복잡합니다.
정교한 알고리즘 : 완전한 자원 할당 그래프 분석, 복잡한 자원 할당 이력 추적 등을 포함할 수 있습니다.
포괄적인 탐지 : 다양한 유형의 데드락을 탐지할 수 있으며, 데드락의 원인을 좀 더 정확히 파악할 수 있습니다.