동시성
동시성(Liveness): 데드락 및 기아
이 섹션은 동시성 시스템에서 발생할 수 있는 주요 문제인 데드락과 기아를 다룹니다. 동시성(Liveness)이란 시스템이 올바른 상태를 유지하며 계속 진행할 수 있는 능력을 의미합니다. 이 능력이 손상되면 데드락이나 기아와 같은 문제가 발생합니다.
데드락 (Deadlock)
데드락은 한 집합의 프로세스들이 다른 집합의 프로세스들이 보유하고 있는 자원을 기다리면서 무한히 대기하는 상황입니다. 즉, 모든 프로세스가 서로가 점유하고 있는 자원을 기다리며 멈춰있는 상태입니다. 동기화 도구인 뮤텍스 락이나 세마포어를 잘못 사용할 때 데드락이 발생할 수 있습니다.
데드락이 발생하기 위한 네 가지 필수 조건은 다음과 같습니다:
상호 배제 (Mutual Exclusion): 최소한 하나의 자원은 한 번에 한 프로세스만 사용할 수 있는 비공유(non-sharable) 모드로 유지되어야 합니다. 예를 들어, 프린터와 같은 자원은 여러 프로세스가 동시에 사용할 수 없으므로 이 조건이 충족됩니다. 공유 모드(read-only) 자원에서는 데드락이 발생하지 않습니다.
점유 및 대기 (Hold and Wait): 자원을 하나 이상 보유하고 있는 프로세스가 다른 프로세스가 가지고 있는 자원을 추가로 얻기 위해 대기하는 상황이 있어야 합니다.
비선점 (No Preemption): 프로세스로부터 자원을 강제로 빼앗을 수 없습니다. 자원을 보유한 프로세스가 작업을 완료한 후 자발적으로만 자원을 해제할 수 있습니다.
순환 대기 (Circular Wait): 자원을 기다리는 프로세스들의 집합
P0, P1, ..., Pn
이 존재하고,P0
는P1
이 보유한 자원을,P1
은P2
가 보유한 자원을, 그리고Pn
은P0
가 보유한 자원을 기다리는 순환적인 형태여야 합니다. 이 조건은 나머지 세 가지 조건이 모두 충족될 때 데드락이 발생하는 것을 보장합니다.
이 네 가지 조건이 모두 충족될 때 데드락이 발생할 수 있습니다.
라이브락 (Livelock)
라이브락은 데드락과 유사하지만, 프로세스들이 블록되지 않고 계속해서 상태를 변경하면서도 진행하지 못하는 상황입니다. 예를 들어, 두 프로세스가 공유 자원을 획득하기 위해 서로 양보하다가 계속해서 같은 순환 상태에 빠지는 경우가 이에 해당합니다.
기아 (Starvation)
기아는 프로세스가 실행을 시작하기 위해 필요한 자원을 무한정 기다리는 상태를 말합니다. 이는 동기화 도구의 큐가 공정하지 않은 방식으로 구현될 때 발생할 수 있습니다. 예를 들어, 우선순위 기반 스케줄링에서 우선순위가 높은 프로세스에게만 자원이 계속 할당되면, 우선순위가 낮은 프로세스는 자원을 얻지 못하고 영원히 대기하게 될 수 있습니다.
기아 문제를 해결하기 위한 일반적인 방법은 노화(aging) 기법을 사용하는 것입니다. 노화는 시스템에서 오랫동안 대기하는 프로세스의 우선순위를 점진적으로 높여 결국에는 자원을 얻을 수 있도록 하는 방법입니다.
Last updated