멀티스레드 프로그래밍의 함정
교착상태(데드락)와 기아상태(스타베이션)는 멀티스레드 및 멀티프로세싱 환경에서 발생할 수 있는 심각한 문제입니다. 이 글에서는 두 개념의 정의, 발생 조건, 예시, 그리고 이를 예방하고 해결하는 방법을 알아보겠습니다.
멀티스레드 및 멀티프로세싱 환경에서 성능과 효율성을 극대화하려는 시도는 필연적으로 교착상태(데드락)와 기아상태(스타베이션)와 같은 문제에 직면하게 됩니다. 이 두 문제는 시스템 자원을 효과적으로 관리하지 못할 때 발생하며, 프로그램의 안정성과 성능을 심각하게 저해할 수 있습니다. 이번 글에서는 교착상태와 기아상태의 정의, 발생 조건, 예시, 그리고 이를 예방하고 해결하는 방법을 자세히 살펴보겠습니다.
교착상태는 두 개 이상의 프로세스가 서로 상대방이 점유하고 있는 자원을 기다리며 무한정 대기하는 상태를 의미합니다. 자원에 대한 상호 배타적 접근이 요구되지만, 자원 점유와 요청의 순환적 대기로 인해 프로세스들이 모두 진행하지 못하는 상황입니다.
교착상태가 발생하려면 다음 네 가지 조건이 모두 만족되어야 합니다. 첫번째 조건은 자원은 한 번에 한 프로세스만 사용할 수 있습니다(상호배제). 이미 자원을 점유한 프로세스가 추가적인 자원을 요청하면서 그 자원이 할당되기를 기다립니다(점유와 대기). 두번째 조건은 프로세스에 할당된 자원을 강제로 빼앗을 수 없습니다. 세번째 조건은 자원은 프로세스가 자발적으로 내놓아야 합니다(비선점). 네번째 조건은 자원과 프로세스들이 원형으로 순환하여 서로 자원을 기다립니다. 즉, 프로세스 A는 프로세스 B가 점유한 자원을, 프로세스 B는 프로세스 C가 점유한 자원을, 프로세스 C는 프로세스 A가 점유한 자원을 기다립니다(순환 대기).
예를 들어, 프로세스 A와 B가 두 개의 자원 R1과 R2를 필요로 한다고 가정해봅시다. 프로세스 A가 R1을 점유하고, 프로세스 B가 R2를 점유합니다. 이후 프로세스 A는 R2를 요청하고, 프로세스 B는 R1을 요청합니다. 이 시점에서 프로세스 A는 R2가 해제되기를 기다리며 대기하고, 프로세스 B는 R1이 해제되기를 기다립니다. 결과적으로 두 프로세스 모두 무한정 대기 상태에 빠져 교착상태가 발생합니다.
교착상태를 예방하거나 해결하는 방법은 다음과 같습니다. 첫번째로 자원 할당 그래프를 사용하여 자원과 프로세스 간의 관계를 시각화하고, 교착상태를 감지합니다. 두번째로 프로세스가 자원을 요청할 때, 시스템이 안정 상태로 남을 수 있는지 확인한 후 자원을 할당합니다. 이는 자원 부족으로 인한 교착상태를 방지하는 데 유용합니다. 세번째로 자원에 순서 번호를 부여하고, 프로세스가 자원을 요청할 때 순서대로 요청하게 하여 순환 대기를 방지합니다. 마지막으로 자원을 일정 시간 동안만 점유하도록 제한하여, 오랜 시간 자원을 점유하는 것을 방지합니다.
기아상태는 특정 프로세스가 필요한 자원을 계속해서 할당받지 못해 무한정 대기하는 상태를 의미합니다. 이는 자원 할당 우선순위가 낮은 프로세스가 항상 후순위로 밀려나는 경우에 발생합니다.
기아상태는 주로 자원 할당의 불공정한 우선순위로 인해 발생합니다. 특정 프로세스가 항상 자원 할당에서 밀리면, 해당 프로세스는 필요한 자원을 할당받지 못해 기아상태에 빠질 수 있습니다.
예를 들어, 여러 프로세스가 프린터를 공유하는 상황을 가정해봅시다. 프로세스 A는 우선순위가 매우 낮고, 프로세스 B와 C는 우선순위가 높습니다. 프로세스 B와 C가 지속적으로 프린터를 점유하고 사용합니다. 프로세스 A는 항상 자원 할당에서 밀리게 됩니다. 결국 프로세스 A는 프린터를 사용할 기회를 얻지 못하고 무한정 대기하게 됩니다.
기아상태를 예방하거나 해결하는 방법은 다음과 같습니다. 첫번째로 낮은 우선순위의 프로세스가 자원을 오랜 시간 점유하면, 해당 프로세스의 우선순위를 일시적으로 높여 자원을 할당받을 수 있도록 합니다. 두번째로 자원을 공정하게 할당하기 위해 라운드 로빈(Round Robin) 방식이나 공정 큐(Fair Queue)를 사용합니다. 이는 모든 프로세스가 균등하게 자원을 사용할 기회를 얻도록 보장합니다. 마지막으로 프로세스의 대기 시간이 길어질수록 우선순위를 점진적으로 높여 자원을 할당받을 수 있도록 합니다.
결론으로 교착상태와 기아상태는 멀티스레드 및 멀티프로세싱 환경에서 발생할 수 있는 심각한 문제입니다. 교착상태는 상호 배제, 점유와 대기, 비선점, 순환 대기 조건이 모두 만족될 때 발생하며, 기아상태는 자원 할당의 불공정한 우선순위로 인해 발생합니다. 이 두 문제를 예방하고 해결하기 위해 다양한 기법을 적용할 수 있습니다. 교착상태를 예방하기 위해 자원 할당 그래프, 은행가 알고리즘, 자원 순서 번호, 타임아웃 등을 사용할 수 있으며, 기아상태를 예방하기 위해 우선순위 상향, 공정한 자원 할당, 에이징 등을 사용할 수 있습니다. 이러한 기법들을 적절히 활용하여 멀티스레드 프로그래밍의 복잡성을 효과적으로 관리하고, 시스템의 안정성과 성능을 유지할 수 있습니다.
'개발' 카테고리의 다른 글
가상메모리 (0) | 2024.07.17 |
---|---|
메모리 페이징 (0) | 2024.07.17 |
동기화(Synchronization) (0) | 2024.07.17 |
메모리 가시성 (0) | 2024.07.17 |
컨텍스트 스위칭(Context Switching) (0) | 2024.07.17 |