컨텍스트 스위칭
다른 스레드 없이 메인 스레드 하나만 스케줄링하다고 하면, 메인 스레드는 항상 실행될 것이다. 반대로 CPU 개수보다 실행 중인 스레드의 개수가 많다고 하면, 운영체제가 특정 스레드의 실행 스케줄을 선점하고 다른 스레드가 실행될 수 있도록 스케줄을 잡는다. 이처럼 하나의 스레드가 실행되다가 다른 스레드가 실행되는 순간 컨텍스트 스위칭이 일어난다. 컨텍스트 스위칭이 일어나는 상세한 구조를 보면, 먼저 현재 실행 중인 스레드의 실행 상태를 보관해두고, 다음번 실행되기로 스케줄 된 다른 스레드의 실행 상태를 다시 읽어 들인다.
스레드 스케줄링을 하려면 운영체제와 JVM 내부의 공용 자료 구조를 다뤄야 한다는 문제가 있다. 운영체제와 JVM 역시 프로그램 스레드가 사용하는 것과 같은 CPU를 함께 사용하고 있다. 따라서 운영체제나 JVM이 CPU를 많이 사용하면 할수록 실제 프로그램 스레드가 사용할 수 있는 CPU의 양은 줄어든다. 물론 컨텍스트 스위칭에 운영체제와 JVM이 사용하는 CPU 부분만 관련된 건 아니다. 컨텍스트가 변경되면서 다른 스레드를 실행하려면 해당 스레드가 사용하던 데이터가 프로세서의 캐시 메모리에 들어 있지 않을 확률도 높다. 그러면 캐시에서 찾지 못한 내용을 다른 저장소에서 찾아와야 하기 때문에 원래 예정된 것보다 느리게 실행되는 셈이다. 이런 경우에 대비하고자 대부분의 스레드 스케줄러는 실행 대기 중인 스레드가 밀려 있다고 해도, 현재 실행 중인 스레드에게 최소한의 실행 시간을 보장해주는 정책을 취하고 있다. 그러면 컨텍스트 스위칭에 들어가는 시간과 비용을 나누는 효과를 볼 수 있고, 그 결과 인터럽트 받지 않고 실행할 수 있는 최소한의 시간을 보장받기 때문에 전체적인 성능이 향상되는 효과를 볼 수 있다.
스레드가 실행하다가 락을 확보하기 위해 대기하기 시작하면, 일반적으로 JVM은 해당 스레드를 일시적으로 정지 시키고 다른 스레드가 실행되도록 한다. 특정 스레드가 빈번하게 대기 상태에 들어간다고 하면 스레드별로 할당된 최소 실행 시간조차 사용하지 못하는 경우도 있다. 대기 상태에 들어가는 연산을 많이 사용하는 프로그램은 CPU를 주로 활용하는 프로그램보다 컨텍스트 스위칭 횟수가 훨씬 많아지고, 따라서 스케줄링 부하가 늘어나면서 전체적인 처리량이 줄어든다.
참조 도서: 멀티코어를 100% 활용하는 자바 병렬 프로그래밍 p339 ~ 340
'자바' 카테고리의 다른 글
SupervisorJob (0) | 2025.03.26 |
---|---|
CoroutineScope (0) | 2025.03.25 |
성능 대 확장성 (0) | 2025.03.11 |
세마포어 (0) | 2025.03.06 |
Kotlin Data Classes (0) | 2025.03.04 |