Parallels Workstation
- 1 year ago
- 0
- 0
Parallel Extensions (с англ. — «Параллельные расширения») — библиотека управляемого параллелизма , разработанная в результате сотрудничества Microsoft Research и группы CLR в Microsoft . Библиотека была выпущена в версии 4.0 .NET Framework . Она состоит из двух частей: Параллельный LINQ (PLINQ) и Библиотека параллельных задач (TPL) . Она также состоит из набора структур данных координации (CDS) — наборов структур данных , используемых для синхронизации и координации выполнения параллельных задач .
PLINQ
или
Parallel
LINQ
распараллеливает выполнение запросов к объектам (LINQ для Объектов) и данным
XML
(LINQ для XML). PLINQ предназначен для выявления
с помощью запросов
. PLINQ может распараллелить любые вычисления над объектами, реализованные как запросы. Однако объекты должны реализовывать интерфейс
IParallelEnumerable
, который определяется самим PLINQ. Внутренне он использует для выполнения
.
Библиотека параллельных задач
(
TPL
) — это компонент
параллельных расширений .NET
. Она предоставляет параллельные конструкции, такие как параллельные циклы
For
и
ForEach
, с использованием обычных вызовов методов и
делегатов
, поэтому конструкции могут использоваться из любых
языков интерфейса командной строки
. Работа по порождению и завершению
потока
, а также масштабирование количества потоков в соответствии с количеством доступных процессоров выполняется самой библиотекой
, используя планировщик
.
TPL также включает другие конструкции, такие как Задача и Будущее . Задача — это действие, которое может выполняться независимо от остальной части программы. В этом смысле она семантически эквивалентна потоку, за исключением того, что это более лёгкий объект и не требует дополнительных затрат на создание потока ОС. Задачи ставятся в очередь объектом Диспетчер задач и планируются для выполнения в нескольких потоках ОС в , когда приходит их очередь.
Будущее — это задача, которая возвращает результат. Результат вычисляется в фоновом потоке, инкапсулированном объектом Future , и буферизуется до тех пор, пока не будет получен . Если будет сделана попытка получить результат до того, как он будет вычислен, то запрашивающий поток будет блокироваться до тех пор, пока результат не станет доступен .
Другой конструкцией TPL является класс Parallel . TPL предоставляет базовую форму структурированного параллелизма с помощью трёх статических методов в классе Parallel:
Основная концепция
Параллельных расширений .NET
— это
Задача
, которая представляет собой небольшой блок кода, обычно представленный как
лямбда-функция
, которая может выполняться независимо. Как PLINQ, так и TPL API предоставляют методы для создания Задач — PLINQ делит запрос на более мелкие Задачи, а методы
Parallel.For
,
Parallel.ForEach
и
Parallel.Invoke
разделяют цикл на задачи.
PFX включает объект
Диспетчер задач
, который планирует выполнение задач. Диспетчер задач содержит глобальную
очередь
задач, которые затем выполняются. Он также инкапсулирует несколько
потоков
, в которых выполняются Задачи. По умолчанию создаётся столько потоков, сколько процессоров (или ядер процессора) в системе, хотя это число может быть изменено вручную. Каждый поток связан с определённой для потока очередью Задач. В режиме ожидания каждый поток берёт пакет задач и помещает их в свою локальную очередь, где они затем выполняются по очереди. Если глобальная очередь пуста, поток будет искать Задачи в очередях своих одноранговых узлов и будет брать Задачи, которые находились в очереди дольше всех (
постепенный захват задач
). При выполнении Задачи будут выполняться независимо, при этом изменение состояния одной Задачи не зависит от других. В результате, если они используют общий ресурс, их всё равно необходимо синхронизировать вручную с помощью блокировок или других конструкций.