Porovnání modelu Concurrency Runtime s jinými modely souběžného zpracování
Tento dokument popisuje rozdíly mezi funkcemi a programovacími modely modulu Concurrency Runtime a dalšími technologiemi. Když pochopíte, jak výhody modulu Concurrency Runtime porovnávají s výhodami jiných programovacích modelů, můžete vybrat technologii, která nejlépe vyhovuje požadavkům vašich aplikací.
Pokud aktuálně používáte jiný programovací model, například fond vláken Windows nebo OpenMP, existují situace, kdy může být vhodné migrovat do modulu Concurrency Runtime. Například téma Migrace z OpenMP na Concurrency Runtime popisuje, kdy může být vhodné migrovat z OpenMP na Concurrency Runtime. Pokud jste ale spokojení s výkonem aplikace a aktuální podporou ladění, migrace se nevyžaduje.
Funkce a výhody produktivity modulu Concurrency Runtime můžete použít k doplnění stávající aplikace, která používá jiný model souběžnosti. Concurrency Runtime nemůže zaručit vyrovnávání zatížení, když více plánovačů úloh soupeří o stejné výpočetní prostředky. Pokud se ale úlohy nepřekrývají, je tento účinek minimální.
Oddíly
Porovnání preemptivního plánování s plánováním spolupráce
Preemptivní model a modely plánování spolupráce jsou dvěma běžnými způsoby, jak umožnit více úloh sdílení výpočetních prostředků, například procesorů nebo hardwarových vláken.
Preemptive and Cooperative Scheduling
Předběžné plánování je mechanismus založený na prioritách kruhového dotazování, který poskytuje každému úkolu výhradní přístup k výpočetnímu zdroji za dané časové období a potom se přepne na jiný úkol. Plánování preemptivních operací je běžné v operačních systémech multitaskingu, jako je Windows. Plánování spolupráce je mechanismus, který každému úkolu poskytuje výhradní přístup k výpočetnímu zdroji, dokud se úkol nedokončí nebo dokud úkol nezískne jeho přístup k danému zdroji. Modul Concurrency Runtime používá spolu s preemptivním plánovačem operačního systému kooperativní plánování k dosažení maximálního využití prostředků zpracování.
Rozdíly mezi preemptivními a kooperačními plánovači
Preemptivní plánovače se snaží poskytnout více vláken rovný přístup k výpočetním prostředkům, aby bylo zajištěno, že každé vlákno postupuje. Na počítačích s mnoha výpočetními prostředky je zajištění spravedlivého přístupu méně problematické; zajištění efektivního využití prostředků je však problematické.
Plánovač preemptivního režimu jádra vyžaduje, aby kód aplikace spoléhal na operační systém, aby se rozhodl při plánování. Plánovač spolupráce v uživatelském režimu naopak umožňuje kódu aplikace provádět vlastní rozhodnutí o plánování. Vzhledem k tomu, že plánování spolupráce umožňuje, aby aplikace provedla mnoho rozhodnutí o plánování, snižuje většinu režijních nákladů spojených se synchronizací v režimu jádra. Plánovač spolupráce obvykle odmažuje rozhodnutí o plánování jádra operačního systému, pokud nemá žádnou jinou práci na plánování. Plánovač družstevního plánovače se také vyhýbá plánovači operačního systému, pokud je k dispozici blokující operace, která se předá jádru, ale tato operace se nesdělí plánovači v uživatelském režimu.
Kooperativní plánování a efektivita
Pro preemptivní plánovač je všechna práce, která má stejnou úroveň priority, stejná. Preemptivní plánovač obvykle plánuje vlákna v pořadí, v jakém jsou vytvořeny. Preemptivní plánovač navíc dává každému vláknu časový řez způsobem kruhového dotazování na základě priority vlákna. I když tento mechanismus poskytuje nestrannost (každé vlákno postupuje dopředu), má určité náklady na efektivitu. Mnoho algoritmů náročných na výpočty například nevyžaduje nestrannost. Místo toho je důležité, aby související úkoly byly dokončeny nejméně v celkovém čase. Plánování spolupráce umožňuje aplikaci efektivněji plánovat práci. Představte si například aplikaci, která má mnoho vláken. Plánování vláken, která nesdílí prostředky ke souběžnému spuštění, mohou snížit režijní náklady na synchronizaci a zvýšit tak efektivitu. Dalším efektivním způsobem plánování úkolů je spuštění kanálů úloh (kde každý úkol funguje na výstupu předchozího) na stejném procesoru, aby vstup každé fáze kanálu už byl načten do mezipaměti paměti.
Použití preemptivního a kooperativního plánování společně
Plánování spolupráce nevyřeší všechny problémy s plánováním. Například úkoly, které nejsou poměrně výnosné pro jiné úkoly, můžou využívat všechny dostupné výpočetní prostředky a bránit ostatním úkolům v provádění pokroku. Modul Concurrency Runtime využívá výhody efektivity plánování spolupráce k doplnění záruk nestrannosti předběžného plánování. Modul Concurrency Runtime ve výchozím nastavení poskytuje plánovač spolupráce, který používá algoritmus krádeže práce k efektivní distribuci práce mezi výpočetní prostředky. Plánovač Concurrency Runtime ale také spoléhá na preemptivní plánovač operačního systému k spravedlivé distribuci prostředků mezi aplikacemi. Ve svých aplikacích můžete také vytvořit vlastní plánovače a zásady plánovače, které zajistí jemně odstupňovanou kontrolu nad prováděním vláken.
[Nahoře]
Porovnání modulu Concurrency Runtime s rozhraním API systému Windows
Programovací rozhraní aplikace Microsoft Windows, které se obvykle označuje jako rozhraní API systému Windows (a dříve Win32), poskytuje programovací model, který umožňuje souběžnost ve vašich aplikacích. Modul Concurrency Runtime vychází z rozhraní API systému Windows, aby poskytoval další programovací modely, které nejsou dostupné ze základního operačního systému.
Modul Concurrency Runtime vychází z modelu vlákna rozhraní API systému Windows, který provádí paralelní práci. Používá také správu paměti rozhraní API systému Windows a mechanismy místního úložiště vláken. V systémech Windows 7 a Windows Server 2008 R2 používá podporu rozhraní API systému Windows pro uživatelsky čitelná vlákna a počítače s více než 64 hardwarovými vlákny. Modul Concurrency Runtime rozšiřuje model rozhraní API systému Windows tím, že poskytuje plánovač úloh spolupráce a algoritmus krádeže práce, aby maximalizoval využití výpočetních prostředků a umožnil několik souběžných instancí plánovače.
Programovací jazyky
Rozhraní API systému Windows používá programovací jazyk C k vystavení programovacího modelu. Concurrency Runtime poskytuje programovací rozhraní C++, které využívá nejnovější funkce v jazyce C++. Například funkce lambda poskytují stručný mechanismus bezpečný pro definování paralelních pracovních funkcí. Další informace o nejnovějších funkcích jazyka C++, které používá modul Concurrency Runtime, najdete v tématu Přehled.
Vlákna a fondy vláken
Hlavním mechanismem souběžnosti v rozhraní API systému Windows je vlákno. K vytváření vláken obvykle používáte funkci CreateThread . I když jsou vlákna poměrně snadná k vytvoření a použití, operační systém přiděluje značné množství času a dalších prostředků pro jejich správu. I když je zaručeno, že každé vlákno obdrží stejnou dobu provádění jako jakékoli jiné vlákno na stejné úrovni priority, související režie vyžaduje, abyste vytvořili dostatečně velké úlohy. U menších nebo více jemně odstupňovaných úloh může režie spojená s souběžností převažovat nad výhodou paralelního spouštění úkolů.
Fondy vláken představují jeden ze způsobů, jak snížit náklady na správu vláken. Vlastní fondy vláken a implementace fondu vláken, kterou poskytuje rozhraní API systému Windows, umožňují efektivní paralelní spouštění malých pracovních položek. Fond vláken Windows udržuje pracovní položky ve frontě FIFO (first-in). Každá pracovní položka se spustí v pořadí, ve kterém byla přidána do fondu.
Concurrency Runtime implementuje algoritmus krádeže práce pro rozšíření mechanismu plánování FIFO. Algoritmus přesune úlohy, které ještě nezačal do vláken, na která dojdou pracovní položky. I když algoritmus krádeže práce může vyrovnávat úlohy, může také způsobit, že pracovní položky se změní jejich pořadí. Tento proces změny pořadí může způsobit, že se pracovní položka spustí v jiném pořadí, než bylo odesláno. To je užitečné u rekurzivních algoritmů, kde je lepší pravděpodobnost, že se data sdílejí mezi novějšími úkoly než mezi staršími. První spuštění nových položek znamená méně chyb v mezipaměti a pravděpodobně méně chyb stránky.
Z pohledu operačního systému je krádež práce nespravedlivá. Pokud ale aplikace implementuje algoritmus nebo úlohu, která se má spustit paralelně, ne vždy nezáleží na spravedlnosti mezi dílčími úlohami. Záleží na tom, jak rychle se celkový úkol dokončí. U jiných algoritmů je FIFO vhodná strategie plánování.
Chování v různých operačních systémech
V systémech Windows XP a Windows Vista se aplikace používající Concurrency Runtime chovají podobně, s tím rozdílem, že výkon haldy je vylepšen v systému Windows Vista.
V systémech Windows 7 a Windows Server 2008 R2 operační systém dále podporuje souběžnost a škálovatelnost. Tyto operační systémy například podporují počítače, které mají více než 64 hardwarových vláken. Stávající aplikace, která používá rozhraní API systému Windows, musí být upravena, aby využívala tyto nové funkce. Aplikace, která používá Concurrency Runtime, ale tyto funkce automaticky používá a nevyžaduje úpravy.
[Nahoře]
Porovnání modulu Concurrency Runtime s OpenMP
Concurrency Runtime umožňuje různé programovací modely. Tyto modely se můžou překrývat nebo doplňují modely jiných knihoven. Tato část porovnává modul Concurrency Runtime s OpenMP.
Programovací model OpenMP je definován otevřeným standardem a má dobře definované vazby k programovacím jazykům Fortran a C/C++. OpenMP verze 2.0 a 2.5 jsou vhodné pro paralelní algoritmy, které jsou iterativní; to znamená, že provádějí paralelní iteraci nad polem dat. OpenMP je nejúčinnější, když je předem určen stupeň paralelismu a odpovídá dostupným prostředkům v systému. Model OpenMP je obzvláště vhodný pro vysokovýkonné výpočetní prostředí, kde se velmi velké výpočetní problémy distribuují napříč výpočetními prostředky jednoho počítače. V tomto scénáři je hardwarové prostředí známé a vývojář může přiměřeně očekávat výhradní přístup k výpočetním prostředkům při spuštění algoritmu.
Jiná, méně omezená výpočetní prostředí ale nemusí být pro OpenMP vhodná. Například rekurzivní problémy (například algoritmus quicksort nebo vyhledávání stromu dat) jsou obtížnější implementovat pomocí OpenMP. Concurrency Runtime doplňuje funkce OpenMP tím, že poskytuje knihovnu PPL (Parallel Patterns Library) a asynchronní knihovnu agentů. Na rozdíl od OpenMP poskytuje Concurrency Runtime dynamický plánovač, který se přizpůsobuje dostupným prostředkům a upravuje stupeň paralelismu při změně úloh.
Mnoho funkcí v modulu Concurrency Runtime je možné rozšířit. Můžete také zkombinovat existující funkce a vytvářet nové funkce. Vzhledem k tomu, že OpenMP spoléhá na direktivy kompilátoru, nelze jej snadno rozšířit.
Další informace o porovnání modulu Concurrency Runtime s OpenMP a o tom, jak migrovat existující kód OpenMP pro použití modulu Concurrency Runtime, najdete v tématu Migrace z OpenMP na Concurrency Runtime.
[Nahoře]
Viz také
Concurrency Runtime
Přehled
Knihovna PPL (Parallel Patterns Library)
Knihovna asynchronních agentů
OpenMP