Лучшие вопросы
Таймлайн
Чат
Перспективы

Parallel Extensions

Из Википедии, свободной энциклопедии

Parallel Extensions
Remove ads

Parallel Extensions (с англ.«Параллельные расширения») — библиотека управляемого параллелизма, разработанная в результате сотрудничества Microsoft Research и группы CLR[1] в Microsoft. Библиотека была выпущена в версии 4.0 .NET Framework[2]. Она состоит из двух частей: Параллельный LINQ (PLINQ) и Библиотека параллельных задач (TPL)[3][4]. Она также состоит из набора структур данных координации (CDS) — наборов структур данных, используемых для синхронизации и координации выполнения параллельных задач[5].

Thumb
Стек и компоненты .NET Framework до версии 4.5 включительно.
Remove ads

Параллельный LINQ

PLINQ или Parallel LINQ[6] распараллеливает выполнение запросов к объектам (LINQ для Объектов) и данным XML[7] (LINQ для XML). PLINQ предназначен для выявления параллелизма данных[англ.] с помощью запросов[3]. PLINQ может распараллелить любые вычисления над объектами, реализованные как запросы. Однако объекты должны реализовывать интерфейс IParallelEnumerable, который определяется самим PLINQ. Внутренне он использует для выполнения TPL[5].

Remove ads

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

Суммиров вкратце
Перспектива

Библиотека параллельных задач (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#
Remove ads

Архитектура

Суммиров вкратце
Перспектива

Основная концепция Параллельных расширений .NET — это Задача, которая представляет собой небольшой блок кода, обычно представленный как лямбда-функция, которая может выполняться независимо. Как PLINQ, так и TPL API предоставляют методы для создания Задач — PLINQ делит запрос на более мелкие Задачи, а методы Parallel.For, Parallel.ForEach и Parallel.Invoke разделяют цикл на задачи.

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

См. также

Remove ads

Ссылки

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

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads