Параллельные расширения
Parallel Extensions — это название управляемого параллелизма библиотеки , разработанной в результате сотрудничества Microsoft Research и команды CLR в Microsoft . Библиотека была выпущена в версии 4.0 .NET Framework . [1] Он состоит из двух частей: параллельного LINQ (PLINQ) и библиотеки параллельных задач (TPL). [2] [3] Он также состоит из набора структур данных координации (CDS) — наборов структур данных, используемых для синхронизации и координации выполнения параллельных задач. [4]
Параллельный LINQ
[ редактировать ]PLINQ или Parallel LINQ , распараллелив выполнение запросов к объектам (LINQ to Objects) и данным XML (LINQ to XML). PLINQ предназначен для выявления параллелизма данных с помощью запросов. [2] Любые вычисления над объектами, реализованные в виде запросов, могут быть распараллелены с помощью PLINQ. Однако объекты должны реализовывать IParallelEnumerable
интерфейс, который определяется самим PLINQ. Внутри он использует TPL для выполнения. [4] [5]
Параллельная библиотека задач
[ редактировать ]Библиотека параллельных задач ( TPL ) — это компонент параллелизма задач в составе параллельных расширений для .NET. [6] Он предоставляет параллельные конструкции, такие как параллельный For
и ForEach
циклы, используя обычные вызовы методов и делегаты , поэтому конструкции можно использовать из любых языков CLI . Работу по созданию и завершению потоков , а также масштабированию количества потоков в соответствии с количеством доступных процессоров выполняет сама библиотека. [3] использование планировщика кражи работы . [7]
TPL также включает в себя другие конструкции, такие как Task и Future . Задача — это действие , которое может выполняться независимо от остальной части программы. В этом смысле он семантически эквивалентен потоку, за исключением того, что он является более легким объектом и не требует затрат на создание потока ОС. Задачи ставятся в очередь объектом диспетчера задач и планируются для выполнения в нескольких потоках ОС в пуле потоков, когда приходит их очередь.
Будущее — это задача, которая возвращает результат. Результат вычисляется в фоновом потоке, инкапсулированном объектом Future , и сохраняется в буфере до тех пор, пока не будет получен. [3] Если будет предпринята попытка получить результат до того, как он будет вычислен, запрашивающий поток будет заблокирован до тех пор, пока результат не будет доступен. [6]
Другая конструкция TPL — класс Parallel .TPL обеспечивает базовую форму структурированного параллелизма посредством трех статических методов класса Parallel:
- Параллельный вызов
- Параллельно выполняет массив делегатов Action, а затем ожидает их завершения.
- Параллельно.Для
- Параллельный эквивалент цикла for C#.
- Параллельный.ForEach
- Параллельный эквивалент цикла foreach в C#.
Архитектура
[ редактировать ]Основная концепция параллельных расширений .NET — это Task
, который представляет собой небольшой блок кода, обычно представленный в виде лямбда-функции , который может выполняться независимо. И PLINQ, и TPL API предоставляют методы для создания задач: PLINQ делит запрос на более мелкие задачи, а Parallel.For
, Parallel.ForEach
и Parallel.Invoke
методы делят цикл на задачи.
PFX включает в себя Task Manager
объект, который планирует выполнение задач. Диспетчер задач содержит глобальную очередь задач, которые затем выполняются. Он также инкапсулирует несколько потоков , в которых выполняются задачи. По умолчанию создается столько потоков, сколько процессоров (или ядер процессоров) имеется в системе, хотя это число можно изменить вручную. Каждый поток связан с очередью задач, специфичной для потока. В режиме ожидания каждый поток берет пакет задач и помещает их в свою локальную очередь, где они затем выполняются одна за другой. Если глобальная очередь пуста, поток будет искать задачи в очередях своих одноранговых узлов и брать задачи, которые находились в очереди дольше всего ( кража задач ). Во время выполнения Задачи будут выполняться независимо, при этом изменение состояния одной Задачи будет независимым от других. В результате, если они используют общий ресурс, их все равно необходимо синхронизировать вручную с помощью блокировок или других конструкций.
См. также
[ редактировать ]- Среда выполнения параллелизма и координации
- Присоединяется
- Cilk / Cilk Plus – сопоставимая технология для C и C++.
- Grand Central Dispatch — аналогичная технология в Mac OS X 10.6, разработанная Apple .
- Java Concurrency — аналогичная технология в Java (также известная как JSR 166 ).
- Threading Building Blocks (TBB) — технология, аналогичная C++, доступная для многих систем, изначально созданных Intel (также с открытым исходным кодом).
- Шаблон пула потоков
- Параллелизм задач
- ReactiveX (реактивные расширения)
Ссылки
[ редактировать ]- ^ «Что нового в .NET Framework 4» . Проверено 21 сентября 2011 г.
- ^ Jump up to: а б «Программирование в эпоху параллелизма: параллельное программирование с PFX» . Проверено 16 октября 2007 г.
- ^ Jump up to: а б с «Журнал MSDN: Библиотека параллельных задач» . Архивировано из оригинала 14 октября 2007 года . Проверено 16 октября 2007 г.
- ^ Jump up to: а б «CTP, июнь 2008 г. — параллельные расширения .NET FX» . Проверено 6 августа 2008 г.
- ^ «Более мощные агрегаты в PLINQ» . Проверено 6 августа 2008 г.
- ^ Jump up to: а б Даффи, Джо (2009). Параллельное программирование в Windows . стр. 887–929. ISBN 978-0321434821 .
- ^ Лейен, Даан; Шульте, Вольфрам; Буркхардт, Себастьян (2009). «Проектирование библиотеки параллельных задач». Уведомления ACM SIGPLAN . 44 (10): 227. CiteSeerX 10.1.1.146.4197 . дои : 10.1145/1639949.1640106 .
Внешние ссылки
[ редактировать ]