분산 시스템 또는 복잡한 마이크로서비스 환경에서 발생할 수 있는 교착 상태(deadlock)를 예방하거나 탐지하기 위한 고급 전략에는 어떤 것들이 있으며, 각 전략의 구현 복잡도와 실제 적용 시의 고려사항은 무엇인지 설명해 주십시오.
힌트 · 자원 할당 순서 지정, 타임아웃 및 재시도, 데드락 탐지 알고리즘(예: 데드락 그래프) 등이 있습니다. 분산 환경에서는 분산 트랜잭션 관리나 분산 락 매니저를 활용할 수 있습니다.
모범답안
분산 시스템에서 교착 상태는 심각한 문제죠. 이를 예방하거나 탐지하기 위한 고급 전략으로는 크게 두 가지 접근 방식이 있습니다.
첫째, 교착 상태 회피입니다. 가장 대표적인 방법은 자원 할당 순서 지정입니다. 모든 프로세스가 자원을 요청할 때 미리 정해진 순서대로 요청하도록 강제하는 거죠. 이렇게 하면 순환 대기 조건을 원천적으로 방지할 수 있습니다. 구현은 비교적 간단하지만, 모든 자원에 대한 전역적인 순서를 정의하기 어렵거나 성능 저하를 야기할 수 있다는 단점이 있습니다.
둘째, 교착 상태 탐지 및 복구입니다. 시스템에서 주기적으로 자원 할당 그래프를 생성하고 순환 대기를 탐지하는 알고리즘을 사용합니다. 분산 환경에서는 분산 잠금 관리자를 통해 잠금 상태를 중앙에서 관리하거나, 타임아웃 및 재시도 메커니즘을 활용하여 특정 시간 내에 응답이 없으면 잠금을 해제하고 재시도하는 방식도 많이 사용됩니다. 타임아웃은 구현이 쉽지만, 실제 교착 상태가 아닌 경우에도 불필요한 재시도를 유발할 수 있습니다. 분산 잠금 관리자는 복잡성이 높고 단일 실패 지점이 될 수 있다는 점을 고려해야 합니다.
실제 적용 시에는 시스템의 특성, 성능 요구사항, 복잡성 등을 종합적으로 고려하여 적절한 전략을 조합하는 것이 중요합니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 동시성 / 멀티스레딩 면접 질문
- Java Memory Model (JMM)의 happens-before 관계에 대해 설명하고, volatile 키워드가 JMM 관점에서 어떻게 가시성(visibility)과 순서(ordering)를 보장하는지 내부 동작 원리를 상세히 설명해 주십시오.
- 락(Lock)을 사용하지 않고 스레드 안전한(thread-safe) 큐를 구현한다고 가정할 때, 어떤 기법들을 활용할 수 있으며, 특히 CAS(Compare-And-Swap) 연산을 사용하여 어떻게 원자성(atomicity)을 보장할 수 있는지 구체적인 예시와 함께 설명해 주십시오. 락 프리(lock-free) 방식의 장단점은 무엇입니까?
- 멀티스레드 환경에서 캐시 일관성(cache coherence)과 관련된 문제 중 'False Sharing'이 무엇인지 설명하고, 이로 인해 발생하는 성능 저하 문제를 어떻게 진단하고 해결할 수 있는지 구체적인 방안을 제시해 주십시오.
- Java의 synchronized 키워드와 ReentrantLock 클래스의 내부 구현 메커니즘을 비교하고, 특히 ReentrantLock이 synchronized보다 제공하는 유연성과 고급 기능(예: 조건 변수, 공정성)이 어떻게 구현되는지 AQS(AbstractQueuedSynchronizer)를 중심으로 설명해 주십시오.
- 멀티코어 환경에서 동시성 애플리케이션의 성능을 논할 때, 확장성(scalability)과 처리량(throughput)은 어떤 관계를 가지며, 특정 워크로드에서 이 두 가지 지표를 최대화하기 위한 동시성 설계 전략은 어떻게 달라져야 하는지 구체적인 사례를 들어 설명해 주십시오.
- 기존 스레드 기반의 동시성 모델(shared-memory concurrency)과 비동기 프로그래밍 모델(예: Actor Model, CSP)을 비교하고, 각각의 모델이 특정 유형의 문제(I/O 바운드 vs. CPU 바운드)에 어떻게 더 적합한지, 그리고 발생할 수 있는 트레이드오프(trade-off)는 무엇인지 설명해 주십시오.