[CS]Process vs Thread
[CS] Thread
기존의 스레드라고 부르던 것은 정확히는 플랫폼 스레드(Platform Thread)이다.

이러한 한계 때문에, 대규모 트래픽을 처리하는 서버에서는 '1 요청-1 스레드' 모델을 사용하기가 점점 어려워짐
스레드를 필요할때마다 생성하고, 작업 종료시 소멸시키는 방식은 너무 많은 비용(CPU와 메모리 사용)을 소모하고 성능 저하를 초래한다. 따라서 다수의 스레드를 미리 생성해놓고 필요할 때마다 이들을 재사용하는 방식인 풀링 방식이 등장
가상 스레드는 높은 처리량의 동시성 애플리케이션을 개발하고 유지보수하기 위한 경량 스레드이다.
가상 스레드는 Platform Thread와 M:1 매핑된다.
즉, 여러 작업을 동시에 수행하면서도 Platform Thread 생성 비용을 절감할 수 있다.
생성비용이 작기 때문에 스레드 풀을 만드는 행위 자체가 낭비가 될 수 있다. 필요할 때마다 생성하고 GC(Garbage Collector)에 의해 소멸되도록 방치
가상스레드는 블로킹 작업이 발생해도 다른 가상스레드가 계속 실행될 수있다는 장점이 있지만, 모든 가상 스레드가 동일한 OS에서 실행되는 경우 OS 스레드가 블로킹되면 전체 애플리케이션 성능이 저하될 수 있다.
해결:
가상 스레드는 OS 스레드보다 훨씬 많이 생성될 수 있으므로, 스레드 로컬 변수를 과도하게 사용하면 메모리 사용량이 급증하여 성능에 악영향을 끼칠 수 있다.
기존에는 스레드 풀이 작동해서 요청을 작게 받고 DB 커넥션 풀로인해 DB로는 적당한 TPS가 들어가는 형태였지만, 가상스레드는 풀링을 사용하지 않아, 250개의 요청이 들어오면 250개 요청 전부 DB에 전송되서 커넥션풀이 소진될 가능성이 있다.
synchronized 키워드를 사용하여 모니터 락을 획득하고 블로킹 I/O 작업을 수행하는 경우 JVM이 synchronized 블록의 동기화를 위해 플랫폼 스레드를 특정 가상 스레드에 고정시키는데, 이때 Pinning이 발생한다.
이렇게 되면, 다른 가상 스레드를 실행시킬 수 없게되어 성능에 문제가 발생한다.
해결:
https://comdolidol-i.tistory.com/414
https://yoonseon.tistory.com/151
https://www.youtube.com/watch?v=Q1jZtN8oMnU