해결된 질문
작성
·
151
·
수정됨
0
조금 동 떨어진 질문일 수 있지만, 궁금증이 해소가 되지 않아 질문드립니다.
자바 애플리케이션에서 Thread를 생성해서 실행을 하게될 때, 총 3개의 스택영역을 거쳐야 된다고 생각을 하는데 맞을까요?
우선
런타임 데이터 영역 유저스레드의 스택영역
JVM 내부 스레드의 스택 영역
운영체제 커널 스레드의 스택 영역
각각을 이렇게 정리해봤습니다.
- 자바에서 Thread객체를 생성하고 실행하면, JVM은 해당 스레드마다 스택 영역을 생성한다.
- 이 스택영역은 바이트코드에서 메서드 호출하고 실행할 때 필요한 데이터를 관리한다.
- 유저 스레드이고, 애플리케이션의 비지니스 로직을 수행하는 스레드이다.
- 클래스로더, GC, JIT와 같은 JVM내부 작업을 수행하는 스레드는 JVM 내에서 관리되는 스레드이다.
- 이 스택 영역은 JVM코드에서 메서드 호출하고 실행할 때 필요한 데이터를 관리한다.
- 유저 스레드이고, JVM의 핵심 작업을 수행하는 스레드이다.
- 커널 스레드는 실제 CPU에서 실행되는 스레드이다.
- 유저 스레드의 실행을 처리하기 위해 유저 모드에서 작업을 처리하다가, 시스템 호출이 필요할 때 커널 모드로 전환되어 커널 스레드가 실제로 시스템 자원에 접근하고 작업을 처리한다.
- 커널에서는 커널 스레드의 TCB를 관리하여 각 스레드의 실행 상태를 추적한다.
- 이 스택 영역은 커널에서 수행하는 메서드에 필요한 데이터를 관리한다.
답변 1
1
가정이 바르지 않습니다. JVM 기반으로 작동하는 Java 응용 프로그램에서 스택을 사용하는 변수들이 있으며 이는 JVM이 제공하는 메모리 영역으로 스택 구조로 관리됩니다. 그 외 나머지는 자바 코드의 영역을 넘어선 것들입니다.
Java에서 스레드는 크게 두 가지 입니다. 일반 스레드와 가상 스레드이며 통상 일반 스레드는 JVM이 구동되는 시스템의 플랫폼 스레드와 1:1로 대응됩니다. 그리고 윈도우 환경의 경우 플랫폼 스레드가 커널 스레드와 1:1로 대응됩니다. 가상 스레드는 한 플랫폼 스레드를 여러 가상 스레드가 묶여 작동하는 형태입니다.
정리한 내용에 대해 답변드리겠습니다.
네, 맞습니다. JVM은 스레드 객체마다 Thread private 영역을 따로 만들어 동시성 이슈가 발생하지 않도록 관리합니다. 여기서 스택 영역은 지역변수이자 자동변수의 메모리가 위치하는 것일 뿐 메서드를 호출하는 것은 아닙니다. 메서드가 호출될 때마다 스택 프레임이 증가하며 반환할 때 원위치로 줄어듭니다.
JVM 내부로 들어가면 이는 JVM이 관리하는 스레드가 아니라 운영체제 수준에서 관리합니다. JVM은 범용 운영체제 환경에서 C/C++로 작성된 사용자 모드 응용 프로그램입니다. 이 영역은 자바 코드와 사실상 별개로 분리됩니다.
커널 스레드는 운영체제 수준에서 정의한 실행의 단위이며 시스템 호출과는 별개 입니다. 그리고 TCB로 스레드들을 관리하는 것은 운영체제이며 커널은 운영체제의 핵심 요소들을 모아놓은 집합체로 볼 수 있습니다.
스택은 선형 자료구조의 일종입니다. 스택이 있는 것이 아니라 메모리를 스택 구조로 관리 할 뿐입니다. 참고하시기 바랍니다. 😄