Omówienie współbieżności środowiska wykonawczego
Ten dokument zawiera omówienie środowiska uruchomieniowego współbieżności. Opisuje on zalety środowiska uruchomieniowego współbieżności, kiedy go używać oraz sposób, w jaki jego składniki współdziałają ze sobą i z systemem operacyjnym i aplikacjami.
Sekcje
Ten dokument zawiera następujące sekcje:
Historia implementacji środowiska uruchomieniowego współbieżności
Dlaczego środowisko uruchomieniowe współbieżności jest ważne
Historia implementacji środowiska uruchomieniowego współbieżności
W programie Visual Studio od 2010 do 2013 środowisko uruchomieniowe współbieżności zostało włączone w msvcr100.dll za pośrednictwem msvcr120.dll. Gdy refaktoryzacja UCRT wystąpiła w programie Visual Studio 2015, ta biblioteka DLL została refaktoryzowana na trzy części:
ucrtbase.dll — interfejs API języka C dostarczany w systemie Windows 10 i wyłączony z usługi za pośrednictwem usługi Windows Update—
vcruntime140.dll — kompilator obsługuje funkcje i środowisko uruchomieniowe EH dostarczane za pośrednictwem programu Visual Studio
concrt140.dll — środowisko uruchomieniowe współbieżności wysyłane za pośrednictwem programu Visual Studio. Wymagane dla kontenerów równoległych i algorytmów, takich jak
concurrency::parallel_for
. Ponadto biblioteka STL wymaga tej biblioteki DLL w systemie Windows XP do zasilania elementów pierwotnych synchronizacji, ponieważ system Windows XP nie ma zmiennych warunku.
W programie Visual Studio 2015 lub nowszym harmonogram zadań współbieżności środowiska uruchomieniowego nie jest już harmonogramem dla klasy zadań i powiązanych typów w pliku ppltasks.h. Te typy używają teraz puli wątków systemu Windows w celu uzyskania lepszej wydajności i współdziałania z elementami pierwotnymi synchronizacji systemu Windows.
Dlaczego środowisko uruchomieniowe współbieżności jest ważne
Środowisko uruchomieniowe współbieżności zapewnia jednolitość i przewidywalność aplikacji i składników aplikacji, które są uruchamiane jednocześnie. Dwa przykłady zalet środowiska uruchomieniowego współbieżności to planowanie zadań współpracy i blokowanie współpracy.
Środowisko uruchomieniowe współbieżności używa wspólnego harmonogramu zadań, który implementuje algorytm kradzieży pracy w celu wydajnego dystrybuowania pracy między zasobami obliczeniowymi. Rozważmy na przykład aplikację, która ma dwa wątki zarządzane przez to samo środowisko uruchomieniowe. Jeśli jeden wątek zakończy zaplanowane zadanie, może odciążyć pracę z drugiego wątku. Ten mechanizm równoważy ogólne obciążenie aplikacji.
Środowisko uruchomieniowe współbieżności udostępnia również typy pierwotne synchronizacji, które używają blokowania współpracy do synchronizowania dostępu do zasobów. Rozważmy na przykład zadanie, które musi mieć wyłączny dostęp do udostępnionego zasobu. Blokując kooperacyjnie, środowisko uruchomieniowe może użyć pozostałego kwantu do wykonania innego zadania, ponieważ pierwsze zadanie czeka na zasób. Ten mechanizm promuje maksymalne użycie zasobów obliczeniowych.
[Top]
Architektura
Środowisko uruchomieniowe współbieżności jest podzielone na cztery składniki: bibliotekę równoległych wzorców (PPL), bibliotekę agentów asynchronicznych, harmonogram zadań i menedżera zasobów. Te składniki znajdują się między systemem operacyjnym a aplikacjami. Na poniższej ilustracji przedstawiono sposób interakcji składników środowiska uruchomieniowego współbieżności między systemem operacyjnym i aplikacjami:
Architektura środowiska uruchomieniowego współbieżności
Ważne
Składniki harmonogramu zadań i usługi Resource Manager nie są dostępne w aplikacji platformy platforma uniwersalna systemu Windows (UWP) ani w przypadku używania klasy zadań lub innych typów w pliku ppltasks.h.
Środowisko uruchomieniowe współbieżności jest wysoce komponowalne, czyli można połączyć istniejące funkcje, aby zrobić więcej. Środowisko uruchomieniowe współbieżności komponuje wiele funkcji, takich jak algorytmy równoległe, od składników niższego poziomu.
Środowisko uruchomieniowe współbieżności udostępnia również typy pierwotne synchronizacji, które używają blokowania współpracy do synchronizowania dostępu do zasobów. Aby uzyskać więcej informacji na temat tych elementów pierwotnych synchronizacji, zobacz Struktury danych synchronizacji.
W poniższych sekcjach przedstawiono krótkie omówienie tego, co udostępnia każdy składnik i kiedy należy go używać.
Biblioteka równoległych wzorców
Biblioteka wzorców równoległych (PPL) udostępnia kontenery ogólnego przeznaczenia i algorytmy do wykonywania precyzyjnego równoległości. PPL umożliwia równoległość danych imperatywnych, udostępniając algorytmy równoległe, które dystrybuują obliczenia w kolekcjach lub zestawach danych w zasobach obliczeniowych. Umożliwia również równoległość zadań, udostępniając obiekty zadań, które dystrybuują wiele niezależnych operacji między zasobami obliczeniowymi.
Użyj biblioteki wzorców równoległych, jeśli masz lokalne obliczenia, które mogą korzystać z równoległego wykonywania. Na przykład możesz użyć współbieżności::p arallel_for algorithm, aby przekształcić istniejącą for
pętlę w celu równoległego działania.
Aby uzyskać więcej informacji na temat biblioteki wzorców równoległych, zobacz Biblioteka wzorców równoległych (PPL).
Biblioteki agentów asynchronicznych
Biblioteka agentów asynchronicznych (lub po prostu biblioteka agentów) udostępnia zarówno oparty na aktorach model programowania, jak i interfejsy przekazywania komunikatów dla gruboziarnistego przepływu danych i zadań potokowych. Agenci asynchroniczne umożliwiają wydajne korzystanie z opóźnienia, wykonując pracę, ponieważ inne składniki oczekują na dane.
Użyj biblioteki agentów, gdy masz wiele jednostek, które komunikują się ze sobą asynchronicznie. Można na przykład utworzyć agenta, który odczytuje dane z pliku lub połączenia sieciowego, a następnie używa interfejsów przekazywania komunikatów do wysyłania tych danych do innego agenta.
Aby uzyskać więcej informacji na temat biblioteki agentów, zobacz Biblioteka asynchronicznych agentów.
Harmonogram zadań
Harmonogram zadań planuje i koordynuje zadania w czasie wykonywania. Harmonogram zadań współpracuje i używa algorytmu kradzieży pracy w celu osiągnięcia maksymalnego użycia zasobów przetwarzania.
Środowisko uruchomieniowe współbieżności udostępnia domyślny harmonogram, dzięki czemu nie trzeba zarządzać szczegółami infrastruktury. Jednak aby spełnić wymagania dotyczące jakości aplikacji, możesz również udostępnić własne zasady planowania lub skojarzyć określone harmonogramy z określonymi zadaniami.
Aby uzyskać więcej informacji na temat harmonogramu zadań, zobacz Harmonogram zadań.
Resource Manager
Rola usługi Resource Manager polega na zarządzaniu zasobami obliczeniowymi, takimi jak procesory i pamięć. Usługa Resource Manager reaguje na obciążenia w miarę ich zmiany w czasie wykonywania, przypisując zasoby do miejsca, w którym mogą być najbardziej efektywne.
Usługa Resource Manager służy jako abstrakcja zasobów obliczeniowych i przede wszystkim współdziała z harmonogramem zadań. Chociaż za pomocą usługi Resource Manager można dostosować wydajność bibliotek i aplikacji, zazwyczaj używasz funkcji udostępnianych przez bibliotekę wzorców równoległych, bibliotekę agentów i harmonogram zadań. Te biblioteki używają usługi Resource Manager do dynamicznego ponownego równoważenia zasobów w miarę zmiany obciążeń.
[Top]
Wyrażenia lambda języka C++
Wiele typów i algorytmów zdefiniowanych przez środowisko uruchomieniowe współbieżności jest implementowanych jako szablony języka C++. Niektóre z tych typów i algorytmów przyjmują jako parametr procedurę, która wykonuje pracę. Ten parametr może być funkcją lambda, obiektem funkcji lub wskaźnikiem funkcji. Te jednostki są również określane jako funkcje pracy lub procedury pracy.
Wyrażenia lambda są ważną nową funkcją języka Visual C++, ponieważ zapewniają zwięzły sposób definiowania funkcji roboczych na potrzeby przetwarzania równoległego. Obiekty funkcji i wskaźniki funkcji umożliwiają używanie środowiska uruchomieniowego współbieżności z istniejącym kodem. Zalecamy jednak używanie wyrażeń lambda podczas pisania nowego kodu z powodu zapewnianych przez nie korzyści bezpieczeństwa i produktywności.
W poniższym przykładzie porównano składnię funkcji lambda, obiektów funkcji i wskaźników funkcji w wielu wywołaniach do algorytmu concurrency::p arallel_for_each . Każde wywołanie parallel_for_each
używa innej techniki do obliczenia kwadratu każdego elementu w obiekcie std::array .
// comparing-work-functions.cpp
// compile with: /EHsc
#include <ppl.h>
#include <array>
#include <iostream>
using namespace concurrency;
using namespace std;
// Function object (functor) class that computes the square of its input.
template<class Ty>
class SquareFunctor
{
public:
void operator()(Ty& n) const
{
n *= n;
}
};
// Function that computes the square of its input.
template<class Ty>
void square_function(Ty& n)
{
n *= n;
}
int wmain()
{
// Create an array object that contains 5 values.
array<int, 5> values = { 1, 2, 3, 4, 5 };
// Use a lambda function, a function object, and a function pointer to
// compute the square of each element of the array in parallel.
// Use a lambda function to square each element.
parallel_for_each(begin(values), end(values), [](int& n){n *= n;});
// Use a function object (functor) to square each element.
parallel_for_each(begin(values), end(values), SquareFunctor<int>());
// Use a function pointer to square each element.
parallel_for_each(begin(values), end(values), &square_function<int>);
// Print each element of the array to the console.
for_each(begin(values), end(values), [](int& n) {
wcout << n << endl;
});
}
Wyjście
1
256
6561
65536
390625
Aby uzyskać więcej informacji na temat funkcji lambda w języku C++, zobacz Wyrażenia lambda.
[Top]
Wymagania
W poniższej tabeli przedstawiono pliki nagłówkowe skojarzone z poszczególnymi składnikami środowiska uruchomieniowego współbieżności:
Składnik | Pliki nagłówkowe |
---|---|
Biblioteka równoległych wzorców (PLL) | ppl.h concurrent_queue.h concurrent_vector.h |
Biblioteki agentów asynchronicznych | agents.h |
Harmonogram zadań | concrt.h |
Resource Manager | concrtrm.h |
Środowisko uruchomieniowe współbieżności jest deklarowane w przestrzeni nazw współbieżności . (Można również użyć współbieżności, która jest aliasem dla tej przestrzeni nazw). concurrency::details
Przestrzeń nazw obsługuje strukturę środowiska uruchomieniowego współbieżności i nie ma być używana bezpośrednio z poziomu kodu.
Środowisko uruchomieniowe współbieżności jest udostępniane w ramach biblioteki środowiska uruchomieniowego języka C (CRT). Aby uzyskać więcej informacji na temat tworzenia aplikacji korzystającej z narzędzia CRT, zobacz Funkcje biblioteki CRT.
[Top]