Русская Википедия:Parallel Extensions

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Файл:DotNet.svg
Стек и компоненты .NET Framework до версии 4.5 включительно.

Parallel Extensions (Шаблон:Tr) — библиотека управляемого параллелизма, разработанная в результате сотрудничества 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 предназначен для выявления Шаблон:Нп5 с помощью запросов[3]. PLINQ может распараллелить любые вычисления над объектами, реализованные как запросы. Однако объекты должны реализовывать интерфейс IParallelEnumerable, который определяется самим PLINQ. Внутренне он использует для выполнения TPL[5].

Библиотека параллельных задач

Библиотека параллельных задач (TPL[8]) — это компонент Шаблон:Нп5 параллельных расширений .NET [9]. Она предоставляет параллельные конструкции, такие как параллельные циклы For и ForEach, с использованием обычных вызовов методов и делегатов, поэтому конструкции могут использоваться из любых языков интерфейса командной строки. Работа по порождению и завершению потока, а также масштабирование количества потоков в соответствии с количеством доступных процессоров выполняется самой библиотекой[4], используя планировщик постепенного захвата работы[10].

TPL также включает другие конструкции, такие как Задача и Будущее. Задача — это действие, которое может выполняться независимо от остальной части программы. В этом смысле она семантически эквивалентна потоку, за исключением того, что это более лёгкий объект и не требует дополнительных затрат на создание потока ОС. Задачи ставятся в очередь объектом Диспетчер задач и планируются для выполнения в нескольких потоках ОС в Шаблон:Нп5, когда приходит их очередь.

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

См. также

Ссылки

Шаблон:Reflist

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

Шаблон:Wikibooks

Шаблон:.NET Шаблон:Параллельные вычисления

  1. Сокращение от Common Language Runtime (рус. Общеязыковая среда выполнения)
  2. Шаблон:Cite web
  3. 3,0 3,1 Шаблон:Cite web
  4. 4,0 4,1 4,2 Шаблон:Cite web
  5. 5,0 5,1 Шаблон:Cite web
  6. Сокращение от Language INtegrated Query (рус. Интегрированный языковой запрос)
  7. Сокращение от eXtensible Markup Language (рус. Расширяемый язык разметки)
  8. Сокращение от Task Parallel Library
  9. 9,0 9,1 Шаблон:Cite book
  10. Шаблон:Cite journal