주요 콘텐츠로 건너뛰기
이 브라우저는 더 이상 지원되지 않습니다.
최신 기능, 보안 업데이트, 기술 지원을 이용하려면 Microsoft Edge로 업그레이드하세요.
데이터 병렬 처리(작업 병렬 라이브러리)
- 아티클
- 09/22/2022
- 읽는 데 6분 걸림
이 문서의 내용
데이터 병렬 처리는 소스 컬렉션 또는 배열의 요소에서 동일한 작업이 동시에(즉, 병렬로) 수행되는 시나리오를 가리킵니다. 데이터 병렬 작업에서 소스 컬렉션은 여러 스레드가 서로 다른 세그먼트에서 동시에 작동할 수 있도록 분할됩니다.
TPL(작업 병렬 라이브러리)은 System.Threading.Tasks.Parallel 클래스를 통해 데이터 병렬 처리를 지원합니다. 이 클래스는 for 및 foreach 루프(Visual Basic에서는 For 및 For Each)의 메서드 기반 병렬 구현을 제공합니다. 순차 루프를 작성하는 것과 마찬가지로 Parallel.For 또는 Parallel.ForEach 루프에 대한 루프 논리를 작성합니다. 스레드나 큐 작업 항목을 만들 필요가 없습니다. 기본 루프에서는 잠금을 수행할 필요가 없습니다. TPL에서 모든 하위 수준 작업을 자동으로 처리합니다. Parallel.For 및 Parallel.ForEach의 용도에 대한 심층 내용은 병렬 프로그래밍의 패턴: .NET Framework 4의 병렬 패턴 이해 및 적용 문서를 다운로드하세요. 다음 코드 예제에서는 간단한 foreach 루프 및 해당 병렬 루프를 보여 줍니다.
참고
이 문서에서는 람다 식을 사용하여 TPL에 대리자를 정의합니다. C# 또는 Visual Basic의 람다 식을 잘 모르는 경우 PLINQ 및 TPL의 람다 식을 참조하세요.
// Sequential version foreach (var item in sourceCollection) { Process(item); } // Parallel equivalent Parallel.ForEach(sourceCollection, item => Process(item)); ' Sequential version For Each item In sourceCollection Process(item) Next ' Parallel equivalent Parallel.ForEach(sourceCollection, Sub(item) Process(item))병렬 루프가 실행되는 경우 TPL은 루프가 동시에 여러 부분에서 작동할 수 있도록 데이터 소스를 분할합니다. 내부적으로 작업 스케줄러는 시스템 리소스 및 작업에 따라 작업을 분할합니다. 가능한 경우 스케줄러는 작업 불균형이 발생할 때 여러 스레드 및 프로세서 간에 작업을 재배포합니다.
Parallel.For 및 Parallel.ForEach 메서드 둘 다에는 루프 실행을 중지 또는 중단하고, 다른 스레드의 루프 상태를 모니터링하고, 스레드 로컬 상태를 유지 관리하고, 스레드 로컬 개체를 종료하고, 동시성 수준을 제어할 수 있도록 하는 여러 오버로드가 있습니다. 이 기능을 사용할 수 있도록 하는 도우미 형식에는 ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationToken 및 CancellationTokenSource가 있습니다.
자세한 내용은 병렬 프로그래밍의 패턴: .NET Framework 4의 병렬 패턴 이해 및 적용을 참조하세요.
선언적 또는 쿼리와 유사한 구문을 사용한 데이터 병렬 처리는 PLINQ에서 지원됩니다. 자세한 내용은 PLINQ(병렬 LINQ)를 참조하세요.
방법: 간단한 Parallel.For 루프 작성 | 배열 또는 인덱싱 가능한 IEnumerable<T> 소스 컬렉션에 대한 For 루프를 작성하는 방법을 설명합니다. |
방법: 간단한 Parallel.ForEach 루프 작성 | IEnumerable<T> 소스 컬렉션에 대한 ForEach 루프를 작성하는 방법을 설명합니다. |
방법: Parallel.For 루프 중지 또는 중단 | 모든 스레드가 작업 알림을 받도록 병렬 루프에서 중지 또는 중단하는 방법을 설명합니다. |
방법: 스레드 로컬 변수를 사용하는 Parallel.For 루프 작성 | 각 스레드가 다른 스레드에 표시되지 않는 전용 변수를 유지 관리하는 For 루프를 작성하는 방법 및 루프 완료 시 모든 스레드의 결과를 동기화하는 방법을 설명합니다. |
방법: 파티션 로컬 변수를 사용하는 Parallel.ForEach 루프 작성 | 각 스레드가 다른 스레드에 표시되지 않는 전용 변수를 유지 관리하는 ForEach 루프를 작성하는 방법 및 루프 완료 시 모든 스레드의 결과를 동기화하는 방법을 설명합니다. |
방법: Parallel.For 또는 ForEach 루프 취소 | System.Threading.CancellationToken을 사용하여 병렬 루프를 취소하는 방법을 설명합니다. |
방법: 작은 루프 본문 속도 개선 | 루프 본문이 매우 작을 때 실행을 가속화하는 한 가지 방법을 설명합니다. |
TPL(작업 병렬 라이브러리) | 작업 병렬 라이브러리에 대해 간략하게 설명합니다. |
병렬 프로그래밍 | .NET Framework의 병렬 프로그래밍을 소개합니다. |
참조
- 병렬 프로그래밍
주요 콘텐츠로 건너뛰기
이 브라우저는 더 이상 지원되지 않습니다.
최신 기능, 보안 업데이트, 기술 지원을 이용하려면 Microsoft Edge로 업그레이드하세요.
.NET의 병렬 프로그래밍: 설명서에 대한 가이드
- 아티클
- 09/22/2022
- 읽는 데 3분 걸림
이 문서의 내용
많은 개인용 컴퓨터 및 워크스테이션에는 여러 CPU 코어가 있기 때문에 다중 스레드를 동시에 실행할 수 있습니다. 하드웨어를 활용하기 위해 코드를 병렬화하여 작업을 여러 프로세서에 분산할 수 있습니다.
이전의 병렬화에서는 스레드 및 잠금에 대한 저수준 조작이 필요했습니다. Visual Studio 및 .NET에서 런타임, 클래스 라이브러리 형식 및 진단 도구를 제공하여 병렬 프로그래밍 지원이 향상됩니다. .NET Framework 4에 도입된 이 기능은 병렬 개발을 단순화하므로, 스레드 또는 스레드 풀에 대해 직접 작업할 필요 없이 효율적이고 세분화된, 확장성 있는 병렬 코드를 자연스러운 언어로 작성할 수 있습니다.
다음 그림은 .NET의 병렬 프로그래밍 아키텍처에 대한 간략한 개요를 제공합니다.
TPL(작업 병렬 라이브러리) | System.Threading.Tasks.Parallel 및 For 루프의 병렬 버전을 포함하는 ForEach 클래스 및 비동기 작업에 대한 선호되는 표현 방식을 나타내는 System.Threading.Tasks.Task 클래스의 설명서를 제공합니다. |
PLINQ(병렬 LINQ) | 여러 시나리오에서 성능을 대폭 향상시키는 LINQ to Objects의 병렬 구현입니다. |
병렬 프로그래밍을 위한 데이터 구조 | 스레드로부터 안전한 컬렉션 클래스, 간단한 동기화 형식 및 초기화 지연 관련 형식에 대한 설명서의 링크를 제공합니다. |
병렬 진단 도구 | 작업 및 병렬 스택의 Visual Studio 디버거 창에 대한 설명서와 Concurrency 시각화에 대한 설명서로 연결되는 링크를 제공합니다. |
PLINQ 및 TPL에 대한 사용자 지정 파티셔너 | 파티션 작동 방식 및 기본 파티션을 구성하거나 새 파티션을 만드는 방법에 대해 설명합니다. |
작업 스케줄러 | 스케줄러 작동 방식 및 기본 스케줄러의 구성 방법에 대해 설명합니다. |
PLINQ 및 TPL의 람다 식 | C# 및 Visual Basic으로 작성된 람다 식의 간략한 개요를 제공하고, 람다 식이 PLINQ 및 작업 병렬 라이브러리에서 사용되는 방식을 보여 줍니다. |
추가 정보 | .NET의 병렬 프로그래밍과 관련된 추가 정보 및 샘플 리소스에 대한 링크를 제공합니다. |
참조
- 관리되는 스레딩
- 비동기 프로그래밍 패턴