
thread는 관리 주체에 따라 user level thread와 kernel level thread로 구분할 수 있다.

💡 user level thread는 세 가지 구현 방식이 있는데, Java의 thread는 (b)에 해당한다고 한다
Spring Boot 같은 애플리케이션에서 사용자 요청을 처리하기 위해서는 하나의 thread가 사용되는데, OS thread 개수는 유한하기 때문에 throughput을 높이는 데 한계가 있다.
이 문제를 해결하기 위해 reactive programming이 발전했지만 진입장벽이 높고, 디버깅이 힘들다는 문제가 있다.
결국, Java 21에는 virtual thread라는 개념이 추가되었다.
virtual thread는 JVM 자체적으로 thread를 scheduling하여 여러 개의 thread를 하나의 kernel level thread로 매핑함으로써 throughput을 높일 수 있다.

💡 virtual thread(N) : user level thread(1) : kernel level thread(1) 구조이다
그리고 일반 thread에 비패 stack memory 크기가 작고, user mode 내에서 생성되어 kernel 영역 호출이 적기 때문에 context switch 비용 또한 저렴하다.
하지만 그렇기 때문에 context switch 비용이 빈번한 I/O 작업이 많은 환경에서 쓰는 것이 적합하며, CPU 작업이 많은 환경에서는 오히려 성능이 떨어질 수 있다.
💡 일반적으로 많은 프로그래밍 모델에서는 I/O 작업이 수행될 때 CPU가 다른 작업을 수행할 수 있도록 작업을 전환하는 context switch가 발생한다