Porównywanie współbieżności środowiska wykonawczego z innymi modelami współbieżnościComparing the Concurrency Runtime to Other Concurrency Models

W tym dokumencie opisano różnice między funkcjami i modelami programowania środowisko uruchomieniowe współbieżności i innymi technologiami.This document describes the differences between the features and programming models of the Concurrency Runtime and other technologies. Zrozumienie, jak korzyści z środowisko uruchomieniowe współbieżności porównać z korzyściami z innych modeli programowania, można wybrać technologię, która najlepiej spełnia wymagania aplikacji.By understanding how the benefits of the Concurrency Runtime compare to the benefits of other programming models, you can select the technology that best satisfies the requirements of your applications.

Jeśli obecnie używasz innego modelu programowania, takiego jak Pula wątków systemu Windows lub OpenMP, istnieją sytuacje, w których może być odpowiednie do migracji do środowisko uruchomieniowe współbieżności.If you are currently using another programming model, such as the Windows thread pool or OpenMP, there are situations where it can be appropriate to migrate to the Concurrency Runtime. Na przykład temat Migrowanie z OpenMP do środowisko uruchomieniowe współbieżności opisuje, kiedy może być odpowiednie do migracji z openmp do środowisko uruchomieniowe współbieżności.For example, the topic Migrating from OpenMP to the Concurrency Runtime describes when it can be appropriate to migrate from OpenMP to the Concurrency Runtime. Jednak w przypadku spełnienia wymagań dotyczących wydajności aplikacji i bieżącej obsługi debugowania migracja nie jest wymagana.However, if you are satisfied with application performance and current debugging support, migration is not required.

Korzystając z funkcji i korzyści związanych z produktywnością środowisko uruchomieniowe współbieżności, można uzupełnić istniejącą aplikację, która korzysta z innego modelu współbieżności.You can use the features and productivity benefits of the Concurrency Runtime to complement your existing application that uses another concurrency model. Środowisko uruchomieniowe współbieżności nie może zagwarantować równoważenia obciążenia, gdy wiele harmonogramów zadań jest konkurujących dla tych samych zasobów obliczeniowych.The Concurrency Runtime cannot guarantee load balancing when multiple task schedulers compete for the same computing resources. Jeśli jednak obciążenia nie nakładają się na siebie, ten efekt jest minimalny.However, when workloads do not overlap, this effect is minimal.

PoszczególneSections

Porównywanie planowania z przeznaczeniem do wspólnego planowaniaComparing Preemptive Scheduling to Cooperative Scheduling

Model zastępujący i wspólne modele planowania są dwa typowe sposoby na umożliwienie wielu zadań współdzielenia zasobów obliczeniowych, na przykład procesorów lub wątków sprzętowych.The preemptive model and cooperative scheduling models are two common ways to enable multiple tasks to share computing resources, for example, processors or hardware threads.

Planowanie zastępujące i wspólnePreemptive and Cooperative Scheduling

Planowanie zastępujące to mechanizm okrężny, oparty na priorytetach, który zapewnia każdemu użytkownikowi wyłączny dostęp do zasobu obliczeniowego w danym okresie, a następnie przełącza się do innego zadania.Preemptive scheduling is a round-robin, priority-based mechanism that gives every task exclusive access to a computing resource for a given time period, and then switches to another task. Planowanie zastępujące jest wspólne w przypadku wielozadańowych systemów operacyjnych, takich jak Windows.Preemptive scheduling is common in multitasking operating systems such as Windows. Planowanie wspólne jest mechanizmem, który zapewnia każdemu użytkownikowi wyłączny dostęp do zasobów obliczeniowych do momentu zakończenia zadania lub do momentu uzyskania przez zadanie dostępu do zasobu.Cooperative scheduling is a mechanism that gives every task exclusive access to a computing resource until the task finishes or until the task yields its access to the resource. Środowisko uruchomieniowe współbieżności korzysta z planowania wspólnego wraz z zaplanowanym harmonogramem systemu operacyjnego w celu osiągnięcia maksymalnego użycia zasobów przetwarzania.The Concurrency Runtime uses cooperative scheduling together with the preemptive scheduler of the operating system to achieve maximum usage of processing resources.

Różnice między programami zastępujące i spółdzielnieDifferences Between Preemptive and Cooperative Schedulers

Zastępujący harmonogramy starają się dać wielu wątkom równy dostęp do zasobów obliczeniowych, aby upewnić się, że każdy wątek wykonuje postęp.Preemptive schedulers seek to give multiple threads equal access to computing resources to ensure that every thread makes progress. Na komputerach, które mają wiele zasobów obliczeniowych, zapewnienie sprawiedliwego dostępu jest mniej problematyczne. jednak zapewnienie efektywnego wykorzystania zasobów jest bardziej problematyczne.On computers that have many computing resources, ensuring fair access becomes less problematic; however, ensuring efficient utilization of the resources becomes more problematic.

Zastępujący harmonogram trybu jądra wymaga, aby kod aplikacji korzystał z systemu operacyjnego w celu podejmowania decyzji dotyczących planowania.A preemptive kernel-mode scheduler requires the application code to rely on the operating system to make scheduling decisions. Z kolei współpraca w trybie użytkownika umożliwia wykonywanie własnych decyzji dotyczących planowania przez kod aplikacji.Conversely, a user-mode cooperative scheduler enables application code to make its own scheduling decisions. Ze względu na to, że planowanie w ramach współpracy umożliwia wykonywanie wielu decyzji dotyczących planowania przez aplikację, zmniejsza to wiele nakładów związanych z synchronizacją w trybie jądra.Because cooperative scheduling enables many scheduling decisions to be made by the application, it reduces much of the overhead that is associated with kernel-mode synchronization. Harmonogram współpracy zwykle uwzględnia decyzje związane z planowaniem jądra systemu operacyjnego, gdy nie ma żadnych innych zadań do zaplanowania.A cooperative scheduler typically defers scheduling decisions to the operating system kernel when it has no other work to schedule. W przypadku operacji blokującej, która jest przekazywana do jądra, w ramach usługi Scheduler zostanie również przekazany do harmonogramu systemu operacyjnego, ale ta operacja nie jest przekazywana do harmonogramu trybu użytkownika.A cooperative scheduler also defers to the operating system scheduler when there is a blocking operation that is communicated to the kernel, but that operation is not communicated to the user-mode scheduler.

Wspólne planowanie i wydajnośćCooperative Scheduling and Efficiency

W przypadku harmonogramu zastępują wszystkie prace o tym samym poziomie priorytetu są równe.To a preemptive scheduler, all work that has the same priority level is equal. Harmonogram zastępujący przeważnie planuje wątki w kolejności, w której zostały utworzone.A preemptive scheduler typically schedules threads in the order in which they are created. Ponadto harmonogram zastępujący przypisuje każdy wątek a czas w sposób okrężny, na podstawie priorytetu wątku.Furthermore, a preemptive scheduler gives every thread a time slice in a round-robin manner, based on thread priority. Mimo że ten mechanizm zapewnia godziwość (każdy wątek postępuje postęp), jest to koszt wydajności.Although this mechanism provides fairness (every thread makes forward progress), it comes at some cost of efficiency. Na przykład wiele algorytmów intensywnie korzystających z obliczeń nie wymaga godziwości.For example, many computation-intensive algorithms do not require fairness. Zamiast tego ważne jest, aby powiązane zadania kończyły się w minimalnym czasie.Instead, it is important that related tasks finish in the least overall time. Wspólne planowanie pozwala aplikacji na efektywniejsze planowanie pracy.Cooperative scheduling enables an application to more efficiently schedule work. Rozważmy na przykład aplikację, która ma wiele wątków.For example, consider an application that has many threads. Planowanie wątków, które nie udostępniają zasobów do uruchamiania współbieżnie, może zmniejszyć obciążenie synchronizacji i zwiększyć wydajność.Scheduling threads that do not share resources to run concurrently can reduce synchronization overhead and thereby increase efficiency. Innym wydajnym sposobem planowania zadań jest uruchamianie potoków zadań (gdzie każde zadanie działa na danych wyjściowych poprzedniego) na tym samym procesorze, tak aby dane wejściowe poszczególnych etapów potoku zostały już załadowane do pamięci podręcznej pamięci.Another efficient way to schedule tasks is to run pipelines of tasks (where each task acts on the output of the previous one) on the same processor so that the input of each pipeline stage is already loaded into the memory cache.

Używanie planowania z przeznaczeniem i współdziałaniem wspólnieUsing Preemptive and Cooperative Scheduling Together

W ramach planowania wspólnego nie są rozwiązywane wszystkie problemy związane z planowaniem.Cooperative scheduling does not solve all scheduling problems. Na przykład zadania, które nie są dość związane z innymi zadaniami, mogą zużywać wszystkie dostępne zasoby obliczeniowe i uniemożliwiać wykonywanie innych zadań.For example, tasks that do not fairly yield to other tasks can consume all available computing resources and prevent other tasks from making progress. Środowisko uruchomieniowe współbieżności korzysta z zalet w zakresie wydajności w ramach planowania współdziałania, aby uzupełnić gwarancje związane z planowaniem zastępujące.The Concurrency Runtime uses the efficiency benefits of cooperative scheduling to complement the fairness guarantees of preemptive scheduling. Domyślnie środowisko uruchomieniowe współbieżności zapewnia wspólny harmonogram, który korzysta z algorytmu kradzieży pracy w celu efektywnego dystrybuowania pracy między zasobami obliczeniowymi.By default, the Concurrency Runtime provides a cooperative scheduler that uses a work-stealing algorithm to efficiently distribute work among computing resources. Jednak usługa środowisko uruchomieniowe współbieżności Scheduler opiera się również na założeniu harmonogramu systemu operacyjnego w celu stosunkowo spójnej dystrybucji zasobów między aplikacjami.However, the Concurrency Runtime scheduler also relies on the preemptive scheduler of the operating system to fairly distribute resources among applications. Możesz również utworzyć niestandardowe harmonogramy i zasady harmonogramu w aplikacjach, aby utworzyć szczegółową kontrolę nad wykonywaniem wątków.You can also create custom schedulers and scheduler policies in your applications to produce fine-grained control over thread execution.

[Top][Top]

Porównywanie środowisko uruchomieniowe współbieżności z interfejsem API systemu WindowsComparing the Concurrency Runtime to the Windows API

Interfejs programowania aplikacji systemu Microsoft Windows, który jest zwykle określany jako interfejs API systemu Windows (i dawniej znany jako Win32), zapewnia model programowania, który umożliwia współbieżność aplikacji.The Microsoft Windows application programming interface, which is typically referred to as the Windows API (and formerly known as Win32), provides a programming model that enables concurrency in your applications. Środowisko uruchomieniowe współbieżności kompiluje się w interfejsie API systemu Windows w celu zapewnienia dodatkowych modeli programistycznych, które nie są dostępne w podstawowym systemie operacyjnym.The Concurrency Runtime builds on the Windows API to provide additional programming models that are not available from the underlying operating system.

Środowisko uruchomieniowe współbieżności kompiluje w modelu wątku interfejsu API systemu Windows w celu wykonania równoległej pracy.The Concurrency Runtime builds on the Windows API thread model to perform parallel work. Używa również mechanizmów zarządzania pamięcią interfejsu API systemu Windows i lokalnego magazynu wątków.It also uses the Windows API memory management and thread-local storage mechanisms. W systemach Windows 7 i Windows Server 2008 R2 korzysta z obsługi interfejsu API systemu Windows dla wątków i komputerów, które mają więcej niż 64 wątków sprzętowych.On Windows 7 and Windows Server 2008 R2, it uses Windows API support for user-schedulable threads and computers that have more than 64 hardware threads. Środowisko uruchomieniowe współbieżności rozszerza model interfejsu API systemu Windows, dostarczając wspólny harmonogram zadań i algorytm kradzieży pracy, aby zmaksymalizować wykorzystanie zasobów obliczeniowych i włączyć wiele równoczesnych wystąpień usługi Scheduler.The Concurrency Runtime extends the Windows API model by providing a cooperative task scheduler and a work-stealing algorithm to maximize the use of computing resources, and by enabling multiple simultaneous scheduler instances.

Języki programowaniaProgramming Languages

Interfejs API systemu Windows używa języka programowania C, aby uwidocznić model programowania.The Windows API uses the C programming language to expose the programming model. Środowisko uruchomieniowe współbieżności udostępnia interfejs programowania w języku C++, który korzysta z najnowszych funkcji w języku C++.The Concurrency Runtime provides a C++ programming interface that takes advantage of the newest features in the C++ language. Na przykład funkcje lambda zapewniają zwięzły, bezpieczny dla typu mechanizm do definiowania równoległych funkcji roboczych.For example, lambda functions provide a succinct, type-safe mechanism for defining parallel work functions. Aby uzyskać więcej informacji na temat najnowszych funkcji języka C++, których używa środowisko uruchomieniowe współbieżności, zobacz Omówienie.For more information about the newest C++ features that the Concurrency Runtime uses, see Overview.

Wątki i pule wątkówThreads and Thread Pools

Centralny mechanizm współbieżności w interfejsie API systemu Windows jest wątkiem.The central concurrency mechanism in the Windows API is the thread. Zwykle Funkcja myFunction służy do tworzenia wątków.You typically use the CreateThread function to create threads. Chociaż wątki są stosunkowo łatwe do utworzenia i używania, system operacyjny przydziela znaczną ilość czasu i inne zasoby do zarządzania nimi.Although threads are relatively easy to create and use, the operating system allocates a significant amount of time and other resources to manage them. Ponadto, chociaż każdy wątek ma mieć taki sam czas wykonywania jak każdy inny wątek na tym samym poziomie priorytetu, skojarzone obciążenie wymaga utworzenia wystarczająco dużych zadań.Additionally, although each thread is guaranteed to receive the same execution time as any other thread at the same priority level, the associated overhead requires that you create sufficiently large tasks. W przypadku mniejszych lub bardziej szczegółowych zadań narzuty skojarzone z współbieżnością mogą wznieść korzyści wynikające z równoczesnego uruchamiania zadań.For smaller or more fine-grained tasks, the overhead that is associated with concurrency can outweigh the benefit of running the tasks in parallel.

Pule wątków są jednym ze sposobów zmniejszenia kosztów zarządzania wątkami.Thread pools are one way to reduce the cost of thread management. Pule wątków niestandardowych i implementacja puli wątków zapewniane przez interfejs API systemu Windows umożliwiają wydajną pracę w małych elementach roboczych.Custom thread pools and the thread pool implementation that is provided by the Windows API both enable small work items to efficiently run in parallel. Pula wątków systemu Windows przechowuje elementy robocze w kolejce First-In, First-Out (FIFO).The Windows thread pool maintains work items in a first-in, first-out (FIFO) queue. Każdy element roboczy jest uruchamiany w kolejności, w której został dodany do puli.Each work item is started in the order in which it was added to the pool.

Środowisko uruchomieniowe współbieżności implementuje algorytm kradzieży pracy w celu poszerzenia mechanizmu planowania FIFO.The Concurrency Runtime implements a work-stealing algorithm to extend the FIFO scheduling mechanism. Algorytm przenosi zadania, które nie zostały jeszcze uruchomione w wątkach, które są uruchamiane z elementów roboczych.The algorithm moves tasks that have not yet started to threads that run out of work items. Chociaż algorytm kradzieży pracy można zrównoważyć obciążenia, może to spowodować zmianę kolejności elementów roboczych.Although the work-stealing algorithm can balance workloads, it can also cause work items to be reordered. Ten proces zmiany kolejności może spowodować, że element roboczy zostanie uruchomiony w innej kolejności niż przesłany.This reordering process can cause a work item to start in a different order than it was submitted. Jest to przydatne w przypadku algorytmów cyklicznych, gdy istnieje lepsza szansa, że dane są współużytkowane przez nowsze zadania niż w starszych.This is useful with recursive algorithms, where there is a better chance that data is shared among newer tasks than among older ones. Wprowadzenie nowych elementów do uruchomienia oznacza mniejszą liczbę chybień w pamięci podręcznej i prawdopodobnie mniejszą liczbę błędów stron.Getting the new items to run first means fewer cache misses and possibly fewer page faults.

Z punktu widzenia systemu operacyjnego kradzieży pracy jest niesłuszne.From the perspective of the operating system, work stealing is unfair. Jednak w przypadku zastosowania przez aplikację algorytmu lub zadania w sposób równoległy, sprawiedliwa wartość w podzadaniach podrzędnych nie zawsze ma znaczenia.However, when an application implements an algorithm or task to run in parallel, fairness among the sub-tasks does not always matter. Co ma na celu szybkie zakończenie całego zadania.What does matter is how quickly the overall task finishes. W przypadku innych algorytmów moduł FIFO jest odpowiednią strategią planowania.For other algorithms, FIFO is the appropriate scheduling strategy.

Zachowanie w różnych systemach operacyjnychBehavior on Various Operating Systems

W systemach Windows XP i Windows Vista aplikacje używające środowisko uruchomieniowe współbieżności zachowują się podobnie, z tą różnicą, że wydajność sterty została ulepszona w systemie Windows Vista.On Windows XP and Windows Vista, applications that use the Concurrency Runtime behave similarly, except that heap performance is improved on Windows Vista.

W systemach Windows 7 i Windows Server 2008 R2 system operacyjny obsługuje współbieżność i skalowalność.In Windows 7 and Windows Server 2008 R2, the operating system further supports concurrency and scalability. Na przykład te systemy operacyjne obsługują komputery, które mają ponad 64 wątków sprzętowych.For example, these operating systems support computers that have more than 64 hardware threads. Istniejąca aplikacja, która korzysta z interfejsu API systemu Windows, musi zostać zmodyfikowana, aby można było korzystać z tych nowych funkcji.An existing application that uses the Windows API must be modified to take advantage of these new features. Jednak aplikacja, która używa środowisko uruchomieniowe współbieżności automatycznie korzysta z tych funkcji i nie wymaga modyfikacji.However, an application that uses the Concurrency Runtime automatically uses these features and does not require modifications.

Base. User-mode_schedulingbase.user-mode_scheduling

[Top][Top]

Porównywanie środowisko uruchomieniowe współbieżności ze OpenMPComparing the Concurrency Runtime to OpenMP

Środowisko uruchomieniowe współbieżności włącza różne modele programowania.The Concurrency Runtime enables a variety of programming models. Modele te mogą nakładać się lub uzupełniać modele innych bibliotek.These models may overlap or complement the models of other libraries. W tej sekcji porównano środowisko uruchomieniowe współbieżności ze OpenMP.This section compares the Concurrency Runtime to OpenMP.

Model programowania OpenMP jest definiowany przez otwarty standard i ma dobrze zdefiniowane powiązania z językami programowania Pascal i C/C++.The OpenMP programming model is defined by an open standard and has well-defined bindings to the Fortran and C/C++ programming languages. Wersje OpenMP 2,0 i 2,5 są odpowiednie dla równoległych algorytmów, które są iteracyjne; oznacza to, że wykonują iterację równoległą w odniesieniu do tablicy danych.OpenMP versions 2.0 and 2.5 are well-suited for parallel algorithms that are iterative; that is, they perform parallel iteration over an array of data. OpenMP jest najbardziej wydajny, gdy stopień równoległości jest wstępnie określony i jest zgodny z dostępnymi zasobami w systemie.OpenMP is most efficient when the degree of parallelism is pre-determined and matches the available resources on the system. Model OpenMP to szczególnie dobre dopasowanie w przypadku obliczeń o wysokiej wydajności, w przypadku których duże problemy obliczeniowe są dystrybuowane między zasobami przetwarzania jednego komputera.The OpenMP model is an especially good match for high-performance computing, where very large computational problems are distributed across the processing resources of a single computer. W tym scenariuszu środowisko sprzętowe jest znane, a deweloper może oczekiwać, że ma wyłączny dostęp do zasobów obliczeniowych, gdy algorytm jest wykonywany.In this scenario, the hardware environment is known and the developer can reasonably expect to have exclusive access to computing resources when the algorithm is executed.

Jednak inne, mniej ograniczone środowiska obliczeniowe mogą nie być dobrym odpowiednikiem OpenMP.However, other, less constrained computing environments may not be a good match for OpenMP. Na przykład problemy cykliczne (takie jak algorytm sortowania lub wyszukiwanie drzewa danych) są trudniejsze do zaimplementowania przy użyciu OpenMP.For example, recursive problems (such as the quicksort algorithm or searching a tree of data) are more difficult to implement by using OpenMP. Środowisko uruchomieniowe współbieżności uzupełnia możliwości technologii OpenMP przez udostępnienie biblioteki równoległych wzorców (PPL) i biblioteki agentów asynchronicznych.The Concurrency Runtime complements the capabilities of OpenMP by providing the Parallel Patterns Library (PPL) and the Asynchronous Agents Library. W przeciwieństwie do OpenMP, środowisko uruchomieniowe współbieżności zapewnia dynamiczny harmonogram, który dostosowuje się do dostępnych zasobów i dostosowuje stopień równoległości w miarę zmiany obciążeń.Unlike OpenMP, the Concurrency Runtime provides a dynamic scheduler that adapts to available resources and adjusts the degree of parallelism as workloads change.

Wiele funkcji w środowisko uruchomieniowe współbieżności można rozszerzyć.Many of the features in the Concurrency Runtime can be extended. Możesz również połączyć istniejące funkcje, aby utworzyć nowe.You can also combine existing features to compose new ones. Ponieważ OpenMP opiera się na dyrektywach kompilatora, nie można go łatwo rozszerzyć.Because OpenMP relies on compiler directives, it cannot be extended easily.

Aby uzyskać więcej informacji na temat porównuje środowisko uruchomieniowe współbieżności ze OpenMP i jak przeprowadzić migrację istniejącego kodu OpenMP do korzystania z środowisko uruchomieniowe współbieżności, zobacz Migrowanie z OpenMP do środowisko uruchomieniowe współbieżności.For more information about how the Concurrency Runtime compares to OpenMP and how to migrate existing OpenMP code to use the Concurrency Runtime, see Migrating from OpenMP to the Concurrency Runtime.

[Top][Top]

Zobacz teżSee also

Współbieżność środowiska wykonawczegoConcurrency Runtime
OmówienieOverview
Biblioteka równoległych wzorców (PLL)Parallel Patterns Library (PPL)
Biblioteki agentów asynchronicznychAsynchronous Agents Library
OpenMPOpenMP