일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- mysql
- LV 0
- Java
- 파이썬
- Kubernetes
- 알고리즘
- 자료구조
- ubuntu
- db
- github
- 정처기
- DevOps
- 우분투
- 깃
- docker
- git
- Ai
- 자바
- 코테
- Linux
- 프로그래머스
- 인공지능
- 머신러닝
- programmers
- 데이터베이스
- Lv 2
- Python
- 쿠버네티스
- 코딩테스트
- 리눅스
- Today
- Total
Myo-Kyeong Tech Blog
[ JAVA ] 스레드 풀(Thread Pool) - Thread Pool을 사용해야 하는 이유 본문
[ JAVA ] 스레드 풀(Thread Pool) - Thread Pool을 사용해야 하는 이유
myo-kyeong 2023. 7. 16. 11:29Thread-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의 주요 작동 방식
- 서버 요청이 들어오면, Thread Pool에서 관리하는 Queue로 요청이 보내진다.
- 사용 가능한 Thread에 요청이 할당된다.
- 할당받은 Thread는 해당 요청을 처리한다.
- 요청 처리가 완료된 Thread는 제거되지 않고 다시 Thread Pool로 돌아와 다음 요청을 기다린다.
'Programming > Java' 카테고리의 다른 글
[ JAVA ] 스레드 풀(Thread Pool) - Java로 Thread Pool의 구현 및 서버 애플리케이션 활용 (0) | 2023.07.16 |
---|---|
[ JAVA ] 클라이언트 요청 순차적 처리 - Stateful VS Stateless (0) | 2023.07.12 |
[ JAVA ] JAVA 예외 처리 (Exception) - Try-Catch-Finally 문법, 예외 메시지와 스택 추적 (0) | 2023.07.10 |
[ JAVA ] JAVA 익명 클래스(Anonymous Class) (0) | 2023.07.08 |
[ JAVA ] FileInputStream 확장하여 DataInputStream 클래스 구현하기 ( java.io.DataInputStream ) (0) | 2023.06.29 |