Parallel Extensions
![](http://178.128.105.246/host-http-upload.wikimedia.org/wikipedia/commons/thumb/d/d3/DotNet.svg/250px-DotNet.svg.png)
Parallel Extensions (с англ. — «Параллельные расширения») — библиотека управляемого параллелизма, разработанная в результате сотрудничества Microsoft Research и группы CLR[1] в Microsoft. Библиотека была выпущена в версии 4.0 .NET Framework[2]. Она состоит из двух частей: Параллельный LINQ (PLINQ) и Библиотека параллельных задач (TPL)[3][4]. Она также состоит из набора структур данных координации (CDS) — наборов структур данных, используемых для синхронизации и координации выполнения параллельных задач[5].
Параллельный LINQ
[править | править код]PLINQ или Parallel LINQ[6] распараллеливает выполнение запросов к объектам (LINQ для Объектов) и данным XML[7] (LINQ для XML). PLINQ предназначен для выявления параллелизма данных[англ.] с помощью запросов[3]. PLINQ может распараллелить любые вычисления над объектами, реализованные как запросы. Однако объекты должны реализовывать интерфейс IParallelEnumerable
, который определяется самим PLINQ. Внутренне он использует для выполнения TPL[5].
Библиотека параллельных задач
[править | править код]Библиотека параллельных задач (TPL[8]) — это компонент параллелизма задач[укр.] параллельных расширений .NET
[9]. Она предоставляет параллельные конструкции, такие как параллельные циклы For
и ForEach
, с использованием обычных вызовов методов и делегатов, поэтому конструкции могут использоваться из любых языков интерфейса командной строки. Работа по порождению и завершению потока, а также масштабирование количества потоков в соответствии с количеством доступных процессоров выполняется самой библиотекой[4], используя планировщик постепенного захвата работы[10].
TPL также включает другие конструкции, такие как Задача и Будущее. Задача — это действие, которое может выполняться независимо от остальной части программы. В этом смысле она семантически эквивалентна потоку, за исключением того, что это более лёгкий объект и не требует дополнительных затрат на создание потока ОС. Задачи ставятся в очередь объектом Диспетчер задач и планируются для выполнения в нескольких потоках ОС в пуле потоков[англ.], когда приходит их очередь.
Будущее — это задача, которая возвращает результат. Результат вычисляется в фоновом потоке, инкапсулированном объектом Future, и буферизуется до тех пор, пока не будет получен[4]. Если будет сделана попытка получить результат до того, как он будет вычислен, то запрашивающий поток будет блокироваться до тех пор, пока результат не станет доступен[9].
Другой конструкцией TPL является класс Parallel. TPL предоставляет базовую форму структурированного параллелизма с помощью трёх статических методов в классе Parallel:
- Parallel.Invoke
- Параллельно выполняет массив делегатов Action, а затем ожидает их завершения
- Parallel.For
- Параллельный эквивалент цикла for в C#
- Parallel.ForEach
- Параллельный эквивалент цикла foreach в C#
Архитектура
[править | править код]Основная концепция Параллельных расширений .NET — это Задача
, которая представляет собой небольшой блок кода, обычно представленный как лямбда-функция, которая может выполняться независимо. Как PLINQ, так и TPL API предоставляют методы для создания Задач — PLINQ делит запрос на более мелкие Задачи, а методы Parallel.For
, Parallel.ForEach
и Parallel.Invoke
разделяют цикл на задачи.
PFX включает объект Диспетчер задач
, который планирует выполнение задач. Диспетчер задач содержит глобальную очередь задач, которые затем выполняются. Он также инкапсулирует несколько потоков, в которых выполняются Задачи. По умолчанию создаётся столько потоков, сколько процессоров (или ядер процессора) в системе, хотя это число может быть изменено вручную. Каждый поток связан с определённой для потока очередью Задач. В режиме ожидания каждый поток берёт пакет задач и помещает их в свою локальную очередь, где они затем выполняются по очереди. Если глобальная очередь пуста, поток будет искать Задачи в очередях своих одноранговых узлов и будет брать Задачи, которые находились в очереди дольше всех (постепенный захват задач). При выполнении Задачи будут выполняться независимо, при этом изменение состояния одной Задачи не зависит от других. В результате, если они используют общий ресурс, их всё равно необходимо синхронизировать вручную с помощью блокировок или других конструкций.
См. также
[править | править код]- Concurrency and Coordination Runtime.
- Cilk/Cilk Plus — сравнимая технология для C и C++.
- Grand Central Dispatch — сравнимая технология в Mac OS X 10.6 разработанная фирмой Apple.
- Параллелизм в Java — сравнимая технология в Java (также известна как JSR 166).
- Intel Threading Building Blocks (ITBB) — сравнимая технология для C++, доступна для многих систем, изначально созданных Intel (также с открытым исходным кодом).
Ссылки
[править | править код]- ↑ Сокращение от Common Language Runtime (рус. Общеязыковая среда выполнения)
- ↑ Что нового в .NET Framework 4 . Дата обращения: 21 сентября 2011. Архивировано 23 сентября 2011 года.
- ↑ 1 2 Программирование в эпоху параллелизма: Параллельное программирование с помощью PFX . Дата обращения: 16 октября 2007. Архивировано 2 мая 2008 года.
- ↑ 1 2 3 Журнал MSDN: Библиотека параллельных задач . Дата обращения: 16 октября 2007. Архивировано 14 октября 2007 года.
- ↑ 1 2 Июнь 2008 года. CTP — Параллельные расширения .NET FX . Дата обращения: 6 августа 2008. Архивировано 21 августа 2008 года.
- ↑ Сокращение от Language INtegrated Query (рус. Интегрированный языковой запрос)
- ↑ Сокращение от eXtensible Markup Language (рус. Расширяемый язык разметки)
- ↑ Сокращение от Task Parallel Library
- ↑ 1 2 Джо Даффи. Параллельное программирование в Windows. — 2009. — P. "887–929". — ISBN 978-0321434821.
- ↑ Даан Лейен; Вольфрам Шульте; Себастьян Буркхардт (2009). "Дизайн библиотеки параллельных задач". Уведомления ACM SIGPLAN. 44 (10): 227. CiteSeerX 10.1.1.146.4197. doi:10.1145/1639949.1640106.