다음을 통해 공유


동시성 런타임과 기타 동시성 모델 비교

업데이트: 2010년 7월

이 문서에서는 동시성 런타임의 기능 및 프로그래밍 모델과 다른 기술 간의 차이점에 대해 설명합니다. 동시성 런타임의 이점을 다른 프로그래밍 모델의 이점과 비교하는 방법을 이해하면 응용 프로그램의 요구 사항에 가장 잘 맞는 기술을 선택할 수 있습니다.

현재 Windows 스레드 풀 또는 OpenMP와 같은 다른 프로그래밍 모델을 사용하고 있는 경우 동시성 런타임으로 마이그레이션하는 것이 적합한 경우가 있습니다. 예를 들어 OpenMP에서 동시성 런타임으로 마이그레이션 항목에서는 OpenMP에서 동시성 런타임으로 마이그레이션하는 것이 적합할 수 있는 경우에 대해 설명합니다. 그러나 응용 프로그램 성능 및 현재 디버깅 지원에 만족하는 경우 마이그레이션할 필요가 없습니다.

동시성 런타임의 기능과 생산성 면에서의 이점을 사용하여 다른 동시성 모델을 사용하는 기존 응용 프로그램을 보완할 수 있습니다. 동시성 런타임에서는 여러 작업 스케줄러가 같은 컴퓨팅 리소스를 얻기 위해 경합할 경우 부하가 분산된다는 보장이 없습니다. 그러나 작업 부하가 겹치지 않으면 이러한 효과는 미미합니다.

단원

  • 선점형 예약과 협조적 예약 비교

  • 동시성 런타임과 Windows API 비교

  • 동시성 런타임과 OpenMP 비교

선점형 예약과 협조적 예약 비교

선점형 모델과 협조적 예약 모델은 여러 작업에서 프로세서 또는 하드웨어 스레드와 같은 컴퓨팅 리소스를 공유하는 데 사용할 수 있는 두 가지 일반적인 방법입니다.

선점형 예약 및 협조적 예약

선점형 예약은 우선 순위 기반의 라운드 로빈 메커니즘으로, 지정된 기간 동안 컴퓨팅 리소스에 대한 단독 액세스 권한을 각 작업에 제공한 후 다른 작업으로 전환합니다. 선점형 예약은 Windows와 같은 멀티태스킹 운영 체제에서 일반적입니다. 협조적 예약은 작업이 끝나거나 리소스에 대한 액세스를 양보할 때까지 컴퓨팅 리소스에 대한 단독 액세스 권한을 모든 작업에 제공하는 메커니즘입니다. 동시성 런타임은 협조적 예약을 운영 체제의 선점형 스케줄러와 함께 사용하여 처리 리소스를 최대한 활용할 수 있습니다.

선점형 스케줄러와 협조적 스케줄러의 차이

선점형 스케줄러는 모든 스레드에서 진행할 수 있도록 컴퓨팅 리소스에 대한 동등한 액세스 권한을 여러 스레드에 제공하려고 합니다. 컴퓨팅 리소스가 많은 컴퓨터에서 액세스를 공평하게 제공하면 문제 발생 가능성이 적지만 리소스를 효율적으로 사용하려면 문제 발생 가능성이 커집니다.

선점형 커널 모드 스케줄러를 사용하여 일정 예약을 결정하려면 응용 프로그램 코드가 운영 체제에 의존해야 합니다. 반대로 사용자 모드 협조적 스케줄러를 사용하면 응용 프로그램 코드로 자체의 고유한 일정 예약을 결정할 수 있습니다. 협조적 방식으로 일정을 예약하면 대부분의 일정 예약을 응용 프로그램에서 결정할 수 있으므로 커널 모드 동기화와 관련된 오버헤드가 상당히 줄어듭니다. 일반적으로 협조적 스케줄러는 운영 체제 커널에 일정을 예약할 다른 작업이 없으면 해당 커널로 일정 결정을 위임합니다. 또한 협조적 스케줄러는 차단 작업이 커널에 전달되지만 사용자 모드 스케줄러에는 전달되지 않는 경우 운영 체제 스케줄러에 위임합니다. UMS(사용자 모드 예약 가능) 스레드를 지원하는 운영 체제에서 동시성 런타임 스케줄러는 이러한 차단 작업을 협조적 차단 작업으로 변환합니다.

협조적 예약과 효율성

우선 순위 수준이 같은 모든 작업은 선점형 스케줄러에서 동일한 작업으로 간주됩니다. 일반적으로 선점형 스케줄러는 스레드가 만들어진 순서대로 일정을 예약합니다. 또한 선점형 스케줄러는 스레드 우선 순위에 따라 라운드 로빈 방식으로 모든 스레드에 시간 간격을 제공합니다. 이 메커니즘은 모든 스레드가 앞으로 진행되므로 공평하기는 하지만 효율성 면에서 약간 떨어집니다. 예를 들어 계산 작업이 많은 대부분의 알고리즘의 경우 스레드 사용이 공평할 필요가 없습니다. 대신 관련 작업을 끝내는 데 소요되는 전체 시간을 최소로 하는 것이 중요합니다. 협조적 예약을 사용하면 응용 프로그램에서 더 효율적으로 작업을 예약할 수 있습니다. 예를 들어 스레드가 많이 있는 응용 프로그램을 가정해 봅니다. 리소스를 공유하지 않는 스레드를 동시에 실행하도록 예약하면 동기화 오버헤드가 줄어들어 효율성을 높일 수 있습니다. 또한 각 파이프라인 단계의 입력이 메모리 캐시에 이미 로드되도록 이전 작업의 출력에 따라 각 작업이 실행되는 작업 파이프라인을 같은 프로세서에서 실행하는 것도 작업을 예약하는 효율적인 방법 중 하나입니다.

선점형 예약과 협조적 예약 함께 사용

협조적 예약이 모든 예약 문제를 해결하는 것은 아닙니다. 예를 들어 다른 작업에 공평하게 양보하지 않는 작업은 가능한 모든 컴퓨팅 리소스를 사용하고 다른 작업의 진행을 방해할 수 있습니다. 동시성 런타임은 협조적 예약의 효율성 이점과 선점형 예약의 공평성을 함께 활용하여 각 예약을 보완합니다. 기본적으로 동시성 런타임은 작업 가로채기 알고리즘을 사용하는 협조적 스케줄러를 제공하여 컴퓨팅 리소스 간에 효율적으로 작업을 분배합니다. 그러나 동시성 런타임 스케줄러는 운영 체제의 선점형 스케줄러에도 의존하여 응용 프로그램 간에 공평하게 리소스를 분배합니다. 또한 응용 프로그램에서 사용자 지정 스케줄러 및 스케줄러 정책을 만들어 스레드 실행을 더욱 세밀하게 제어할 수도 있습니다.

[맨 위로 이동]

동시성 런타임과 Windows API 비교

Microsoft Windows 응용 프로그래밍 인터페이스는 응용 프로그램에서 동시성을 사용하도록 설정하는 프로그래밍 모델을 제공하며 일반적으로 Windows API(이전의 Win32)라고 합니다. 동시성 런타임은 Windows API를 기반으로 하여 내부 운영 체제에서 사용할 수 없는 추가 프로그래밍 모델을 제공합니다.

동시성 런타임은 Windows API 스레드 모델을 기반으로 병렬 작업을 수행합니다. 또한 Windows API 메모리 관리 및 스레드 로컬 저장소 메커니즘을 사용합니다. Windows 7 및 Windows Server 2008 R2에서는 하드웨어 스레드가 64개가 넘는 컴퓨터 및 사용자 일정 예약 가능 스레드에 대해 Windows API 지원을 사용합니다. 동시성 런타임은 협력적 작업 스케줄러 및 작업 가로채기 알고리즘을 제공하여 컴퓨팅 리소스 사용을 최대화하고 동시 스케줄러 인스턴스를 여러 개 사용하도록 설정하는 등의 방법으로 Windows API 모델을 확장합니다.

Windows API에 대한 자세한 내용은 Windows API 개요를 참조하십시오.

프로그래밍 언어

Windows API는 C 프로그래밍 언어를 사용하여 프로그래밍 모델을 노출합니다. 동시성 런타임은 C++ 언어의 최신 기능을 사용하는 C++ 프로그래밍 인터페이스를 제공합니다. 예를 들어 람다 함수는 병렬 작업 함수를 정의하기 위한 간결하고 형식 안정적인 메커니즘을 제공합니다. 동시성 런타임에서 사용하는 최신 C++ 기능에 대한 자세한 내용은 동시성 런타임 개요을 참조하십시오.

스레드 및 스레드 풀

Windows API에서 가장 중요한 동시성 메커니즘은 스레드입니다. 일반적으로 CreateThread 함수를 사용하여 스레드를 만듭니다. 스레드는 비교적 쉽게 만들고 사용할 수 있지만 운영 체제에서는 상당한 양의 시간 및 다른 리소스를 할당하여 스레드를 관리합니다. 또한 각 스레드는 우선 순위 수준이 같은 다른 스레드와 동일한 실행 시간을 받을 수 있지만 추가 오버헤드로 인해 규모가 충분히 큰 작업을 만들어야 합니다. 작거나 좀 더 세분화된 작업의 경우 작업을 병렬로 실행하여 얻는 이점보다 동시성과 관련된 오버헤드가 우선할 수 있습니다.

스레드 풀은 스레드 관리 비용을 줄일 수 있는 한 가지 방법입니다. Windows API에서 제공하는 스레드 풀 구현과 사용자 지정 스레드 풀 둘 다 작은 작업 항목을 병렬 방식으로 효율적으로 실행할 수 있도록 합니다. Windows 스레드 풀은 작업 항목을 FIFO(선입선출) 큐에서 유지 관리합니다. 각 작업 항목은 풀에 추가된 순서대로 시작됩니다.

동시성 런타임은 작업 가로채기 알고리즘을 구현하여 FIFO 예약 메커니즘을 확장합니다. 이 알고리즘은 아직 시작되지 않은 작업을 작업 항목이 없는 스레드로 이동합니다. 작업 가로채기 알고리즘은 작업 부하를 분산시킬 수는 있지만 작업 항목의 순서가 변경되는 문제를 일으킬 수도 있습니다. 순서가 변경되면 작업 항목이 처음에 제출된 순서와 다른 순서로 시작될 수 있습니다. 이 방법은 이전 작업 대신 새 작업 사이에서 데이터가 공유될 가능성이 있는 재귀적 알고리즘과 함께 사용하면 유용합니다. 새 항목을 먼저 실행하도록 하면 캐시 실패 및 페이지 폴트가 줄어듭니다.

운영 체제의 관점에서 보면 작업 가로채기는 불공평합니다. 그러나 응용 프로그램에서 실행할 작업 또는 알고리즘을 병렬로 구현하면 하위 작업 사이의 공평함이 항상 중요한 것은 아닙니다. 중요한 것은 전체 작업이 끝나는 속도를 높이는 것입니다. 다른 알고리즘의 경우 FIFO는 적절한 예약 전략입니다.

다양한 운영 체제에서의 동작

Windows XP와 Windows Vista의 경우 동시성 런타임을 사용하는 응용 프로그램의 동작이 비슷하지만 Windows Vista에서 힙 성능이 향상되었다는 점이 다릅니다.

Windows 7과 Windows Server 2008 R2의 경우 운영 체제에서 동시성 및 확장성 지원이 확대됩니다. 예를 들어 이러한 운영 체제에서는 하드웨어 스레드가 64개가 넘는 컴퓨터를 지원합니다. Windows API를 사용하는 기존 응용 프로그램은 이러한 새 기능을 활용하도록 수정되어야 합니다. 그러나 동시성 런타임을 사용하는 응용 프로그램은 이러한 기능을 자동으로 사용하므로 수정할 필요가 없습니다.

Windows 7과 Windows Server 2008 R2에서는 둘 다 UMS(사용자 모드 예약 가능) 스레드에 대한 지원을 추가합니다. UMS 스레드를 사용하면 사용자 모드 스케줄러와 커널로 작업을 더 효율적으로 예약할 수 있습니다. UMS는 선점을 계속 사용하지만 응용 프로그램 및 라이브러리에서 커널 전환 없이 협조적 예약을 수행할 수 있도록 하여 효율성을 향상시킵니다. 또한 UMS는 커널에서 스레드가 차단될 경우 제어를 다시 응용 프로그램에 제공하므로 남은 시간 간격 동안 응용 프로그램에서 추가 작업을 수행할 수 있습니다. 동시성 런타임은 운영 체제에서 지원할 경우 자동으로 UMS 예약을 사용합니다. UMS에 대한 자세한 내용은 사용자 모드 예약을 참조하십시오.

[맨 위로 이동]

동시성 런타임과 OpenMP 비교

동시성 런타임은 다양한 프로그래밍 모델을 사용할 수 있도록 합니다. 이러한 모델은 다른 라이브러리의 모델을 보완하거나 겹칠 수 있습니다. 이 단원에서는 동시성 런타임과 OpenMP를 비교합니다.

OpenMP 프로그래밍 모델은 Open 표준에 정의되어 있으며 Fortran 및 C/C++ 프로그래밍 언어에 대해 잘 정의된 바인딩이 있습니다. OpenMP 버전 2.0 및 2.5는 반복적인 병렬 알고리즘에 적합합니다. 즉, 데이터 배열에 대한 병렬 반복을 수행합니다. OpenMP는 병렬 처리 수준이 미리 결정되고 시스템의 사용 가능한 리소스와 일치하는 경우 가장 효율적입니다. OpenMP 모델은 매우 큰 계산 문제가 단일 컴퓨터의 처리 리소스 전체에 분산되어 있는 고성능 컴퓨팅에 특히 적합합니다. 이 시나리오에서는 하드웨어 환경이 알려져 있고 개발자는 알고리즘이 실행될 때 컴퓨팅 리소스에 대한 단독 액세스 권한을 가질 수 있습니다.

그러나 덜 제한된 다른 컴퓨팅 환경은 OpenMP에 적합하지 않을 수 있습니다. 예를 들어 QuickSort 알고리즘 또는 데이터 트리 검색과 같은 재귀적 문제는 OpenMP를 사용하여 구현하기가 더 어렵습니다. 동시성 런타임은 PPL(병렬 패턴 라이브러리) 및 비동기 에이전트 라이브러리를 제공하여 OpenMP의 기능을 보완합니다. OpenMP와 달리 동시성 런타임은 사용 가능한 리소스에 맞게 조정되고 작업 부하의 변경에 따라 병렬 처리 수준을 조정하는 동적 스케줄러를 제공합니다.

동시성 런타임에서 제공하는 대부분의 기능은 확장될 수 있습니다. 또한 기존 기능을 결합하여 새 기능을 구성할 수도 있습니다. OpenMP는 컴파일러 지시문을 사용하므로 쉽게 확장될 수 없습니다.

동시성 런타임을 OpenMP와 비교하는 방법과 동시성 런타임을 사용하도록 기존 OpenMP 코드를 마이그레이션하는 방법에 대한 자세한 내용은 OpenMP에서 동시성 런타임으로 마이그레이션을 참조하십시오.

[맨 위로 이동]

참고 항목

참조

Windows API 개요

개념

동시성 런타임

동시성 런타임 개요

PPL(병렬 패턴 라이브러리)

비동기 에이전트 라이브러리

기타 리소스

OpenMP in Visual C++

변경 기록

날짜

변경 내용

이유

2010년 7월

마이그레이션 상호 운용성에 대한 정보를 추가했습니다.

향상된 기능 관련 정보