저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다
1. 스레드 구현
OS 스레드
- 다양한 하드웨어와 운영체제에서 운용할 수 있는 통합된 개념
- 핵심 메서드 모두가 네이티브 코드로 구현됨
- 플랫폼 독립적으로 구현되기 어려운 점이 있음
커널 스레드 구현
- 1:1 구현
- 운영체제 커널에서 직접 지원
- 각 프로세서에 스레드의 작업이 매핑됨
- 사용할 수 있는 수가 제한적임
- 시스템 콜로 스레드 연산이 이루어짐
- 비용 높음
사용자 스레드 구현
- 1:N 구현
- 사용자 공간에서 구현되는 스레드 라이브러리
- 사용자 스레드의 생성, 소멸, 동기화, 스케줄링은 커널의 도움없이 온전히 사용자 공간에서 처리됨
하이브리드 구현
- 커널 스레드와 사용자 스레드를 함께 이용하는 방법
자바 스레드
- 운영체제의 커널스레드로 구현됨 (HotSpotVM)
스케줄링
- 시스템이 프로세서 사용 권한을 스레드에 할당하는 일
- 선점형 스케줄링 방식으로 할당됨
- 스레드 우선순위를 통해 먼저 할당되도록 권고할 수 있음
상태 전이
- new
- running
- waiting: wait, join
- timed waiting: timeout, sleep
- blocked
- terminated
2. 자바와 가상 스레드
- 운영체제별 스레드 모델의 차이를 숨기는 통합 인터페이스를 제공
커널 스레드의 한계
마이크로서비스 아키텍처
- 하나의 서비스를 분산시키고 협력을 통해 최종 응답 생성
- 서비스 각각의 복잡성을 줄이고 재사용성을 높임
- 자바의 기존 동시성 프로그래밍 매커니즘과 어울리지 않음
- 운영체제 스레드와 매핑되어 비용이 커지고 수용할 수 있는 스레드 수도 한계가 있음
코루틴의 귀환
컨텍스트 스위치 비용
- 사용자 모드와 커널 모드 사이의 번환 비용
- 인터럽트에 응답하고 실행 사이트의 데이터를 저장했다 복원하는 비용
코루틴
- 비동기 작업을 효율적으로 관리하기 위한 프로그래밍 모델
- 스레드처럼 여러 작업을 동시에 처리하는 것처럼 보이지만, 실제로는 하나의 스레드에서 동작
- 스택리스
- 상태를 클로저에 저장
- 가벼움
- 콜스택을 완벽하게 보관하고 복원
- 스택 프레임 저장 및 보관
- 실행 중단 지점에서 현재 상태를 보관 (yield, suspend)
- 단점
- 복잡성: 호출 스택과 스케줄러를 애플리케이션 수준에서 구현해야 함
- 디버깅 어려움
가상 스레드
- JDK 21에서 도입됨
사용자 모드 스레드
- 자바 가상 머신이 스케줄링
- 플랫폼 스레드와 N:1 관계
- 가상 스레드가 블록되면 매핑된 다른 스레드가 이어서 실행
파이버
- 오라클에서 구현한 스택풀 코루틴
'Java' 카테고리의 다른 글
[Effective Java] 2-2. 객체 생성과 파괴: 생성자에 매개변수가 많다면 빌더를 고려하라 (0) | 2024.12.26 |
---|---|
[Effective Java] 2-1. 객체 생성과 파괴: 생성자 대신 정적 팩토리 메서드를 고려하라 (0) | 2024.12.26 |
[JVM 밑바닥까지 파헤치기] 12-2. 자바 메모리 모델과 스레드: 자바 메모리 모델 (1) | 2024.12.26 |
[JVM 밑바닥까지 파헤치기] 12-1. 자바 메모리 모델과 스레드: 동시성 (1) | 2024.12.25 |
[JVM 밑바닥까지 파헤치기] 11-2. 백엔드 컴파일과 최적화: JIT 컴파일러 (0) | 2024.12.25 |