예를들어 c 혹은 c++ 로 쓰레드 3개를 만들고, cpu 는 두 개가 있다고 가정해보자. 이 경우, 운영체제는 3개의 쓰레드가 2개의 cpu를 잘 활용하기 위해서 스케줄링을 하고, 컨텍스트 스위칭을 통해 쓰레드가 소외되지 않고 cpu를 골고루 사용하게 해준다.
자바의 경우 자바 쓰레드를 하나 만들 때마다 os 레벨에서 쓰레드가 생긴다. 위와 같이 자바 쓰레드 3개를 생성하면 os 레벨에 쓰레드도 3개 생성된다. 그리고 os 레벨의 쓰레드를 os 쓰레드 혹은 커널 쓰레드라고 부른다.
커널 쓰레드는 생성 시 약 1~2MB 메모리 용량이 소모된다. 그리고 쓰레드가 많아지면 os 가 스케줄링하기 버거워지며 컨텍스트 스위칭도 많이 일어나기 때문에 쓰레드를 많이 만드는 것은 많은 고민이 필요하다.
...
현대의 어플리케이션에서는 쓰레드의 필요성이 많아지고 있다. 이에 자바 쓰레드를 계속 만들고자 하는 니즈가 생겼으며, 이 때 문제는 os 쓰레드 또한 함께 생성된다는 점이다. 이는 메모리, 컨텍스트 스위칭 부하 문제가 생기게된다.
이러한 문제에 있어 virtual thread 가 나오기 전에는 서버를 늘리거나 web flux 와 같은 reactive 프로그래밍 방식을 사용했다.
...
virtual trhead 즉 가상 쓰레드란, 자바 쓰레드와 os 쓰레드가 1:1 매핑되어 생성되는 단점을 보완하기 위해 사용된다. 해결방식은 위 이미지와 같이 자바 쓰레드에 n개의 가상 쓰레드를 생성하는 방식이다. 1:n 관계이기 때문에 가상 쓰레드가 많이 생성되더라도 자바 쓰레드는 압도적으로 적다.
그리고 자바 쓰레드는 보통 플래폼 쓰레드라 부른다. 플랫폼 스레드는 운영체제의 기본 스레딩 메커니즘을 사용하는 쓰레드를 의미하며 각 쓰레드가 운영체제의 커널 스레드로 매핑되며, 운영체제가 이들을 직접 관리한다. 그리고 이러한 플랫폼 쓰레드를 보통 캐리어 쓰레드라고 부르기도 한다.
...
정리
1) 운영체제는 n개의 쓰레드가 있을 때 n개의 cpu를 잘 활요하기 위해 스케줄링과 컨텍스트 스위칭을 통해 쓰레드가 소외되지 않고 cpu를 공고루 사용하게 해준다.
2) 자바 쓰레드를 생성 시 OS 쓰레드 (커널 쓰레드)도 함께 생성된다.
3) 쓰레드의 필요성이 많아졌으나 자바 쓰레드 생성 시 os 쓰레드도 함께 생성되어 메모리 부하, 컨텍스트 스위칭과 같은 문제가 발생한다.
4) 이에 서버를 늘리거나 web flux와 같은 reactive 프로그래밍이 주로 사용되었다.
5) 가상 쓰레드의 경우 자바 쓰레드와 os 쓰레드가 1:1로 매핑되어 생성되는 단점을 보완하기 위해 사용된다.
6) 가상 쓰레드는 자바 쓰레드에 n 개의 가상 쓰레드를 생성하는 방식이다.
7) 자바 쓰레드는 보통 플랫폼 쓰레드, 캐리어 쓰레드라 부르기도 한다.
'프로그래밍 > Java' 카테고리의 다른 글
Java Virtual Thread (3), executorService 생성 (0) | 2024.06.22 |
---|---|
Java Virtual Thread (2), Thread와 Virtual Thread (0) | 2024.06.22 |
CompletableFuture (3) - Callable 과 Future (0) | 2022.06.14 |
인터페이스 default 메소드와 static 메소드 (0) | 2022.06.09 |
메소드 레퍼런스 (0) | 2022.06.08 |