Java

[JVM 밑바닥까지 파헤치기] 12-3. 자바 메모리 모델과 스레드: 스레드

noahkim_ 2024. 12. 26. 01:06

저우즈밍 님의 "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 관계
    • 가상 스레드가 블록되면 매핑된 다른 스레드가 이어서 실행

 

파이버
  • 오라클에서 구현한 스택풀 코루틴