Implicit Threading (암묵적 스레딩)
Implicit Threading란?
Implicit Threading은 스레딩의 생성과 관리 책임을 개발자가 하는것이 아닌 컴파일러와 런타임 라이브러리에게 넘겨주는것이다. 개발자는 병렬로 실행할 수 있는 작업만 식별하여 작업을 함수로 작성한다. 이후 런타임 라이브러리를 통해 가용한 스레드에 매핑된다.
결국 스레드 생성과 관리는 시스템에 맞기고 어플리케이션에서는 라이브러리를 통해 스레드에 필요한 작업을 맵핑만하면 된다.
Thread Pool
웹 서버에서 모든 요청마다 새로운 스레드를 만들어서 서비스를 제공한다면 시스템에는 무한한 스레드가 생성될것이다. 하드웨어는 한정적이므로 계속해서 늘어나다가 늘어날 수 없는 시점이 다가올것이다. 이러한 문제를 해결하는 방법이 Thread Pool
이다.
스레드 풀은 프로세스를 시작할때 일정한 수의 스레드를 생성해두는 것이다. 간단하게 스레드 풀의 동작 방식은 아래와 같다.
- 웹서버는 요청을 받으면 스레드를 생성하는것이 아닌 사용중이지 않은 스레드에 요청을 수행하도록 한다.
- 만약 모든 스레드가 사용중이라면 사용 가능한 스레드가 생길때까지 작업을 대기한다.
Fork Join
메인 부모 스레드가 하나 이상의 자식 스레드를 fork한 다음 자식의 종료를 기다린 후 join하고 그 시점 부터 자식의 결과를 확인하고 결합하는 방법이다. fork 단계에서 스레드가 직접 구축되지 않고 병렬 작업만 할당하게 된다. 라이브러리는 생성되는 스레드 수를 관리하며 스레드에 작업을 배정한다. 결과적으로 fork-join은 라이브러리가 생성할 실제 스레드 수를 결정하는 동기 버전의 스레드 풀이다.
이전 pThread에서 봤던 fork-join과 같은 모델이기 때문에 explicit Threading(명시적 스레딩)이라 생각할 수 있다. 하지만 implicit Threading에서 fork-join과 pThread의 fork-join에서 다른점은 개발자가 직접 스레드 생성을 하지 않는다. 그림과 같이 fork시 작업만 넘겨주고 스레드 생성, 관리 부분은 어디에도 볼 수 없다. 생성 관리를 개발자가 아닌 라이브러리로 책임을 넘겼기 때문에 implicit Threading으로도 사용된다.
OpenMP
openMp는 공유 메모리 환경에서 병렬 실행을 가능하게 해준다. 아래는 C프로그램에서 OpenMp를 사용한 예제 이다.
#include <omp.h>
#include <stdio.h>
int main(){
// 병렬 영역 선언
#pragma omp parallel
{
printf("I am a parallel region");
}
return 0;
}
OpenMp가 #pragma omp parallel
과 같은 컴파일러 디렉티브를 만나면 시스템 코어 수만큼 스레드를 생성한다. 모든 스레드는 동시에 병렬로 실행되며 병렬 영역을 빠져나가면 스레드는 종료 된다.
for 문을 병렬 실행 하려면 #pragma omp parallel for
를 선언하고 OpenMp는 for문 안에 있는 연산을 생성된 스레드에 분배한다.
이외 Implicit Threading의 종류
Grand Central Dispatch (GCD)
Grand Central Dispatch는 macOs 및 IOS운영체제를 위해 Apple에서 개발한 기술이다. 개발자가 병렬로 실행될 코드를 식별하도록하는 런타임 라이브러리, API 및 언어 확장의 조합이다.
Intel Thread Building Blocks (TBB)
Intel TBB는 C++에서 병렬 프로그램 설계를 지원하느 템플릿 라이브러리이다. 라이브러리이므로 특별한 컴파일러나 언어 지원이 필요하지 않다.
Author And Source
이 문제에 관하여(Implicit Threading (암묵적 스레딩)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@lcy960729/Implicit-Threading-암묵적-스레딩저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)