Rozszerzenia równoległe — Parallel Extensions
Parallel Extensions to nazwa programistyczna dla zarządzanej biblioteki współbieżności opracowanej we współpracy między Microsoft Research i zespołem CLR w firmie Microsoft . Biblioteka została wydana w wersji 4.0 systemu .NET Framework . Składa się z dwóch części: Parallel LINQ (PLINQ) i Task Parallel Library (TPL). Składa się również z zestawu koordynacyjnych struktur danych (CDS) – zestawów struktur danych służących do synchronizacji i koordynowania wykonywania współbieżnych zadań.
Równoległe LINQ
PLINQ lub Parallel LINQ , zrównoleglenie wykonywania zapytań na obiektach (LINQ to Objects) i danych XML (LINQ to XML). PLINQ jest przeznaczony do ujawniania równoległości danych za pomocą zapytań. Wszelkie obliczenia na obiektach, które zostały zaimplementowane jako zapytania, mogą być zrównoleglone przez PLINQ. Jednak obiekty muszą zaimplementować IParallelEnumerable
interfejs, który jest zdefiniowany przez sam PLINQ. Wewnętrznie używa TPL do wykonania.
Biblioteka zadań równoległych
Task Parallel Library ( TPL ) jest równoległość zadanie składnikiem Parallel Extensions dla .NET. Uwidacznia konstrukcje równoległe, takie jak równoległe For
i ForEach
pętle, przy użyciu zwykłych wywołań metod i delegatów , dzięki czemu konstrukcje mogą być używane z dowolnych języków CLI . Zadanie tworzenia i kończenia wątków , a także skalowanie liczby wątków zgodnie z liczbą dostępnych procesorów, jest wykonywane przez samą bibliotekę, korzystając z harmonogramu kradnącego pracę .
TPL obejmuje również inne konstrukcje, takie jak Zadanie i Przyszłość . Zadanie jest działaniem, które mogą być wykonywane niezależnie od reszty programu. W tym sensie jest semantycznie równoważny wątkowi, z wyjątkiem tego, że jest to lżejszy obiekt i nie ma narzutu związanego z tworzeniem wątku systemu operacyjnego. Zadania są umieszczane w kolejce przez obiekt Menedżera zadań i są zaplanowane do uruchomienia w wielu wątkach systemu operacyjnego w puli wątków, gdy nadejdzie ich kolej.
Przyszłość to zadanie, które zwraca wynik. Wynik jest obliczany w wątku w tle hermetyzowanym przez obiekt Future , a wynik jest buforowany do momentu pobrania. Jeśli zostanie podjęta próba pobrania wyniku przed jego obliczeniem, wątek żądający będzie blokowany, dopóki wynik nie będzie dostępny.
Inną konstrukcją TPL jest klasa Parallel . TPL zapewnia podstawową formę równoległości strukturalnej za pomocą trzech metod statycznych w klasie Parallel:
- Równolegle.Wywołaj
- Wykonuje równolegle tablicę delegatów Action, a następnie czeka na ich zakończenie
- Równolegle.Dla
- Równoległy odpowiednik pętli for w języku C#
- Równolegle.Dla każdego
- Równoległy odpowiednik pętli foreach w języku C#
Architektura
Główną koncepcją w Parallel Extensions do .NET jest a Task
, która jest małą jednostką kodu, zwykle reprezentowaną jako funkcja lambda , która może być wykonywana niezależnie. Zarówno PLINQ, jak i interfejs API TPL udostępniają metody tworzenia zadań — PLINQ dzieli zapytanie na mniejsze zadania Parallel.For
, Parallel.ForEach
a Parallel.Invoke
metody i dzielą pętlę na zadania.
PFX zawiera Task Manager
obiekt, który planuje wykonanie zadań. Menedżer zadań zawiera globalną kolejkę zadań, które są następnie wykonywane. Zawiera również wiele wątków, na których wykonywane są zadania. Domyślnie tworzonych jest tyle wątków, ile jest procesorów (lub rdzeni procesorów) w systemie, chociaż liczba ta może być modyfikowana ręcznie. Każdy wątek jest powiązany z kolejką zadań specyficzną dla wątku. W stanie bezczynności każdy wątek pobiera partię zadań i umieszcza je w swojej lokalnej kolejce, gdzie są następnie wykonywane jeden po drugim. Jeśli globalna kolejka jest pusta, wątek będzie szukał zadań w kolejkach swoich sąsiadów i weźmie zadania, które były w kolejce najdłużej ( kradzież zadań ). W trakcie realizacji Zadania będą wykonywane niezależnie, przy czym zmiana stanu jednego Zadania będzie niezależna od pozostałych. W rezultacie, jeśli używają zasobu udostępnionego, nadal muszą być synchronizowane ręcznie przy użyciu blokad lub innych konstrukcji.
Zobacz też
- Środowisko wykonawcze współbieżności i koordynacji
- Łączy
- Cilk / Cilk Plus – porównywalna technologia dla C i C++
- Grand Central Dispatch — porównywalna technologia w systemie Mac OS X 10.6 opracowana przez firmę Apple .
- Java Concurrency – porównywalna technologia w Javie (znana również jako JSR 166 ).
- Threading Building Blocks (TBB) - porównywalna technologia dla C++ dostępna dla wielu systemów stworzonych oryginalnie przez Intela (również open source)
- Wzór puli wątków
- Równoległość zadań
- ReactiveX (Reaktywne rozszerzenia)