쓰레드 풀이란... 출처
- 컴퓨터 프로그래밍에서 쓰레드 풀은 컴퓨터 프로그램에서 실행의 동시성을 달성하기위한 소프트웨어 디자인 패턴입니다.
- 프로그램이 작업을 동시에 실행할 수 있도록 여러 스레드를 미리 생성해두고 유지 관리합니다.
- 여러 Thread를 동시에 만들어 실행(병렬처리)할 수 있습니다.
- 🤫 그렇다고 해서 Thread를 계속 늘려가는 건 좋은 것 일까?
- 당연히 아닙니다.
하드웨어의 제한적인 사항(CPU, Memory 등)이 있기 때문에 관리할 필요가 있습니다.
그래서 쓰레드 풀 이라는 개념을 이용합니다.- 쓰레드 풀은 작업 처리에 사용되는 쓰레드를 제한된 개수만큼 정해 놓고 작업 큐(Queue)에 들어오는 작업들을 하나씩 쓰레드가 맡아 처리하는 것을 말합니다.
- 치킨집에서 직원 뽑기가 어려우니 직원들을 미리 뽑아두는 것과 비슷합니다.
- 해야할 일을 순서대로(작업 큐) 직원들에게 할당 해주며 처리하도록 합니다.
💁 쓰레드 풀의 동작
- 프로그램 성능 저하를 방지하기 위해
- 매번 발생하는 작업을 병렬처리하기 위해 쓰레드를 생성/수거하는 데 따른 부담은 프로그램 전체적인 퍼포먼스를 저하시킨다. 따라서 쓰레드풀을 만들어 놓고 사용합니다.
- 쓰레드 또한 프로세스가 할당한 메모리를 사용합니다.
- 즉, Java의 경우 쓰레드를 생성하면 JVM 메모리를 소비하게 되는 것이다. 쓰레드 자체도 레지스터와 스택을 가지고, 쓰레드도 컨텍스트 스위칭이 일어나기 때문에 쓰레드 생성에 따른 메모리 할당을 무시할 수 없습니다.
- 다수의 사용자 요청을 처리하기 위해
- 대규모 프로젝트에서 특히 중요합니다.
- 다수의 사용자의 요청을 수용하고, 빠르게 처리하고 대응하기 위해 쓰레드풀을 사용합니다.
- 특히 Bottle Neck 현상이 발생하는 I/O 작업과 데이터베이스 작업에서 주로 사용됩니다.
- 쓰레드가 아무리 빠르게 생성되더라도 시스템 스케줄러에서 쓰레드의 우선순위를 매번 할당해야 하는데, 쓰레드풀을 이용하면 일정 쓰레드가 이미 생성되기 때문에 쓰레드풀에 의해 라이프 사이클이 관리되고, 쓰레드 풀에 의해 작업이 큐를 이용하게 되어 우선순위가 배분되고 처리됩니다.
thread pool에 thread를 너무 많이 생성해 두었다가 사용하지 않으면 메모리 낭비가 발생합니다.
Thread pool의 단점 개선 : Fork Join Thread Pool
기존 쓰레드 풀을 개선하기 위한 방법으로 Java 7 이상의 쓰레드 풀에서 사용되고 있다. 기본적으로 큰 업무를 작은 업무로 나누어 배분해서, 일을 한 후에 일을 취합한 형태입니다.
싱글 코어에서 멀티 스레드를 동작시키기 위한 방식으로 멀티 태스킹을 위해 여러 개의 스레드가 번갈아가면서 실행되는 성질을 말합니다. 동시성을 이용한 싱글 코어의 멀티 태스킹은 각 스레드들이 병렬적으로 실행되는 것처럼 보이지만 사실은 번갈아가면서 조금씩 실행되고 있는 것입니다.
멀티 코어에서 멀티 스레드를 동작시키는 방식으로, 한 개 이상의 스레드를 포함하는 각 코어들이 동시에 실행되는 성질을 말합니다. 병렬성은 데이터 병렬성(Data parallelism)과 작업 병렬성(Task parallelism)으로 구분됩니다.
- 데이터 병렬성
데이터 병렬성은 전체 데이터를 쪼개 서브 데이터들로 만든 뒤, 서브 데이터들을 병렬 처리하여 작업을 빠르게 수행하는 것을 말합니다.
자바8에서 지원하는 병렬 스트림이 데이터 병렬성을 구현한 것입니다.
서브 데이터는 멀티 코어의 수만큼 쪼개어 각각의 데이터들을 분리된 스레드에서 병렬 처리합니다.- 작업 병렬성
작업 병렬성은 서로 다른 작업을 병렬 처리하는 것을 말합니다.
대표적인 예는 웹 서버로, 각각의 브라우저에서 요청한 내용을 개별 스레드에서 병렬로 처리합니다.
📌 쓰레드 풀 요약
작업 처리에 사용되는 쓰레드를 제한된 개수만큼 정해 놓고,
작업 큐에 들어오는 작업들을 하나씩 쓰레드가 맡아 처리하는 기법