본문 바로가기
TIL/CS

쓰레드와 쓰레드 풀

by J1-H00N 2023. 8. 24.

프로세스와 쓰레드의 차이점

  • 프로세스
    • 자신만의 고유 공간(code, data, heap, stack)과 자원을 할당받아 사용
    • 다른 프로세스의 변수나 자료에 접근 불가
    • 프로세스 만으로 작업을 처리하면 프로세스를 생성할 때 많은 시간이 소요되고, 스위칭의 비효율성이 커진다.
    • 프로세스 간 통신은 비용이 비싸 통신이 어려워짐
  • 쓰레드
    • 다른 쓰레드와 공간과 자원을 고유하며 사용(stack만 따로 사용)
    • 프로세스보다 실행 단위가 작아 생성 및 소멸에 대한 오버헤드 감소
    • 자원을 공유하기 때문에 context switching이 빠름
    • 프로세스 간 통신 시간, 방법 어려움 해소

 

프로세스와 쓰레드의 주소공간

  • 프로세스
    • 각각 독립된 메모리 영역을 할당받음
    • 최소 1개의 쓰레드(메인 쓰레드)를 가지고 있다.
    • 기본적으로 다른 프로세스의 자원에 접근 불가
    • 다른 프로세스의 자원에 접근하기 위해선 프로세스 간 통신(IPC)를 사용해야 함
    • CPU는 한 번에 한 개의 프로세스만 처리할 수 있기 때문에 프로세스들을 번갈아 가며 실행하고 관리해야 한다.
  • 쓰레드
    • 프로세스 내에서 필요한 stack만 할당받고 나머지는 공유
    • 서로 heap 영역의 자원을 수정할 수 있음

 

멀티 프로세스와 멀티 쓰레드

멀티 프로세스 - 하나의 OS 안에서 여러 프로세스가 실행되는 것

멀티 쓰레드 - 하나의 프로세스가 여러 작업을 여러 쓰레드를 사용해 동시에 처리하는 것

 

쓰레드 풀

  • 프로그램에서 실행의 동시성을 달성하기 위한 소프트웨어 디자인 패턴
  • 프로그램이 동시에 작업할 수 있도록 여러 쓰레드를 미리 생성하고 유지 관리
  • 쓰레드를 계속해서 늘려나가는 것은 좋지 않기 때문에 관리할 필요가 있고, 그래서 쓰레드 풀을 사용
  • 쓰레드 풀은 쓰레드를 제한된 개수만큼 정해놓고 큐에 들어오는 작업들을 쓰레드가 맡아 처리하는 것
  • 동작 순서
    1. 초기화 : 쓰레드 풀을 사용하기 전 크기, 최대 쓰레드 수, 작업 큐 등의 매개변수 설정
    2. 작업 수신 : 쓰레드 풀이 작업을 처리하고 수신할 준비(작업은 일반적으로 Job Queue에 들어옴)
    3. 작업 수행 : 미리 생성된 쓰레드들이 작업 큐를 모니터링하고 대기 중인 작업을 가져와 처리한다. 이때 쓰레드들은 일반적으로 무한루프를 돌면서 작업을 가져오기 위해 대기
    4. 작업 처리 : Job Queue에서 선입선출 방식으로 작업을 가져와 수행
    5. 작업 완료 및 반환 : 작업이 완료되면 결과를 반환하고 대기 상태로 돌아감
    6. 작업 대기 : 작업 큐에 작업이 추가되면 대기 상태의 쓰레드들이 다시 작업을 가져오고 아니면 대기. 이를 반복
    7. 종료 : 모든 작업이 완료되었는지 확인하고, 필요에 따라 남은 작업들을 처리하거나 버림.

 

사용 이유

  1. 프로그램 성능 저하를 방지하기 위해
    • 병렬처리가 필요할 때마다 쓰레드를 생성하고 수거하는 작업은 비용이 많이 필요해 미리 쓰레드 풀을 만들어 놓고 사용
  2. 다수의 사용자 요청을 처리하기 위해
    • 다수의 사용자가 보내는 요청을 수용하고 빠르게 대응하기 위해 쓰레드 풀을 사용
    • 특히 I/O 작업과 데이터베이스 작업은 병목 현상이 일어나기 쉬워 자주 사용됨
    • 필요할 때마다 생성하면 시스템 스케쥴러가 매 쓰레드마다 우선순위를 새롭게 할당해야 하는데, 쓰레드 풀은 미리 쓰레드를 생성해 놓기 때문에 라이프 사이클이 관리되고 쓰레드 풀에 의해 우선순위가 배분되고 처리됨

장점

  • 쓰레드 생성/수거에 비용이 거의 들지 않음
  • 처음에만 비용이 들고 나중에는 쓰레드를 재사용하기 때문에 시스템 자원 낭비를 줄일 수 있고 작업 요청 시 대기 중인 쓰레드가 있기 때문에 딜레이가 발생하지 않는다.

단점

  • 처음에 너무 많은 쓰레드를 생성해 두면 메모리 낭비가 발생

 

쓰레드 풀의 특성

  • 동시성
    • 싱글 코어에서 멀티 쓰레드를 동작시키기 위한 방식으로 멀티 태스킹을 위해 여러 개의 쓰레드가 번갈아가면서 실행되는 성질
    • 싱글 코어의 멀티 태스킹은 각 쓰레드들이 병렬적으로 실행되는 것처럼 보이지만 사실은 번갈아가며 조금씩 실행되는 것
  • 병렬성
    • 멀티 코어에서 멀티 쓰레드를 동작시키기 위한 방식으로 한 개 이상의 쓰레드를 포함하는 각 코어들이 실행되는 성질
    • 이는 데이터 병렬성과 작업 병렬성으로 구분됨
    • 데이터 병렬성
      • 전체 데이터를 쪼개 서브 데이터로 만든 뒤 서브 데이터들을 병렬 처리하여 작업을 빠르게 수행하는 것
      • 서브 데이터는 코어의 개수만큼 쪼개어 각각의 데이터들을 분리된 쓰레드에서 병렬 처리한다.
    • 작업 병렬성
      • 서로 다른 작업을 병렬 처리하느 것

 

 

'TIL > CS' 카테고리의 다른 글

디자인 패턴  (0) 2023.10.11
DBMS의 기능과 종류  (0) 2023.08.30
프로그램과 프로세스  (0) 2023.08.22
CPU와 메모리 예상 문답  (0) 2023.08.22
CPU와 메모리  (0) 2023.08.21