JVM에서의 스레드(1)

심규민·2024년 3월 28일
1

스레드란?

프로세스가 작업 단위로 볼 때, 스레드는 프로세스 내부의 세분화된 작은 작업 단위로 볼 수 있다. 이때 프로세스는 하나 이상의 스레드를 가질 수 있으며, 여러 스레드를 가지는 경우 Multi Threading이라고 부른다.

스레드는 스레드 구현 방식에 따라서 스케쥴링의 단위가 될 수 있다.

스레드는 프로세스에 포함되어 있기 때문에 스레드들은 프로세스 내부에서 자원을 공유하며 작업을 처리한다.

스레드 종류

스레드의 종류는 다음과 같이 나눌 수 있다.

  • User Level Thread
  • Kernel Level Thread
  • Combined Thread

User Level Thread

User Level Thread에서 스레드들은 커널이 인지하지 못한다. 그 대신 프로세스를 인지하고 있다.

User Level Thread는 하나의 스레드가 Blocking이 된다면 같은 프로세스 내의 다른 스레드로 스케쥴링이 되는게 아닌 다른 프로세스로 스케쥴링이 된다.

User Level Thread는 스레드 라이브러리를 통해 관리되며 커널의 개입이 없기에 스레드 스위칭 비용이 저렴하다. 좀 더 설명해보자면 일반적인 스레드 컨텍스트 스위칭은 유저 모드에서 커널 모드로의 전환이 필요하지만 User Level Thread는 유저 모드에서 라이브러리를 통해 스위칭이 가능하기 때문에 상대적으로 저렴하다.

Kernel Level Thread

Kernel Level Thread에서 스레드들은 커널이 관리한다.
커널이 스레드들을 관리하기 때문에 프로세스 내부의 한 스레드가 Blocking이 되더라도 프로세스 내부의 다른 스레드로 스케쥴링이 가능하다. 따라서 다중 처리가 필요한 프로세스의 경우 좋다.

하지만 User Level Thread에서의 장점과는 반대로 컨텍스트 스위치 비용이 비싸다. 커널이 스레드를 관리하기 때문에 스위칭을 위해서는 커널 모드로의 전환이 필요하기 때문이다.

JVM Runtime Data Area

JVM의 Runtime Data Area에는 Stack, PC Register, Native Method Stack, Heap, Method Area로 구분되어 있다. 이중 JVM에서의 스레드가 생성되면 각 스레드는 Stack, PC Register, Native Method Stack을 할당 받게 되며, 스레드간 영역은 접근할 수 없다.

Heap, Method Area는 모든 스레드들이 접근할 수 있는 공유 자원에 해당한다.

그러면 JVM의 스레드는 어떤 종류를 사용하고 있을까?

JVM 스레드

JVM에서는 User Level Thread와 유사한 Green Thread, 그리고 Kernel Level Thread와 유사한 Native Thread, 두 가지 종류를 사용했다.

Green Thread의 경우 Jdk 1.3 이전까지 사용했고, 이후로는 Native Thread를 사용하고 있다.

그러면 각 스레드 모델에 대해서 알아보자

Green Thread

Green Thread는 User Level Thread와 유사하게 Many to One (Many는 스레드, One은 CPU) 모델로 설계된 스레드이다.

On a multi-core processor, native thread implementations can automatically assign work to multiple processors, whereas green thread implementations normally cannot
https://en.wikipedia.org/wiki/Green_thread

Green Thread는 멀티 코어 환경에서도 하나의 물리적 코어만 사용할 수 있기 때문에, 멀티 코어 환경을 장점을 살리지 못했다.

When a green thread executes a blocking system call, not only is that thread blocked, but all of the threads within the process are blocked. To avoid that problem, green threads must use asynchronous I/O operations
https://en.wikipedia.org/wiki/Green_thread

그리고 Green Thread는 하나의 스레드가 Blocking이 될 경우 다른 스레드들 모두 Blocking이 될 수 있었기에 Asynchronous I/O를 사용해야 했다.

Native Thread

Native Thread는 Many to Many 형식을 따르고 있다. 즉, 여러 CPU 코어를 통해 여러 스레드를 생성해서 작업을 처리하고 있는 것이다.

Native Thread는 Many to Many 형식과 커널에서 스레드를 관리하는 방식을 통해 멀티 스레딩 환경에서의 장점을 활용할 수 있으며, 하나의 스레드가 Blocking 되더라도 프로세스 전체가 Blocking되는 문제를 해결했다.

Native Thread는 JVM에서 스레드를 스레드 큐를 이용해서 스케쥴링하고 JNI를 통해 커널 스레드와 JVM 스레드와 매핑 시켜주는 과정을 통해 작업을 처리한다.

0개의 댓글