호우동의 개발일지

Today :

article thumbnail

암묵적 스레딩

  • 암묵적 스레딩(implicit Threading)
    • 스레딩의 생성과 관리 책임을 앱 개발자로부터 컴파일러와 실행시간 라이브러리에게 넘기는 것
    • 앱 설계의 어려움을 극복하고 병행 및 병렬 앱 설계를 도와주는 방법

  • 응용 프로그램 개발자가 병렬로 실행할 수 있는 스레드가 아닌 작업을 식별해야 함
    • 작업은 일반적인 함수로 작성
    • 런타임 라이브러리는 다대다 모델을 사용하여 별도의 스레드에 매핑

  • 암묵적 스레딩 장점
    • 개발자는 병렬 작업만 식별하면 된다.
      • 라이브러리는 스레드 생성 및 관리에 대한 특정 세부사항을 결정

 


스레드 풀

  • 다중 스레드 서버는 아직 여러 문제를 지님
    1. 스레드를 생성하는데 소요되는 시간
      • 생성된 스레드가 단기 작업(곧 폐기될 스레드)이라면 더 문제가 됨
  1. 모든 요청마다 새 스레드를 만든다면, 동시 실행 가능한 최대 스레드 수의 한계를 정해야 함
    • 스레드를 무한정 만들면 CPU 시간, 메모리 공강 등 시스템 자원이 고갈된다.
    스레드 풀을 사용하는 이유

 

스레드 풀 특징

  • 스레드 풀(Thread Pool) : 프로세스를 시작할 때 일정한 수의 스레드를 미리 풀로 만들어두는 것
    • 해당 스레드들은 평소에 하는 하는 일 없이 대기
  • 서버는 요청을 받으면 스레드 생성 대신 스레드 풀에 있는 스레드를 제출하고 추가 요청 대기 재개
  • 풀에 사용 가능한 스레드가 있으면 깨어나고 요청이 즉시 서비스됨
  • 풀에 사용 가능한 스레드가 없으면 사용 가능한 스레드가 생길 때까지 작업 대기
  • 스레드가 서비스를 완료하면 풀로 돌아가 다시 작업 대기
  • 풀에 제출된 작업이 비동기적으로 실행할 수 있는 경우 스레드 풀이 제대로 작동

스레드 풀 장점

  • 스레드 생성보다 기존 스레드를 서비스하는 것이 종종 더 빠르다.
  • 스레드 풀은 임의 시각에 존재할 스레드 개수의 제한을 둠
    → 이러한 제한은 많은 수의 스레드를 병렬 처리할 수 없는 시스템에 도움을 줌

  • Task를 생성하는 방법을 Task로부터 분리하면 Task 실행을 다르게 할 수 있음
    • 예 : Task를 일정 시간 이후에 실행되도록 스케줄 하거나 주기적 실행 가능

 

스레드 풀에 있는 스레드의 개수

  • CPU의 수, 물리 메모리양, 동시 요청 클라이언트 최대 개수 등을 고려하여 정해질 수 있음
  • 더 정교하게 하려면, 풀의 활용도를 보며 동적으로 풀의 크기를 바꾸어줄 수 있다.
    • 그러한 구조는 시스템 부하가 적을 때에는 더 작은 풀을 유지할 수 있도록 함
      → 메모리 등의 소모를 더 줄일 수 있음

 

Window 스레드 풀 관련 함수

  • Windows API는 스레드 풀과 관련된 여러 함수 제공
    • 주기적으로 함수를 호출하거나 비동기식인 입출력 요청이 완료되었을 때,
      함수를 호출하는 등의 기능을 제공

  • QueueUserWorkItem(&PoolFunction, PVOID Param, ULONG Flags)
    • &PoolFunction : 별도의 스레드가 실행할 함수에 대한 포인터
    • PVOID Param : Fuction에 전달될 매개변수
    • ULONG Flags : 스레드 풀이 스레드를 생성하고 관리하는 방법을 가리키는 플래그

 

Java 스레드 풀

  • java.util.concurrent 패키지에는 여러 종류의 스레드 풀 구조에 대한 API가 포함
  • java.util.concurrent API에서는 세 가지 모델에 중점을 둠
    1. 단일 스레드 Executor, newSingleThreadExecutor()는 크기가 1인 풀을 생성
    2. 고정 스레드 Executor, newFixedThreadPool(int size)는 지정된 수의 스레드 풀을 생성
    3. 캐시 스레드 Executor, newCachedThreadPool()는 스레드를 재사용하는 무제한 스레드풀을 생성

 


Fork Join

  • 이 메서드를 사용하면 메인 부모 스레드가 자식 스레드를 생성(fork)한 다음,
    자식의 종료를 기다린 후 join 하고 그 시점부터 자식의 결과를 확인하고 결합할 수 있다.
  • 동기식 모델 은 종종 명시적 스레드 생성이라고 특정지 어지지만, 암시적 스레딩에도 사용 가능
    fork and join
    • 암시적 스레딩 때의 fork 단계에서는 스레드가 직접 구축되지 않고 대신 병렬 작업이 식별
      • 라이브러리는 생성되는 스레드 수를 관리하며 스레드에 작업 배정을 책임

  • fork-join 모델은 라이브러리가 생성할 실제 스레드 수를 결정하는 동기 버전의 스레드풀이다.

 


OpenMP

  • C, C++ 또는 FORTRAN으로 작성된 API와 컴파일러 디렉티브의 집합.
  • OpenMP는 공유 메모리 환경에서 병렬 프로그래밍을 할 수 있도록 도움을 준다.

 


Grand Central Dispatch

  • macOS 및 iOS 운영체제를 위해 Apple에서 개발한 기술.
  • 개발자가 병렬로 실행될 코드 섹션을 식별할 수 있도록 하는 런타임 라이브러리, API 및 언어 확장의 조합
  • GCD(Grand central Dispatch)는 스레딩에 대한 대부분의 세부사항을 관리

 


Intel 스레드 빌딩 블록

  • C++에서 병렬 응용 프로그램 설계를 지원하는 템플릿 라이브러리