[Java] 자바 스레드와 운영체제 스레드의 관계

2025. 1. 3. 16:27·JAVA

최근 교내 대회를 준비하던 중,

그저 이론으로만 알던 자바 멀티 스레딩이니 비동기 처리니 하는 방식에 대한 필요성을 실제로 느끼게 되었다.

 

이 부분에 대해 공부하던중, Java에서의 Parallelism 과 Concurrency(논리적 동시성)에 대해 알아보게 되었고,

자바에서 이를 구현하기 위한 여러 방식들이 있지만, 

 

그 전에 먼저 자바 스레드와 운영체제 스레드의 관계에 대해 서핑해본 내용을 정리해보았다.

JVM이 대강 어떤 방식으로 운영체제와 상호작용하고, 스레드들을 스케줄링하는지에 관한 내용이다.

 

먼저 간단하게 유저 레벨 스레드와 커널 레벨 스레드에 대한 이해가 필요하다.

 

유저 레벨 스레드는, 사용자 프로그램에서 관리되는 스레드로, 커널은 이를 인식하지 못한다.

커널 레벨 스레드는, 운영체제의 커널에서 관리되는 스레드인데, 커널은 이 스레드를 독립적으로 실행될 수 있게 한다.

 

이 둘의 차이는 물리적인 커널 영역과 유저 영역의 개념보다는,

두 스레드 모두 커널 영역에 있지만, 커널 모드와 유저 모드 즉 커널의 통제권 안에 있는가의 문제이다.

커널 레벨 스레드 모델의 그림에 유저 레벨 스레드도 존재하는 이유가 그러하다.

기본적으로 프로세스가 생성되면 위 형태가 나타나는데, 하나의 프로세스는 하나 이상의 스레드를 가지고,
유저레벨 부분과 동기화를 할 수 있도록 유저레벨 쪽에도 작은 스레드가 생성되는 것이다.

(저 유저레벨 스레드는, 커널이 관리하는 스레드가 아닌 해당 프로세스에 대한 사용자 입,출력을 받을 수 있도록 하는 커널 통제 밖의 스레드이다)

 

한마디로 커널 스레드에 사용자 스레드가 붙어 일처리를 하는 것이다.

 

자바에서 생성한 스레드도 똑같다. 자바에서 생성한 thread는 유저 레벨 스레드이지만, 이 유저 레벨 스레드를 커널 스레드에 매핑시키는 혼합형 스레드 모델을 현대의 자바는 사용한다.

 

초기 자바에서 사용하던 스레드 모델과 현대 자바가 사용하는 스레드 모델을 보면 자바가 멀티스레딩을 어떤식으로 지원하는지 알 수 있다.

 

기존 자바의 스레드 모델인 Grean Thread 모델을 사용하는 경우에는,

어플리케이션 레벨에서 모든 스레드를 관리했다. 이 경우 자바의 유저레벨 스레드는 하나의 커널 스레드에 매핑되고, 자바가 스레드를 스케줄링하게 된다.
이는 멀티코어 CPU의 장점을 살리지 못함을 뜻한다. (멀티스레딩의 경우 논리적 동시성으로 구현)

 

현대 자바의 스레드 모델인 Native Thread 모델은, 혼합형 모델 (다대다) 이다.

여러개의 유저 레벨 스레드는 여러개의 커널 스레드에 매핑되는데, 이를 통해 자바의 스레드를 OS수준에서 구현해 커널 공간에서 관리하며,
운영체제 입장에서 자바 스레드를 마치 독립적인 프로세스처럼 스케줄링할 수 있게 된다.
현대의 자바가 멀티코어 CPU 환경에서 멀티스레딩 시 실제 병렬성을 구현할 수 있는 이유이다.

 

'JAVA' 카테고리의 다른 글

[Java] 콜백 패턴과 적용  (0) 2025.01.13
'JAVA' 카테고리의 다른 글
  • [Java] 콜백 패턴과 적용
폐프
폐프
  • 폐프
    폐프의삶
    폐프
  • 전체
    오늘
    어제
    • 분류 전체보기 (43)
      • 2023 하계 모각코 (12)
      • 2023-24 동계 모각코 (8)
      • 2024 SW ACADEMY (5)
      • Spring (1)
      • JPA (0)
      • JAVA (2)
      • Database (10)
      • OS (5)
      • Network (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
폐프
[Java] 자바 스레드와 운영체제 스레드의 관계
상단으로

티스토리툴바