1. Implicit Threading이란?
- 스레드를 개발자가 명시적으로 생성하거나 제어하지 않고 언어나 프레임워크에게 스레드의 생성과 관리 책임을 넘기는 것.
- 개발자는 따로 스레딩을 생성할 필요없이 병렬로 실행해야 할 프로그램을 걸러내어 함수형으로 실행만 시켜주면 된다.
2. Implicit Threading의 종류
2-1. Thread pool / 스레드 풀
프로세스 사용? 스레드 사용?
프로세스를 스케줄링 하는 것보다 스레드를 만들어 사용하는 게 자원 소비, 오버헤드 관점에서 훨씬 효율적인 방법이긴 하다. 이유는 프로세스 간 통신을 할 경우 shared-memory또는 Message passing같은 IPC방식을 사용해야 하기 때문에 오버헤드가 크고 context switch를 할 때 프로세스는 레지스터값 저장 페이지 테이블(실행 될 프로세스의 주소)변경, 커널모드 전환 등 여러가지 과정을 거치지만 스레드는 어짜피 프로세스에 할당된 동일한 주소공간을 사용, 공유하기 때문에 페이지 테이블 변경이 필요하지 않고 레지스터, 페이지 테이블 정보의 양이 적어 더 빠른 context switch가 일어난다.
하지만 멀티 프로세싱보다 멀티 스레딩이 더 좋다지 멀티 스레딩에서도 문제가 있다.
요청이 들어오면 스레드를 만들어서 작업을 시키는데 스레드를 생성하는데도 당연히 시간이 걸린다. 그리고 이 스레드에 할당된 작업이 종료된 후 폐기하는 것을 생각하면 다음에 또 생성해야하기 떄문에 자원 낭비이다. 그리고 개발자가 잘못해서 무한루프에 스레드 생성코드를 넣게 되면 스레드도 자원을 필요로 하기 때문에 당연히 시스템이 뻗을 수 밖에 없다.
Thread pool을 사용한 해결책
이러한 문제를 해결하는게 바로 Thread pool이다. Thread pool은 말 그대로 스레드들이 대기하는 공간이라고 생각하면 편하다. 프로세스가 시작할 때 일정한 갯수의 스레드를 생성하고 대기시킨다. 스레드에 할당받은 작업이 없을 경우 스레드는 쉬지만, 작업이 들어오게 되면 서버는 스레드 풀에 작업을 요청하고 스레드 풀에서 대기하고 있던 스레드들이 작업을 받아 실행한다. 스레드 풀에 놀고있는 스레드(사용 가능한 스레드)가 없으면 작업이 대기하고 사용 가능한 스레드가 생기면 스레드를 할당해서 작업을 실행한다. 작업이 끝난 스레드들은 폐기되지 않고 다시 Thread pool로 돌아가 대기한다.
2-2. Fork & Join
Fork & join 메서드를 사용해서 메인 부모스레드가 하나 이상의 자식 스레드를 fork()한 다음 자식의 종료를 기다린 후 join하고 그 시점부터 자식의 결과를 확인하고 merge할 수 있다. Fork-Join방법은 분할 정복알고리즘을 기반으로 설계되었으며 아래의 그림을 보면 이해가 빠를 것 같다!
2-3. OpenMP
개발자가 컴파일러에게 병렬처리 할 부분을 구분해서 OpenMP에게 알려주면 컴파일러가 알아서 병렬처리를 한다.
병렬 처리를 할 때는 아래와 같이 #pragma omp parallel로 병렬 처리할 코드를 지정해주면 된다. omp_set_num_threads(5);이 부분은 스레드의 갯수를 지정해 준 것이다.
#include <omp.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
omp_set_num_threads(5);
#pragma omp parallel // compiler directive
{
printf("I am a parallel region.\n");
}
return 0;
}
그냥 코드를 실행했을 때는 한줄만 출력되지만 openmp옵션을 준 다음 실행하면 여러개의 스레드로 실행되어 여러번 출력한 것을 볼 수있다.
2-4. Grand Central Dispatch (GCD)
Grand Central Dispatch는 macOs 및 IOS운영체제를 위해 Apple에서 개발한 기술이다. 개발자가 병렬로 실행될 코드 섹션을 식별할 수 있도록 런타임 라이브러리, API 및 언어 확장의 조합이다.
2-5. Intel Thread building Blocks (TBB)
Intel TBB는 C++에서 병렬 응용 프로그램 설계를 지원하는 템플릿 라이브러리이다.
라이브러리이기 떄문에 특별한 컴파일러나 언어 지원이 필요하지 않다.
CS 지식을 공부하고 기록하는 개인 공부 블로그입니다.
내용 중 틀린 부분 피드백 혹은 궁금한 점이 있으면 댓글로 남겨주시면 참고 및 답변 달아드리겠습니다🧐
'Computer Science > 운영체제' 카테고리의 다른 글
[OS/운영체제] 동기화 문제와 임계영역 문제 (0) | 2024.01.09 |
---|---|
[OS/운영체제] CPU scheduling (0) | 2024.01.01 |
[OS/운영체제] Thread / 스레드 (1) | 2023.12.22 |
[OS/운영체제] 동기 & 비동기 VS 블로킹 & 논블로킹 (1) | 2023.12.18 |
[OS/운영체제] IPC / Inter Process Communication (1) | 2023.12.18 |