Implicit Threading (암묵적 스레딩)

3107 단어 OSOS

Implicit Threading란?

Implicit Threading은 스레딩의 생성과 관리 책임을 개발자가 하는것이 아닌 컴파일러와 런타임 라이브러리에게 넘겨주는것이다. 개발자는 병렬로 실행할 수 있는 작업만 식별하여 작업을 함수로 작성한다. 이후 런타임 라이브러리를 통해 가용한 스레드에 매핑된다.

결국 스레드 생성과 관리는 시스템에 맞기고 어플리케이션에서는 라이브러리를 통해 스레드에 필요한 작업을 맵핑만하면 된다.

Thread Pool

웹 서버에서 모든 요청마다 새로운 스레드를 만들어서 서비스를 제공한다면 시스템에는 무한한 스레드가 생성될것이다. 하드웨어는 한정적이므로 계속해서 늘어나다가 늘어날 수 없는 시점이 다가올것이다. 이러한 문제를 해결하는 방법이 Thread Pool이다.

스레드 풀은 프로세스를 시작할때 일정한 수의 스레드를 생성해두는 것이다. 간단하게 스레드 풀의 동작 방식은 아래와 같다.

  1. 웹서버는 요청을 받으면 스레드를 생성하는것이 아닌 사용중이지 않은 스레드에 요청을 수행하도록 한다.
  2. 만약 모든 스레드가 사용중이라면 사용 가능한 스레드가 생길때까지 작업을 대기한다.

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++에서 병렬 프로그램 설계를 지원하느 템플릿 라이브러리이다. 라이브러리이므로 특별한 컴파일러나 언어 지원이 필요하지 않다.

좋은 웹페이지 즐겨찾기