[CS] 프로세스 와 쓰레드 (2)쓰레드 풀

Nick·2023년 8월 29일
0

CS

목록 보기
7/7
post-thumbnail
post-custom-banner

쓰레드 풀이란... 출처

쓰레드 풀

  • 컴퓨터 프로그래밍에서 쓰레드 풀은 컴퓨터 프로그램에서 실행의 동시성을 달성하기위한 소프트웨어 디자인 패턴입니다.
  • 프로그램이 작업을 동시에 실행할 수 있도록 여러 스레드를 미리 생성해두고 유지 관리합니다.
  • 여러 Thread를 동시에 만들어 실행(병렬처리)할 수 있습니다.
  • 🤫 그렇다고 해서 Thread를 계속 늘려가는 건 좋은 것 일까?
    • 당연히 아닙니다.
      하드웨어의 제한적인 사항(CPU, Memory 등)이 있기 때문에 관리할 필요가 있습니다.
      그래서 쓰레드 풀 이라는 개념을 이용합니다.
  • 쓰레드 풀은 작업 처리에 사용되는 쓰레드를 제한된 개수만큼 정해 놓고 작업 큐(Queue)에 들어오는 작업들을 하나씩 쓰레드가 맡아 처리하는 것을 말합니다.
    • 치킨집에서 직원 뽑기가 어려우니 직원들을 미리 뽑아두는 것과 비슷합니다.
    • 해야할 일을 순서대로(작업 큐) 직원들에게 할당 해주며 처리하도록 합니다.

💁 쓰레드 풀의 동작

  1. 초기화: 쓰레드 풀을 사용하기 전에 초기화해야 합니다. 이 단계에서는 쓰레드 풀의 크기, 최대 쓰레드 수, 작업 큐 등의 매개변수를 설정합니다.
  2. 작업 수신: 쓰레드 풀은 작업을 수신하고 처리할 준비를 합니다. 작업은 일반적으로 작업 큐에 추가됩니다.
  3. 작업 수행: 쓰레드 풀에서는 미리 생성된 쓰레드들이 작업 큐를 모니터링하고 대기 중인 작업을 가져와 처리합니다. 이때 쓰레드 풀 내의 쓰레드들은 일반적으로 무한 루프를 돌면서 작업을 가져오기 위해 대기합니다.
  4. 작업 처리: 쓰레드 풀의 스레드가 작업을 가져와서 처리합니다. 작업은 일반적으로 작업 큐에서 FIFO(선입선출) 방식으로 가져오게 됩니다.
  5. 작업 완료 및 반환: 작업이 완료되면 해당 결과를 반환하고, 쓰레드는 다시 작업 큐에서 새로운 작업을 가져오기 위해 대기 상태로 돌아갑니다.
  6. 작업 대기: 작업 큐에 새로운 작업이 추가되면 쓰레드 풀의 스레드들은 대기 상태를 벗어나 작업을 가져와 처리합니다. 이를 반복하여 계속적으로 작업을 수행합니다.
  7. 종료: 쓰레드 풀을 더 이상 사용하지 않을 때 종료합니다. 종료할 때는 모든 작업이 완료되었는지 확인하고, 필요에 따라 남은 작업들을 처리하거나 버릴 수 있습니다.

쓰레드 풀을 사용하는 이유

  1. 프로그램 성능 저하를 방지하기 위해
    • 매번 발생하는 작업을 병렬처리하기 위해 쓰레드를 생성/수거하는 데 따른 부담은 프로그램 전체적인 퍼포먼스를 저하시킨다. 따라서 쓰레드풀을 만들어 놓고 사용합니다.
    • 쓰레드 또한 프로세스가 할당한 메모리를 사용합니다.
    • 즉, Java의 경우 쓰레드를 생성하면 JVM 메모리를 소비하게 되는 것이다. 쓰레드 자체도 레지스터와 스택을 가지고, 쓰레드도 컨텍스트 스위칭이 일어나기 때문에 쓰레드 생성에 따른 메모리 할당을 무시할 수 없습니다.
  2. 다수의 사용자 요청을 처리하기 위해
    • 대규모 프로젝트에서 특히 중요합니다.
    • 다수의 사용자의 요청을 수용하고, 빠르게 처리하고 대응하기 위해 쓰레드풀을 사용합니다.
    • 특히 Bottle Neck 현상이 발생하는 I/O 작업과 데이터베이스 작업에서 주로 사용됩니다.
    • 쓰레드가 아무리 빠르게 생성되더라도 시스템 스케줄러에서 쓰레드의 우선순위를 매번 할당해야 하는데, 쓰레드풀을 이용하면 일정 쓰레드가 이미 생성되기 때문에 쓰레드풀에 의해 라이프 사이클이 관리되고, 쓰레드 풀에 의해 작업이 큐를 이용하게 되어 우선순위가 배분되고 처리됩니다.

쓰레드 풀의 장단점

쓰레드 풀의 장점

  • 쓰레드를 생성/수거하는데 비용이 들지 않습니다.
  • 쓰레드가 생성될 때 OS가 메모리 공간을 확보해주고 메모리를 쓰레드에게 할당해줍니다.
  • 쓰레드 풀을 미리 만들어 두기 때문에 처음에 생성하는 비용은 들지만 이전의 쓰레드를 재사용할 수 있으므로 시스템 자원을 줄일 수 있고, 작업을 요청 시 이미 쓰레드가 대기 중인 상태이기 때문에 작업을 실행하는 데 딜레이가 발생하지 않습니다.

쓰레드 풀의 단점

  • thread pool에 thread를 너무 많이 생성해 두었다가 사용하지 않으면 메모리 낭비가 발생합니다.

  • Thread pool의 단점 개선 : Fork Join Thread Pool

    기존 쓰레드 풀을 개선하기 위한 방법으로 Java 7 이상의 쓰레드 풀에서 사용되고 있다. 기본적으로 큰 업무를 작은 업무로 나누어 배분해서, 일을 한 후에 일을 취합한 형태입니다.

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

동시성

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

병렬성

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

  • 데이터 병렬성
    데이터 병렬성은 전체 데이터를 쪼개 서브 데이터들로 만든 뒤, 서브 데이터들을 병렬 처리하여 작업을 빠르게 수행하는 것을 말합니다.
    자바8에서 지원하는 병렬 스트림이 데이터 병렬성을 구현한 것입니다.
    서브 데이터는 멀티 코어의 수만큼 쪼개어 각각의 데이터들을 분리된 스레드에서 병렬 처리합니다.
  • 작업 병렬성
    작업 병렬성은 서로 다른 작업을 병렬 처리하는 것을 말합니다.
    대표적인 예는 웹 서버로, 각각의 브라우저에서 요청한 내용을 개별 스레드에서 병렬로 처리합니다.

📌 쓰레드 풀 요약

작업 처리에 사용되는 쓰레드를 제한된 개수만큼 정해 놓고,
작업 큐에 들어오는 작업들을 하나씩 쓰레드가 맡아 처리하는 기법

profile
배우고 도전하는것을 멈추지 않는 개발자 입니다.
post-custom-banner

0개의 댓글