CS 기초 · 중급
멀티스레딩 환경에서 문맥 교환(Context Switching)이 발생하는 시점과 그 과정에 대해 설명해주세요. 문맥 교환이 시스템 성능에 미치는 영향은 무엇이며, 이를 최소화하기 위한 방법에는 어떤 것들이 있는지 설명해주세요.
힌트 · 문맥 교환은 CPU가 한 스레드에서 다른 스레드로 제어를 넘길 때 발생하며, 레지스터, 프로그램 카운터 등의 상태를 저장하고 복원하는 오버헤드가 발생합니다. 락 최소화, 스레드 수 조절 등으로 오버헤드를 줄일 수 있습니다.
인터럽트스레드 상태 저장스케줄링 알고리즘캐시 미스스레드 풀
모범답안
문맥 교환은 멀티스레딩 환경에서 CPU가 실행 중인 스레드를 일시 중단하고 다른 스레드를 실행하기 위해 현재 스레드의 상태를 저장하고 새로운 스레드의 상태를 복원하는 과정입니다. 주로 다음과 같은 시점에 발생합니다.
- 인터럽트 발생: 타이머 인터럽트, I/O 인터럽트 등으로 인해 현재 스레드의 실행을 중단해야 할 때
- 스레드 블로킹: I/O 작업 완료 대기, 락 획득 대기 등으로 스레드가 스스로 블로킹될 때
- 스케줄링 알고리즘: 운영체제의 스케줄러가 우선순위 또는 시간 할당량에 따라 스레드를 교체할 때
문맥 교환은 스레드 상태 저장 및 복원 과정에서 오버헤드를 발생시키고, 캐시 미스를 증가시켜 시스템 성능에 부정적인 영향을 미칠 수 있습니다.
문맥 교환 오버헤드를 최소화하기 위한 방법으로는 다음과 같은 것들이 있습니다.
- 락 사용 최소화: 락 경쟁을 줄여 불필요한 문맥 교환을 방지합니다.
- 스레드 풀 사용: 스레드 생성 및 소멸 비용을 줄여 문맥 교환 빈도를 낮춥니다.
- 적절한 스레드 수 유지: 너무 많은 스레드는 오히려 문맥 교환 오버헤드를 증가시키므로, CPU 코어 수에 맞춰 적절한 스레드 수를 유지합니다.
- 효율적인 스케줄링 알고리즘: 운영체제의 스케줄링 알고리즘을 조정하여 문맥 교환 빈도를 최적화합니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 동시성 / 멀티스레딩 면접 질문
- 특정 언어(예: Java, C#)에서 `volatile` 키워드가 멀티스레딩 환경에서 어떤 역할을 하는지 설명해주세요. `volatile`이 보장하는 것과 보장하지 못하는 것을 구분하여 설명하고, `synchronized` 또는 `Atomic` 클래스와의 차이점을 언급해주세요.
- 스레드 풀(Thread Pool)을 사용하는 주된 이유와 이점이 무엇인지 설명해주세요. 스레드 풀의 크기를 결정할 때 고려해야 할 요소들과, 잘못된 스레드 풀 사용으로 발생할 수 있는 문제점들을 함께 설명해주세요.
- 동시성 프로그래밍에서 불변 객체(Immutable Object)가 갖는 장점은 무엇이며, 어떻게 불변 객체를 설계하여 스레드 안전성을 높일 수 있는지 구체적인 방법을 설명해주세요. 단점이나 제약 사항도 있다면 함께 언급해주세요.
- Java Memory Model (JMM)의 happens-before 관계에 대해 설명하고, volatile 키워드가 JMM 관점에서 어떻게 가시성(visibility)과 순서(ordering)를 보장하는지 내부 동작 원리를 상세히 설명해 주십시오.
- 락(Lock)을 사용하지 않고 스레드 안전한(thread-safe) 큐를 구현한다고 가정할 때, 어떤 기법들을 활용할 수 있으며, 특히 CAS(Compare-And-Swap) 연산을 사용하여 어떻게 원자성(atomicity)을 보장할 수 있는지 구체적인 예시와 함께 설명해 주십시오. 락 프리(lock-free) 방식의 장단점은 무엇입니까?
- 멀티스레드 환경에서 캐시 일관성(cache coherence)과 관련된 문제 중 'False Sharing'이 무엇인지 설명하고, 이로 인해 발생하는 성능 저하 문제를 어떻게 진단하고 해결할 수 있는지 구체적인 방안을 제시해 주십시오.