Parallel Extensions

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая Сбыча мечт (обсуждение | вклад) в 11:50, 25 мая 2021 (Преамбула: оформление). Она может серьёзно отличаться от текущей версии.
Перейти к навигации Перейти к поиску
Стек и компоненты .NET Framework до версии 4.5 включительно.

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 включает объект Диспетчер задач, который планирует выполнение задач. Диспетчер задач содержит глобальную очередь задач, которые затем выполняются. Он также инкапсулирует несколько потоков, в которых выполняются Задачи. По умолчанию создаётся столько потоков, сколько процессоров (или ядер процессора) в системе, хотя это число может быть изменено вручную. Каждый поток связан с определённой для потока очередью Задач. В режиме ожидания каждый поток берёт пакет задач и помещает их в свою локальную очередь, где они затем выполняются по очереди. Если глобальная очередь пуста, поток будет искать Задачи в очередях своих одноранговых узлов и будет брать Задачи, которые находились в очереди дольше всех (постепенный захват задач). При выполнении Задачи будут выполняться независимо, при этом изменение состояния одной Задачи не зависит от других. В результате, если они используют общий ресурс, их всё равно необходимо синхронизировать вручную с помощью блокировок или других конструкций.

См. также

Ссылки

  1. Сокращение от Common Language Runtime (рус. Общеязыковая среда выполнения)
  2. Что нового в .NET Framework 4. Дата обращения: 21 сентября 2011.
  3. 1 2 Программирование в эпоху параллелизма: Параллельное программирование с помощью PFX. Дата обращения: 16 октября 2007.
  4. 1 2 3 Журнал MSDN: Библиотека параллельных задач. Дата обращения: 16 октября 2007. Архивировано 14 октября 2007 года.
  5. 1 2 Июнь 2008 года. CTP — Параллельные расширения .NET FX. Дата обращения: 6 августа 2008.
  6. Сокращение от Language INtegrated Query (рус. Интегрированный языковой запрос)
  7. Сокращение от eXtensible Markup Language (рус. Расширяемый язык разметки)
  8. Сокращение от Task Parallel Library
  9. 1 2 Джо Даффи. Параллельное программирование в Windows. — 2009. — P. "887–929". — ISBN 978-0321434821.
  10. Даан Лейен (2009). Дизайн библиотеки параллельных задач. Уведомления ACM SIGPLAN. 44 (10): 227. CiteSeerX 10.1.1.146.4197. doi:10.1145/1639949.1640106. {{cite journal}}: Неизвестный параметр |coauthors= игнорируется (|author= предлагается) (справка)

Внешние ссылки