[운영체제] 암묵적 쓰레드

Seokjun Moon·2023년 4월 9일
0

운영체제

목록 보기
14/23
post-custom-banner

암묵적 쓰레드

쓰레드 개수가 증가할수록 명시적으로 제어하면 다루기가 매우 어려워집니다. 따라서 쓰레드의 생성과 관리를 프로그래머가 아닌 컴파일러 혹은 런타임 라이브러리로 다루는 방법이 등장하였습니다. 5가지 방법이 존재합니다.

  1. Thread Pools
  2. Fork-Join
  3. OpenMP
  4. Grand Central Dispatch
  5. Intel Threading Building Blocks

Thread Pools

쓰레드를 생성하는 것도 오버헤드가 꽤 많이 발생합니다. 따라서 쓰레드를 미리 생성해두어 쓰레드 풀에서 대기 상태로 있다가 작업이 배정되면 실행, 실행이 끝나면 리소스 해제 후 다시 풀에 들어가 대기하는 방식입니다.

  • 새로운 쓰레드를 생성하는 것 보다 더 빠릅니다.
  • 메모리 관리에 매우 좋습니다.

Fork-Join Parallelism

메인 쓰레드에서 fork 를 진행하여 작업을 실행한 후 종료하면 join 으로 다시 메인 쓰레드 하나로 돌아오는 방법입니다.

시스템 콜의 fork() 와 똑같습니다! 단지 join 으로 원래의 메인 쓰레드로 돌아간다는 점만 빼면 말이죠

약간 divide-and-conqure 방식 같은 느낌입니다.

OpenMP

shared-memory 환경에서 병렬 프로그래밍을 지원합니다. 전처리를 통해 컴파일러에게 지시하는 느낌입니다.

  • #pragma omp parallel : 코어의 개수만큼 쓰레드 생성
  • #pragma omp parallel for : 병렬로 루프 수행

예를 들면

이렇게 해서 전처리 내부 구문을 코어의 개수만큼 병렬로 처리할 수 있습니다.

Grand Central Dispatch

애플의 macOs, iOS 에서 사용하는 기술입니다. OpenMP 방식이랑 거의 똑같습니다! 단지 전처리 방식만 좀 달라질 뿐입니다. 예를 들어 ^{ printf("aaa"); } 와 같이 ^{} 를 통해 명시합니다.

Intel Threading Building BLocks (TBB)

for (int i = 0; i < n; i++) {
    apply(v[i]);
}

이런 코드를

parallel_for (size_t(0), n, [=](size_t i) {apply(v[i]);});

이렇게 바꾸어 병렬 처리를 할 수 있습니다.

profile
차근차근 천천히
post-custom-banner

0개의 댓글