CS

쓰레드와 쓰레드풀

index.ys 2023. 7. 2. 19:06

쓰레드

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

프로세스

  • 프로그램을 실행하는 주체
  • 프로세스만의 배정된 고유한 공간이 존재
  • 프로세스는 최소 하나의 쓰레드를 보유하고있음
  • 프로세스 생성에 큰 오버헤드 발생
  • 문맥교환시 오버헤드 발생
  • 프로세스 간의 통신이 어렵다 ( 자원을 공유하는것이 어렵다 ) => 메모리공유, 세마포어 , 소켓 등을 통해 프로세스간 자원 공유 가능

쓰레드

  • 작업을 실행하는 주체
  • 프로세스에 할당된 자원( code, data, heap )을 공유 stack만 따로 할당받음 
  • 모든 프로세스는 1개이상의 쓰레드 존재
  • 프로세스의 자원을 할당받음

차이점

  • 프로세스는 프로세스간 자원을 공유할 수 없지만 쓰레드는 쓰레드 간 자원을 공유한다  ( code, data, heap )

* 중요한점 : stack은 각 쓰레드가 가지는 독립적으로 가지는 메모리공간으로, 함수지역변수를 선언할때 사용됨, 호출된 함수가 다시 돌아올 메모리 주소, 매개변수 포함됨 , stack은 LIFO형태로 동작하는 자료구조, 스택은 동적 데이터로 프로세스가 실행될때 정해진 크기만큼 메모리를 할당함, 스택 오버플로우는 스택에 더이상 공간이 없어 스택프레임을 할당할 수 없는 상태 => 재귀호출이 지나치게 깊거나 지역변수가 많을때 발생

주소공간

프로그램

  • 어떤 작업을 위해 실행할 수 있는 파일
  • 켬퓨터에서 연속적( 문맥교환 context switching )으로 실행하고 있는 컴퓨터 프로그램 ex) 포토샵, 롤, 구글 크롬
  • OS로부터 시스템 자원을 할당 받는 자원의 단위

프로세스

  • 각 프로세스별로 독립된 영역(공간)을 가짐 code, data , stack , heap
    • code : 프로그래머가 작성한 코드가 저장되는 공간 ex) let name = kim
    • data : 코드가 실행되면서 필요한 환경, 파일 등 데이터가 저장되는 영역  ex) 환경변수, config.json, package.json
    • stack : LIFO 구조로 동작하는 자료구조, push and pop, 함수호출과 복귀를 관리 (복귀할 메모리 주소), 지역변수, 매개변수
    • heap : 동적으로 할당되는 데이터관리, 배열, 객체, 메모리누수 가능, 동시성 제어, 프로그래머가 직접 할당 할 수 있는 저장공간

동기화

  • 실핸순서와 자원의 일관성보장을 위해 동기화 되어야함
  • 프로세스를 올바른 실행순서로 실행하기
  • 상호배제를 하여 동시에 접근하면 안되는 자원에 하나의 프로세스만 접근해야함
  • 공유자원 : 동시에 실행되는 프로세스 중 공동으로 사용하는 자원 ex) 전역변수, package.json, 환경변수 등
  • 임계구역 : 공유자원에 접근하는 코드영역

쓰레드

  • 프로세스 내에서 실행되는 여러 흐름의단위
  • 프로세스의 특정한 수행경로
  • 프로세스가 할당받은 자원을 이용하는 최소실행단위
  • 프로세스가 할당받은 자원중 code , data, heap영역만 공유하고 stack 영역은 분리.

쓰레드풀

  • 컴퓨터 프로그램에서 실행의 동시성을 달성하기 위한 디자인 패턴
  • 워커쓰레드와 쓰레드풀로 구성됨
  • 프로세스 내에서 여러개의 쓰레드를 생성하여 작업을 병렬적으로 처리할 수 있음 => 멀티 쓰레드
  • 작업이 실행되기전 미리 쓰레드를 생성하여 작업이 실행되면 작업큐를 통해 작업을 할당받아 작업을 순서대로 처리
  • 초기화 -> 작업 수신 -> 작업 수행 -> 작업 처리 -> 작업 완료 -> 작업 대기 -> 종료

쓰레드풀 사용이유

  • 프로그램 성능저하 방지 : 작업발생시마다 쓰레드를 생성하지 않고 미리 생성하여 작업을 받아 처리함
  • 쓰레드도 프로세스가 할당받은 메모리를 사용
  • 다수의 요청처리 : 다수의 사용자의 요청을 수용, 처리 ,대응
  • 병목현상이 발생하는 데이터베이스 인풋 아웃풋 작업에 사용

쓰레드풀 장단점

장점

  • 쓰레드 생성/수거시 비용발생 x
  • 쓰레드가 생성될때 os가 메모리공간을 확보해주고 메모리를 쓰레드에게 할당해줌
  • 쓰레드 풀 생성시 작업을 끝낸 쓰레드는 재사용 가능

단점

  • 작업보다 많은 쓰레드를 쓰레드풀이 생성하였을때 메모리 낭비 발생

*fork join thread pool

  • 작업을 병렬로 처리하기 위한 방법으로 작업을 작은 조각으로 분할하고 분할한 작업을 각각 스레드에 할당하여 작업이 동시에 처리하고 처리된 결과를 다시 결합하는 방식 => 문제를 효율적으로 해결

동시성과 병렬성

동시성

  • 싱글코어에서 멀티스레드를 동작시키기 위한 방식
  • 여러개의 스레드를 번걸아 가면서 실행되는 성질
  • 동시에 실행되는것이 아닌 여러개의 스레드가 번갈아가면서 빠른시간에 연속적으로 실행되는것

병렬성

  • 멀티코어에서 멀티 스레드를 동작 시키는 방식

데이터 병렬성

  • 동일한 작업을 쪼개 서브데이터들로 나누고 서브 데이터들을 병렬처리하여 작업을 빠르게 수행하는것

작업 병렬성

  • 서로 다른 작업을 병렬 처리하는 것 ex) 웹 브라우저( 프로세스 )는 여러개의 탭( 멀티 스레드)에서 실행되는 작업들을 실행함