Parallel Extensions - так называлась библиотека управляемого параллелизма, разработанная в результате сотрудничества Microsoft Research и группы CLR в Microsoft. Библиотека выпущена в версии 4.0 .NET Framework. Он состоит из двух частей: параллельного LINQ (PLINQ) и библиотеки параллельных задач (TPL). Он также состоит из набора структур данных координации (CDS) - наборов структур данных, используемых для синхронизации и координации выполнения параллельных задач.
PLINQ или параллельный LINQ, распараллеливающий выполнение запросов к объектам (LINQ to Objects) и данным XML (LINQ to XML). PLINQ предназначен для выявления параллелизма данных с помощью запросов. PLINQ может распараллелить любые вычисления над объектами, реализованные как запросы. Однако объекты должны реализовывать IParallelEnumerable
интерфейс, который определяется самим PLINQ. Внутренне он использует TPL для исполнения.
Task Parallel Library ( TPL) является параллелизм задач компонент параллельных расширений для.NET. Он предоставляет параллельные конструкции, такие как parallel For
и ForEach
циклы, с использованием обычных вызовов методов и делегатов, поэтому конструкции могут использоваться из любых языков CLI. Работа по порождению и завершению потоков, а также по масштабированию количества потоков в соответствии с количеством доступных процессоров выполняется самой библиотекой с использованием планировщика кражи работы.
TPL также включает другие конструкции, такие как Task и Future. Задача это действие, которое может быть выполнено независимо от остальной части программы. В этом смысле он семантически эквивалентен потоку, за исключением того, что это более легкий объект и не требует дополнительных затрат на создание потока ОС. Задачи ставятся в очередь объектом диспетчера задач и планируются для выполнения в нескольких потоках ОС в пуле потоков, когда приходит их очередь.
Будущее - это задача, которая возвращает результат. Результат вычисляется в фоновом потоке, инкапсулированном объектом Future, и результат буферизуется до тех пор, пока он не будет получен. Если будет сделана попытка получить результат до того, как он будет вычислен, то запрашивающий поток будет заблокирован до тех пор, пока результат не станет доступен.
Другая конструкция TPL - это класс Parallel. TPL предоставляет базовую форму структурированного параллелизма с помощью трех статических методов в классе Parallel:
Основная концепция Parallel Extensions to.NET - это Task
небольшая единица кода, обычно представленная как лямбда-функция, которая может выполняться независимо. И PLINQ, и TPL API предоставляют методы для создания задач - PLINQ делит запрос на более мелкие задачи Parallel.For
, Parallel.ForEach
а Parallel.Invoke
методы и делят цикл на задачи.
PFX включает Task Manager
объект, который планирует выполнение задач. Диспетчер задач содержит глобальную очередь задач, которые затем выполняются. Он также инкапсулирует несколько потоков, в которых выполняются Задачи. По умолчанию создается столько потоков, сколько процессоров (или ядер процессора) в системе, хотя это число может быть изменено вручную. Каждый поток связан с определенной для потока очередью Задач. В режиме ожидания каждый поток берет пакет задач и помещает их в свою локальную очередь, где они затем выполняются по очереди. Если глобальная очередь пуста, поток будет искать Задачи в очередях своих одноранговых узлов и будет брать Задачи, которые находились в очереди дольше всех ( кража задач). При выполнении Задачи будут выполняться независимо, при этом изменение состояния одной Задачи не зависит от других. В результате, если они используют общий ресурс, их все равно необходимо синхронизировать вручную с помощью блокировок или других конструкций.