-
JAVA의 컨텍스트 스위칭이 비싼 이유?JAVA 2025. 1. 10. 10:40728x90반응형
공부를 하다 보면 "Java의 컨텍스트 스위칭 비용이 비싸다"라는 말을 자주 듣곤 하는데 이번 글에서는 왜 Java의 컨텍스트 스위칭 비용이 비싼지 정리해보았습니다.
JAVA의 Thread 구조
Java에서는 java.lang.Thread를 통해 스레드를 생성하게 되는데 이 과정에서 JVM은 플랫폼 스레드를 만들고 이를 OS 스레드와 연결되고 이 OS 스레드는 다시 커널 스레드와 연결됩니다.
즉, Java에서는 스레드가 JVM 플랫폼 스레드 → OS 스레드 → 커널 스레드의 1:1:1 관계로 동작합니다.
- JVM 스레드 : 크기가 작음
- OS 스레드 : JVM 스레드에 비해 훨씬 큼Context Switching
컨텍스트 스위칭은 실행 중인 스레드를 변경할 때 현재 스레드의 상태(레지스터, 스택 포인터, 메모리 등)를 저장하고 다른 스레드의 상태를 복원하는 작업을 의미합니다.
이 과정에서 저장 및 복원해야 할 정보(크기)가 많을수록 비용이 높아집니다.
Java의 경우 OS 스케줄러에 의해 컨텍스트 스위칭이 이루어지며 상대적으로 큰 OS 스레드 전체를 교체해야 합니다.
따라서 Java의 컨텍스트 스위칭 비용은 상당히 높습니다.
GO는 왜 Context Switching 비용이 싸다는거지?
Go에서는 고루틴이 OS 스레드와 연결된 경량화된 작은 스레드로 동작하며 이 OS 스레드는 다시 커널 스레드와 연결되는데 이 구조만 보면 Java와 비슷하게 1:1:1 관계처럼 보입니다.
하지만 Go의 큰 차이점은 OS 스케줄러가 아닌 Go 런타임에서 컨텍스트 스위칭을 관리한다는 점입니다.
즉 Go는 많은 경량화된 스레드를 생성하고 이 경량화된 스레드 자체를 변경합니다.
경량화된 스레드는 OS 스레드보다 훨씬 작기 때문에 저장 및 복원해야 할 정보가 적어 컨텍스트 스위칭 비용이 Java에 비해 훨씬 낮습니다.
728x90반응형'JAVA' 카테고리의 다른 글
[Java 파먹기] 정렬 기준 : Comparable & Comparator (1) 2025.04.17 [레거시 코드와 데이트] SimpleDateFormat의 함정 (0) 2025.02.21 Java Pattern.matches의 오남용으로 인한 성능 문제와 최적화 방법 (1) 2024.12.23 [스레드 안전성을 위한 선택] synchronized, ReentrantLock, ReentrantReadWriteLock 비교 (1) 2024.09.24 CPU-bound와 I/O-bound 작업의 병렬 처리 (0) 2024.05.23