[Java] Thread & Thread Pool

DevHwan·2022년 12월 19일
0

Program & Process & Thread

프로그램과 프로세스는 유사한 의미를 갖지만 세부적으로는 다르다.

Program : 어떤 목적을 달성하기 위해서 컴퓨터의 동작들을 하나로 모아 놓은 것이다. 어떤 작업을 위해 실행할 수 있는 정적인 상태의 파일이다.

Process : 컴연속적으로 실행되고 있는 동적인 상태의 프로그램이다. 프로세스는 시스템 자원을 할당받아 동적인 상태를 유지하게 된다. 독립적인 메모리 영역을 할당받아 작동하며, 별도의 주소 공간에 실행된다.

Thread : 프로세스가 할당 받은 자원을 이용하는 실행 단위 또는 프로세스의 특정한 수행 경로이다. 스레드는 각자 독자적인 스택 메모리를 갖는다. 그러나 힙 메모리는 서로 공유하기 때문에 동기화, 데드락 문제가 발생할 수 있다.

Concurrency & Parallelism

동시성과 병렬성은 관련성이 있지만, CS 레벨에서는 별개의 개념이다.

Concurrency : 동시성은 여러 작업을 동시에 실행할 수 있는 시스템의 기능을 의미한다. 동시성을 달성하기 위해서는 멀티 스레드를 사용할 수 있다. 각 스레드가 동시에 별도의 작업을 실행할 수 있고, 이는 단일 프로세서 환경에서 실행이 가능하여 병렬성을 의미하지는 않는다.

Parallelism : 병렬성은 일반적으로 여러 프로세서 또는 코어에서 여러 작업을 동시에 실행하는 것을 의미한다. 병렬 처리는 작업을 동시에 실행하기 위해 여러 프로세서 또는 코어가 반드시 필요하다. 이는 작업을 분할하는 문제에 있어서 동시성 달성보다 어려운 목표가 될 수 있다.

정리

  • 동시성은 시스템의 응답성과 성능 향상
  • 병렬성은 계산 의존적인 작업의 실행속도를 높이는 데 유용

Thread Pool

Thread Pool : 미리 인스턴스화 되어있는 스레드의 그룹이다. 스레드 풀에 대한 아이디어는 크게 두 가지로 출발했다.

  • 스레드를 만들때 마다 OS 커널에 접근하는 등의 비용이 크기 때문에 새로 생성하지 않고 기존의 스레드를 재 사용한다.
  • 스레드를 처음부터 너무 많이 생성해놓으면 메모리 문제가 발생할 수 있기 때문에 적당량을 유지하거나 넘어서는 안된다.

만약 Task가 스레드 풀에 접근하게 되면, 스레드 풀에 작업 요청을 하게된다. 스레드 풀 내부에는 작업을 Queue 자료구조를 이용하여 처리한다. 스레드 풀의 작업 처리 중이지 않은 스레드에 각 스레드를 작업을 진행하고 작업이 완료된 스레드는 다시 스레드 풀로 반환된다.

자바에서는 ThreadPool을 ThreadPoolExecutor라는 클래스를 이용하여 구현하고 있다.

  • maxinumPoolSize : 스레드 풀에서 가지고 있을 수 있는 스레드의 최대 개수
  • corePoolSize : 작업 큐에 작업이 없는 경우에도 유지해야 할 스레드의 최소 개수
  • keepAliveTime : 스레드가 유지될 수 있는 시간

스레드 풀은 짧고 자주 실행되는 Task에 더 유용할 것이다. 이는 이전에 설명했던 것과 같이 스레드를 새로 만들지 않고 유지하여 재사용하기 때문이다.

스레드 풀은 일반적으로 서버 애플리케이션에서 수신 요청을 처리하는 데 많이 사용된다. Java 진영에서 WAS로 많이 사용하는 Tomcat의 경우가 있다. 요청이 수신되면 스레프 풀의 스레드가 요청을 처리하는 데 사용된다. WAS는 각 요청에 대해 스레드를 새롭게 만들지 않고 스레드 풀의 스레드를 사용하게 된다. Tomcat 서버의 경우 8 version 이후부터는 Non-blocking IO를 지원하여 N개의 커넥션에 대해 한 개의 스레드에서도 처리가능하다.

Tomcat에서는 자바 스레드 풀 구현체와 유사한 정도로 처리된다.

  • max-Connection : tomcat이 최대로 처리할 수 있는 connection의 개수
  • accept-count : 작업 큐 이외의 대기열 큐의 사이즈, 작업 큐와 대기열 큐의 사이즈를 벗어나면 요청이 거절될 수 있다.

특징

  • 미리 만들어 놓은 Thread를 재사용하기 때문에 Thread 생성 비용을 줄인다.
  • Thread 개수가 정해져 있기 때문에 메모리 문제, CPU 오버헤드 문제를 해결한다.

정리

  • 스레드 풀은 응답시간과 TPS에 영향을 준다. ( TPS : 초당 시스템의 처리 양 Transaction Per Second )
  • 잘 조정된 Thread Pool은 시스템의 성능을 좋게하고 안정적인 애플리케이션 운용을 가능하게 함.
  • 부적절한 Thread Pool은 DeadLock, CPU 오버헤드, 메모리 문제를 발생시킨다.
profile
달리기 시작한 치타

0개의 댓글