교착 상태(Deadlock)는 멀티스레드 애플리케이션에서 심각한 문제를 야기할 수 있습니다. 교착 상태의 4가지 필요조건을 설명하고, 이를 해결하거나 예방하기 위한 실용적인 방법들을 제시해주세요.
힌트 · 교착 상태는 상호 배제, 점유 및 대기, 비선점, 순환 대기라는 네 가지 조건이 동시에 만족될 때 발생합니다. 락 획득 순서 지정, 타임아웃, 자원 선점 등의 방법으로 예방 및 회피할 수 있습니다.
모범답안
교착 상태는 멀티스레드 환경에서 여러 스레드가 서로 필요한 자원을 점유하고 놓아주지 않아 무한정 대기하는 상황을 말합니다. 발생 조건은 크게 네 가지입니다.
첫째, 상호 배제입니다. 자원은 한 번에 하나의 스레드만 사용할 수 있어야 합니다. 둘째, 점유 및 대기입니다. 스레드가 자원을 점유한 상태에서 다른 자원을 기다려야 합니다. 셋째, 비선점입니다. 스레드가 점유한 자원은 강제로 뺏을 수 없습니다. 넷째, 순환 대기입니다. 스레드들이 서로 자원을 요구하며 순환 형태로 대기해야 합니다.
교착 상태를 해결하거나 예방하는 방법으로는 여러 가지가 있습니다. 가장 일반적인 방법은 락 획득 순서를 일관되게 유지하는 것입니다. 예를 들어, 항상 A 락을 먼저 획득하고 B 락을 획득하도록 규칙을 정하는 것이죠. 또한, 락 획득에 타임아웃을 설정하여 무한정 대기를 방지할 수 있습니다. 자원 할당 그래프를 활용하여 교착 상태 발생 가능성을 미리 탐지하고 회피하는 방법도 있습니다. 마지막으로, 자원 선점을 허용하는 것도 하나의 방법이 될 수 있지만, 자원 선점은 데드락 회피 방법 중 가장 복잡하고 오류 발생 가능성이 높습니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 동시성 / 멀티스레딩 면접 질문
- '데드락(Deadlock)'이란 무엇이며, 데드락이 발생하기 위한 4가지 필수 조건을 설명해 주세요.
- 뮤텍스와 세마포어는 동기화 메커니즘으로 사용됩니다. 두 메커니즘의 주요 차이점을 설명하고, 각각 어떤 상황에서 더 적합하게 사용될 수 있는지 구체적인 예시를 들어 설명해주세요.
- 멀티스레드 환경에서 발생할 수 있는 Race Condition(경쟁 상태)이 무엇인지 정의하고, 이러한 문제를 방지하기 위한 대표적인 방법들을 설명해주세요. 실제 코드에서 Race Condition이 발생하는 시나리오를 예시로 들어 설명할 수 있다면 더욱 좋습니다.
- 특정 언어(예: Java, C#)에서 `volatile` 키워드가 멀티스레딩 환경에서 어떤 역할을 하는지 설명해주세요. `volatile`이 보장하는 것과 보장하지 못하는 것을 구분하여 설명하고, `synchronized` 또는 `Atomic` 클래스와의 차이점을 언급해주세요.
- 스레드 풀(Thread Pool)을 사용하는 주된 이유와 이점이 무엇인지 설명해주세요. 스레드 풀의 크기를 결정할 때 고려해야 할 요소들과, 잘못된 스레드 풀 사용으로 발생할 수 있는 문제점들을 함께 설명해주세요.
- 동시성 프로그래밍에서 불변 객체(Immutable Object)가 갖는 장점은 무엇이며, 어떻게 불변 객체를 설계하여 스레드 안전성을 높일 수 있는지 구체적인 방법을 설명해주세요. 단점이나 제약 사항도 있다면 함께 언급해주세요.