Myo-Kyeong Tech Blog

[ JAVA ] 스레드 풀(Thread Pool) - Thread Pool을 사용해야 하는 이유 본문

Programming/Java

[ JAVA ] 스레드 풀(Thread Pool) - Thread Pool을 사용해야 하는 이유

myo-kyeong 2023. 7. 16. 11:29
728x90
반응형

Thread-per-Request 모델이란?

  • 서버 요청이 있을 때마다 새로운 스레드를 생성하고 처리하는 방식
  • request : Thread = 1 : 1 로 매핑되어서 하나의 request를 하나의 Thread가 처리하는 방식

 

Thread-per-Request 모델 한계

만약 Thread per request 모델의 동작 방식이 서버에 들어오는 요청마다 Thread를 새로 만들어서 처리하고 처리가 끝난 스레드를 버리는 방식으로 동작한다면 어떤 문제점이 발생할까?

1. 스레드 생성에 필요한 시간 :
스레드 생성에는 일정 시간이 소요되므로, 이로 인해 요청 처리가 늦어질 수 있다

2. 스레드 생성 및 관리 비용 : 
요청 처리 속도보다 요청이 빠르게 늘어나면 끊임없이 새로운 스레드가 생성된다. 이는 메모리 점유 및 CPU 오버헤드 증가를 초래하며, 결국 서버의 응답 능력을 저하시킨다. 

Thread per request를 요리할 때마다 식기와 조리도구를 산다고 비유해보겠습니다. 요리를 할 때마다 새로운 식기와 조리도구를 구입하면 그에 필요한 시간과 비용이 들게 됩니다. 새로운 제품을 찾아보고, 가게에 가서 사고, 집에 가져다 놓기 등 많은 시간이 소요됩니다. 비슷하게, 새로운 요청이 들어올 때마다 새로운 스레드를 생성하는 것은 많은 시간이 걸립니다. 스레드를 생성하려면 메모리를 할당하고, 초기화하고, 실행해야 하는 데 이 과정이 요청 처리시간에 추가로 더해져 요청 처리 속도가 느려지게 됩니다. 

또한 요리할 때마다 새로운 식기와 조리도구를 구입하게 된다면 단순히 시간뿐만 아니라 공간도 많이 차지하게 됩니다. 부엌에는 제한된 공간이 있는데, 계속 새로운 도구와 식기를 사게 된다면 결국 공간이 부족해져서 제대로 활용하지 못합니다. 이와 비슷하게, 요청이 들어올 때마다 새로운 스레드를 생성하면, 각 스레드가 메모리를 차지하게 됩니다. 요청이 많아질수록 더 많은 스레드가 생성되고 이로 인해 메모리가 점점 부족해지게 되어 시스템 성능 저하로 이어질 수 있습니다. 

이러한 두가지 문제점을 해결하기 위한 방법이 'Thread Pool'을 사용하는 것입니다. Thread Pool은 요리를 시작할 때마다 식기와 조리도구를 새로 사는 대신, 이미 가지고 있는 식기와 도구를 재사용하는 것과 같습니다. 이로써 스레드 생성에 필요한 시간과 비용을 절약하고 메모리를 효율적으로 사용할 수 있습니다. 

 

Thread Pool

  • 미리 정해진 개수의 스레드를 생성해두고 요청이 발생할 때 이를 재사용하는 방식 

 

Thread Pool의 주요 작동 방식

  1. 서버 요청이 들어오면, Thread Pool에서 관리하는 Queue로 요청이 보내진다.
  2. 사용 가능한 Thread에 요청이 할당된다. 
  3. 할당받은 Thread는 해당 요청을 처리한다. 
  4. 요청 처리가 완료된 Thread는 제거되지 않고 다시 Thread Pool로 돌아와 다음 요청을 기다린다. 

 

728x90
반응형