일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 미국주식
- XLF
- 다형성
- etf
- mco
- 현금흐름표
- 백준
- 금리인상
- StringBuffer
- 프로그래머스
- 인플레이션
- 제태크
- 잉여현금흐름
- S&P500
- 주린이
- object
- javascript
- FCF
- 알고리즘
- Java
- 기업분석
- 주식
- 오버라이딩
- 배당성장
- 무디스
- 금리인하
- 객체지향
- 접근제어자
- 자바
- 그리디 알고리즘
- Today
- Total
오늘의하루
JAVA의 컨텍스트 스위칭이 비싼 이유? 본문
공부를 하다 보면 "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에 비해 훨씬 낮습니다.
'JAVA' 카테고리의 다른 글
Java Pattern.matches의 오남용으로 인한 성능 문제와 최적화 방법 (0) | 2024.12.23 |
---|---|
[스레드 안전성을 위한 선택] synchronized, ReentrantLock, ReentrantReadWriteLock 비교 (0) | 2024.09.24 |
CPU-bound와 I/O-bound 작업의 병렬 처리 (0) | 2024.05.23 |
[Test Code] Mockito를 활용한 랜덤 값 포함 함수 유닛 테스트 (0) | 2024.05.23 |
Java Stream이란? feat. 메모리 로드, 병렬 처리, 연산 흐름 (0) | 2024.05.23 |