본문 바로가기

개발 지식/Java

Thread Pool이란?

반응형

Thread Pool

회사 제품의 코드를 보면서 긴가민가했던 개념들을 정리해볼라고 적는 포스팅

 

Process VS Thread

맨날 프로세스가 더 큰거, 쓰레드는 그 프로세스 안에서 돌아가는 단위로서 프로세스의 자원을 공유하는 것이라고만 생각한다. 이 기회에 깔~끔하게좀 정리해보자.

  • Process : 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다. 스케쥴링의 대상이 되는 작업(task)라는 용어와 거의 같은 의미로 쓰인다. 여러개의 프로세서를 사용하는 것을 멀티프로세싱이라고 하며 같은 시간에 여러 개의 프로그램을 띄우는 시분할 방식을 멀티태스킹이라고 한다.
  • Thread : 쓰레드는 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램(프로세스)는 하나의 쓰레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 쓰레드를 동시에 실행할 수 있다. 이를 멀티쓰레드라고 한다.

멀티프로세스와 멀티쓰레드는 양쪽 모두 여러 흐름이 동시에 진행된다는 공통점을 가지고 있다. 하지만 멀티프로세스에서 각 프로세스는 독립적으로 실행되며 각각 별개의 메모리를 차지하고 있는 것과 달리 멀티쓰레드는 프로세스 내의 메모리를 공유해 사용할 수 있다. 또한 프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 빠르다.

멀티쓰레드의 다른 장점은 CPU가 여러 개일 경우에 각각의 CPU가 스레드 하나씩을 담당하는 방법으로 속도를 높일 수 있다. 이러한 시스템에서는 여러 스레드가 실제 시간상으로 동시에 수행될 수 있기 때문이다. 멀티쓰레드의 단점에는 각각의 스레드 중 어떤 것이 먼저 실행될지 그 순서를 알 수 없다는 것이 있다.

 

동시성(Concurrency)과 병렬성(Parallelism)

동시성은 싱글 코어에서 멀티 스레드를 동작시키기 위한 방식으로 멀티 태스킹을 위해 여러 개의 스레드가 번갈아가면서 실행되는 성질을 말한다. 동시성을 이용한 싱글 코어의 멀티 태스킹은 각 스레드들이 병렬적으로 실행되는 것처럼 보이지만 사실은 번갈아가면서 조금씩 실행되고 있는 것이다.

병렬성은 멀티 코어에서 멀티 스레드를 동작시키는 방식으로, 한 개 이상의 스레드를 포함하는 각 코어들이 동시에 실행되는 성질을 말한다. 병렬성은 데이터 병렬성(Data parallelism)과 작업 병렬성(Task parallelism)으로 구분된다.

 

데이터 병렬성

데이터 병렬성은 전체 데이터를 쪼개 서브 데이터들로 만든 뒤, 서브 데이터들을 병렬 처리하여 작업을 빠르게 수행하는 것을 말한다. 자바8에서 지원하는 병렬 스트림이 데이터 병렬성을 구현한 것이다. 서브 데이터는 멀티 코어의 수만큼 쪼개어 각각의 데이터들을 분리된 스레드에서 병렬 처리한다.

 

작업 병렬성

작업 병렬성은 서로 다른 작업을 병렬 처리하는 것을 말한다. 대표적인 예는 웹 서버로, 각각의 브라우저에서 요청한 내용을 개별 스레드에서 병렬로 처리한다.

 

그래서 Thread Pool이란?

작업 처리에 사용되는 스레드를 제한된 개수만큼 정해놓고 작업 큐(Queue)에 들어오는 작업들을 하나씩 스레드가 맡아 처리하는 것을 말한다. 이렇게 하는 이유에 있어서는 리소스(CPU, Memory등)는 언제나 제한이 되어있기 때문에 관리를 해야할 필요가 있어서다. Java의 경우, 기본적으로 Executors, ExecutorService를 이용하여 Thread Pool을 만들 수 있다.

 

Single Thread Pool
ExecutorService executorService = Executors.newSingleThreadExecutor();
  • 단일 Worker Thread.
  • 실패 시, 새로운 Thread를 생성하지 않음.
Fixed Thread Pool
ExecutorService executorService = Executors.newCachedThreadPool();
  • 필요에 따라서 새로운 Thread를 생성하며, 이전에 생성된 Thread가 존재하면 재사용
  • 기본적으로 60초정도 Thread가 유지
  • 비동기 작업에 사용하는데 합리적이다.
Scheduler Thread Pool
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(int corePoolSize);
  • 지정된 delay 후에 실행하거나 주기적으로 실행하도록 명령을 예약
Work Stealing Thread Pool
ExecutorService executorService = Executors.newWorkStealingPool(int parallelism);
  • 자바 8에서 새로 생긴 Thread Pool
  • 지정된 parallelism을 지원할만큼 충분한 Thread를 유지하고 여러 Queue를 사용하여 경합을 줄임
  • Thread를 동적으로 늘리고 줄임
  • 작업이 실행되는 순서를 보장하지 않음

 


반응형

'개발 지식 > Java' 카테고리의 다른 글

[JAVA] JDBC, JPA/Hibernate, MyBatis 차이점  (0) 2020.04.21
[Java] Jetty 란?  (0) 2020.04.06
빌더 패턴(Builder Pattern) 이란  (0) 2020.02.24
[JAVA] Logback 사용법  (0) 2020.02.19
[Java] Generic 사용법  (0) 2020.02.10