쓰레드 풀(Thread Pool)
스레드 풀은 스레드 생성 및 삭제가 빈번하게 일어남에 따라 발생하는 메모리 할당에 소모되는 비용문제를 해결하기 위해 만들어졌습니다. 그에 대한 자세한 내용은 아래에서 이어서 설명하겠습니다.
Thread Pool이 만들어진 이유
Thread가 필요하면 new 키워드를 이용해 각 Thread 인스턴스를 생성하는 방식을 사용했었습니다. 한번, 두번 사용하고 반납해야 하는 그런 상황이라면 개별적으로 Thread 인스턴스를 생성해 사용해도 상관이 없습니다. 그러나 Java 언어를 이용해 만들어지는 서버 애플리케이션은 수많은 Thread를 필요로 하며 초 단위로 Thread를 생성하여 사용하고 반납해야 합니다.
위 그림 처럼 사용자의 각각의 요청마다, 메모리에 쓰레드를 생성하고 삭제해야 합니다.
Java는 Thread 인스턴스의 start() 메서드가 호출되면 커널 스레드를 할당받아 사용합니다. 커널 스레드를 생성하고 반납하는 연산은 생각보다 비싼 연산입니다.
해당 연산이 비싼 이유는 스레드를 위한 메모리 할당, 스레드 스택 초기화 및 OS 스레드 등록을 위한 OS call을 포함하기 때문입니다.이와 관련하여 자세한 내용은 다른 포스팅에서 설명하도록 하겠습니다
만약 서버 어플리케이션에서 초 단위로 Thread를 몇 백 개 생성하고 사용하고 반납하고 한다면 애플리케이션은 메모리 부족 현상이 발생할 수 있으며, 반납한 Thread 인스턴스를 메모리에서 해제해야 하기 때문에 GC도 굉장히 바빠지며 그만큼 CPU가 해야 할 일이 많아집니다.(컨텍스트 스위칭은 많은 CPU Cycle을 소비하기 때문에 비용이 많이드는 작업이라고도 합니다)
쓰레드 생성과 메모리에서 쓰레드를 해제하는 비용을 줄이기 위해, Thread를 미리 생성해 놓고 필요할 때만 가져다가 사용하고 커널 스레드를 반납하지 않고 재사용 할 수 있도록 하는 Thread Pool이 만들어 졌습니다.
Thread Pool 방식을 사용하고, Thread Pool의 가용 스레드 갯수를 늘린다고 해서 서버 처리율 문제를 완벽히 해결할 수 있던건 아니였습니다. 이런 문제를 해결하는 다른방법으로 Spring 에서는 WebFlux라는 비동기, 논블로킹 형태의 web module을 제공해주는데요 관련하여 자세한 내용은 다른 포스팅에서 설명하도록 하겠습니다.
'프로그래밍 > Java' 카테고리의 다른 글
Singleton 패턴과 스프링에서는 Singleton 패턴을 어떻게 사용하고 있을까? (0) | 2023.01.27 |
---|---|
Long 과 AtomicLong은 어떤 차이가 있을까? (0) | 2023.01.24 |
ConcurrentHashMap은 어떻게 동시성 문제를 해결할까? (0) | 2023.01.24 |
Checked Exception VS UnChecked Exception (0) | 2022.11.19 |
Eclipse(이클립스) 단축키 Mac용 (0) | 2021.07.07 |