암묵적 스레딩
암묵적 스레딩(implicit Threading)
- 스레딩의 생성과 관리 책임을 앱 개발자로부터 컴파일러와 실행시간 라이브러리에게 넘기는 것
- 앱 설계의 어려움을 극복하고 병행 및 병렬 앱 설계를 도와주는 방법
- 응용 프로그램 개발자가 병렬로 실행할 수 있는 스레드가 아닌 작업을 식별해야 함
- 작업은 일반적인 함수로 작성
- 런타임 라이브러리는 다대다 모델을 사용하여 별도의 스레드에 매핑
- 암묵적 스레딩 장점
- 개발자는 병렬 작업만 식별하면 된다.
- 라이브러리는 스레드 생성 및 관리에 대한 특정 세부사항을 결정
- 개발자는 병렬 작업만 식별하면 된다.
스레드 풀
- 다중 스레드 서버는 아직 여러 문제를 지님
- 스레드를 생성하는데 소요되는 시간
- 생성된 스레드가 단기 작업(곧 폐기될 스레드)이라면 더 문제가 됨
- 스레드를 생성하는데 소요되는 시간
- 모든 요청마다 새 스레드를 만든다면, 동시 실행 가능한 최대 스레드 수의 한계를 정해야 함
- 스레드를 무한정 만들면 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에서는 세 가지 모델에 중점을 둠
- 단일 스레드
Executor, newSingleThreadExecutor()는
크기가 1인 풀을 생성 - 고정 스레드
Executor, newFixedThreadPool(int size)
는 지정된 수의 스레드 풀을 생성 - 캐시 스레드
Executor, newCachedThreadPool()는
스레드를 재사용하는 무제한 스레드풀을 생성
- 단일 스레드
Fork Join
- 이 메서드를 사용하면 메인 부모 스레드가 자식 스레드를 생성(fork)한 다음,
자식의 종료를 기다린 후 join 하고 그 시점부터 자식의 결과를 확인하고 결합할 수 있다. - 이 동기식 모델 은 종종 명시적 스레드 생성이라고 특정지 어지지만, 암시적 스레딩에도 사용 가능
- 암시적 스레딩 때의 fork 단계에서는 스레드가 직접 구축되지 않고 대신 병렬 작업이 식별
- 라이브러리는 생성되는 스레드 수를 관리하며 스레드에 작업 배정을 책임
- 라이브러리는 생성되는 스레드 수를 관리하며 스레드에 작업 배정을 책임
- 암시적 스레딩 때의 fork 단계에서는 스레드가 직접 구축되지 않고 대신 병렬 작업이 식별
- fork-join 모델은 라이브러리가 생성할 실제 스레드 수를 결정하는 동기 버전의 스레드풀이다.
OpenMP
- C, C++ 또는 FORTRAN으로 작성된 API와 컴파일러 디렉티브의 집합.
- OpenMP는 공유 메모리 환경에서 병렬 프로그래밍을 할 수 있도록 도움을 준다.
Grand Central Dispatch
- macOS 및 iOS 운영체제를 위해 Apple에서 개발한 기술.
- 개발자가 병렬로 실행될 코드 섹션을 식별할 수 있도록 하는 런타임 라이브러리, API 및 언어 확장의 조합
- GCD(Grand central Dispatch)는 스레딩에 대한 대부분의 세부사항을 관리
Intel 스레드 빌딩 블록
- C++에서 병렬 응용 프로그램 설계를 지원하는 템플릿 라이브러리