본문으로 이동

태스크 패럴렐 라이브러리

위키백과, 우리 모두의 백과사전.

태스크 패럴렐 라이브러리(영어: Parallel Extensions)는 마이크로소프트 리서치와 마이크로소프트의 CLR 팀 간의 협력을 통해 개발된 관리 병행 라이브러리의 개발 코드네임이다. 이 라이브러리는 닷넷 프레임워크 4.0 버전에서 출시되었다.[1] 이는 Parallel LINQ(PLINQ)와 Task Parallel Library(TPL)의 두 부분으로 구성된다.[2][3] 또한 병행 작업의 실행을 동기화하고 조정하는 데 사용되는 자료 구조의 집합인 조정 자료 구조(CDS, Coordination Data Structures) 세트로도 구성된다.[4]

Parallel LINQ

[편집]

PLINQ 또는 병렬 LINQ는 객체(LINQ to Objects) 및 XML 데이터(LINQ to XML)에 대한 쿼리 실행을 병렬화한다. PLINQ는 쿼리를 사용하여 데이터 병렬성을 노출하기 위한 것이다.[2] 쿼리로 구현된 객체에 대한 모든 연산은 PLINQ에 의해 병렬화될 수 있다. 그러나 객체는 PLINQ 자체에 의해 정의된 IParallelEnumerable 인터페이스를 구현해야 한다. 내부적으로는 실행을 위해 TPL을 사용한다.[4][5]

Task Parallel Library

[편집]

Task Parallel Library(TPL)는 닷넷용 Parallel Extensions의 작업 병렬성 구성 요소이다.[6] 일반 메서드 호출 및 대리자를 사용하여 병렬 For 및 ForEach 루프와 같은 병렬 구조를 노출하며, 따라서 이 구조는 모든 CLI 언어에서 사용할 수 있다. 스레드의 생성 및 종료, 그리고 사용 가능한 프로세서 수에 따른 스레드 수 조정 작업은 라이브러리 자체가 워크 스틸링 스케줄러를 사용하여 수행한다.[3][7]

TPL은 또한 Task 및 Future와 같은 다른 구조를 포함한다. 작업(Task)은 프로그램의 나머지 부분과 독립적으로 실행될 수 있는 작업 단위이다. 그런 의미에서, 운영 체제 스레드를 생성하는 오버헤드가 없고 더 가벼운 객체라는 점을 제외하면 의미상 스레드와 동일하다. 작업은 작업 관리자(Task Manager) 객체에 의해 큐에 추가되고, 차례가 되면 스레드 풀 내의 여러 OS 스레드에서 실행되도록 예약된다.

Future는 결과를 반환하는 작업이다. 결과는 Future 객체에 캡슐화된 백그라운드 스레드에서 계산되며, 결과가 검색될 때까지 버퍼링된다.[3] 계산되기 전에 결과를 검색하려고 시도하면 결과를 사용할 수 있게 될 때까지 요청한 스레드가 차단된다.[6]

TPL의 다른 구조는 Parallel 클래스이다. TPL은 Parallel 클래스의 세 가지 정적 메서드를 통해 구조화된 병렬성의 기본 형태를 제공한다.

Parallel.Invoke
Action 대리자 배열을 병렬로 실행한 다음 완료될 때까지 기다린다.
Parallel.For
C# for 루프의 병렬 대응물
Parallel.ForEach
C# foreach 루프의 병렬 대응물

구조

[편집]

Parallel Extensions to .NET의 주요 개념은 Task이며, 이는 보통 람다 함수로 표현되는 작은 코드 단위로 독립적으로 실행될 수 있다. PLINQ와 TPL API 모두 Task를 생성하는 메서드를 제공한다. PLINQ는 쿼리를 더 작은 Task로 나누고, Parallel.For, Parallel.ForEach 및 Parallel.Invoke 메서드는 루프를 Task로 나눈다.

PFX에는 실행을 위해 Task를 예약하는 Task Manager 객체가 포함되어 있다. 작업 관리자는 Task의 전역 큐를 포함하며, 이는 실행된다. 또한 Task가 실행되는 여러 스레드를 캡슐화한다. 기본적으로 시스템에 있는 프로세서(또는 프로세서 코어)만큼의 스레드가 생성되지만, 이 수는 수동으로 수정할 수 있다. 각 스레드는 스레드별 Task 큐와 연결된다. 유휴 상태일 때 각 스레드는 Task 배치를 선택하여 로컬 큐에 넣고 거기서 하나씩 실행한다. 전역 큐가 비어 있으면 스레드는 동료의 큐에서 Task를 찾고 큐에 가장 오래 있었던 Task를 가져간다(작업 스틸링). 실행 중일 때 Task는 독립적으로 실행되며, 한 Task의 상태 변화는 다른 Task와 독립적이다. 결과적으로 공유 리소스를 사용하는 경우에도 여전히 락이나 다른 구조를 사용하여 수동으로 동기화해야 한다.

같이 보기

[편집]

각주

[편집]
  1. ↑ “What's New in the .NET Framework 4”. 2011년 9월 21일에 확인함.
  2. 1 2 “Programming in the Age of Concurrency: Concurrent Programming with PFX”. 2007년 10월 16일에 확인함.
  3. 1 2 3 “MSDN Magazine: Task Parallel Library”. 2007년 10월 14일에 원본 문서에서 보존된 문서. 2007년 10월 16일에 확인함.
  4. 1 2 “June 2008 CTP – Parallel Extensions to the .NET FX”. 2008년 8월 6일에 확인함.
  5. ↑ “More powerful aggregations in PLINQ”. 2008년 8월 6일에 확인함.
  6. 1 2 Duffy, Joe (2009). 《Concurrent Programming on Windows》. 887–929쪽. ISBN 978-0321434821.
  7. ↑ Leijen, Daan; Schulte, Wolfram; Burckhardt, Sebastian (2009). “The Design of a Task Parallel Library”. 《ACM SIGPLAN Notices》 44 (10): 227. CiteSeerX 10.1.1.146.4197. doi:10.1145/1639949.1640106.

외부 링크

[편집]