Extensions parallèles - Parallel Extensions

Image

Parallel Extensions était le nom de développement d'une bibliothèque de simultanéité gérée développée par une collaboration entre Microsoft Research et l' équipe CLR de Microsoft . La bibliothèque a été publiée dans la version 4.0 du .NET Framework . Il est composé de deux parties : Parallel LINQ (PLINQ) et Task Parallel Library (TPL). Il se compose également d'un ensemble de structures de données de coordination (CDS) – ensembles de structures de données utilisées pour synchroniser et coordonner l'exécution de tâches concurrentes.

LINQ parallèle

PLINQ , ou Parallel LINQ , parallélisant l'exécution de requêtes sur des objets (LINQ to Objects) et des données XML (LINQ to XML). PLINQ est destiné à exposer le parallélisme des données à l'aide de requêtes. Tout calcul sur des objets qui a été implémenté en tant que requêtes peut être parallélisé par PLINQ. Cependant, les objets doivent implémenter l' IParallelEnumerableinterface, qui est définie par PLINQ lui-même. En interne, il utilise TPL pour l'exécution.

Bibliothèque parallèle de tâches

La bibliothèque parallèle de tâches ( TPL ) est le composant de parallélisme de tâches des extensions parallèles à .NET. Il expose des constructions parallèles telles que parallel Foret ForEachloops, en utilisant des appels de méthode et des délégués réguliers , ainsi les constructions peuvent être utilisées à partir de n'importe quel langage CLI . Le travail de génération et de terminaison des threads , ainsi que la mise à l'échelle du nombre de threads en fonction du nombre de processeurs disponibles, est effectué par la bibliothèque elle-même, à l'aide d'un planificateur de vol de travail .

TPL inclut également d'autres constructions telles que Task et Future . Une tâche est une action qui peut être exécutée indépendamment du reste du programme. En ce sens, il est sémantiquement équivalent à un thread, sauf qu'il s'agit d'un objet plus léger et sans la surcharge de création d'un thread du système d'exploitation. Les tâches sont mises en file d'attente par un objet du gestionnaire de tâches et sont planifiées pour s'exécuter sur plusieurs threads du système d'exploitation dans un pool de threads lorsque leur tour arrive.

Le futur est une tâche qui renvoie un résultat. Le résultat est calculé dans un thread d'arrière-plan encapsulé par l' objet Future et le résultat est mis en mémoire tampon jusqu'à ce qu'il soit récupéré. Si une tentative est faite pour récupérer le résultat avant qu'il n'ait été calculé, le thread demandeur se bloquera jusqu'à ce que le résultat soit disponible.

L'autre construction de TPL est la classe Parallel . TPL fournit une forme de base de parallélisme structuré via trois méthodes statiques dans la classe Parallel :

Parallèle.Invocation
Exécute un tableau de délégués Action en parallèle, puis attend qu'ils se terminent
Parallèle.Pour
Équivalent parallèle d'une boucle for C#
Parallèle.PourChaque
Équivalent parallèle d'une boucle foreach C#

Architecture

Le concept principal des extensions parallèles à .NET est un Task, qui est une petite unité de code, généralement représentée comme une fonction lambda , qui peut être exécutée indépendamment. PLINQ et l'API TPL fournissent des méthodes pour créer les tâches - PLINQ divise une requête en tâches plus petites, et les méthodes Parallel.For, Parallel.ForEachet Parallel.Invokedivisent une boucle en tâches.

PFX comprend un Task Managerobjet qui planifie l'exécution des tâches. Un gestionnaire de tâches contient une file d' attente globale de tâches, qui sont ensuite exécutées. Il encapsule également plusieurs threads sur lesquels les tâches sont exécutées. Par défaut, autant de threads qu'il y a de processeurs (ou cœurs de processeur) sur le système sont créés, bien que ce nombre puisse être modifié manuellement. Chaque thread est associé à une file d'attente de tâches spécifique au thread. Lorsqu'il est inactif, chaque thread récupère un lot de tâches et les place dans sa file d'attente locale, où ils sont ensuite exécutés, un par un. Si la file d'attente globale est vide, un thread cherchera des Tâches dans les files d'attente de ses pairs, et prendra les Tâches qui ont été dans la file le plus longtemps ( vol de tâche ). Lors de l'exécution, les Tâches seront exécutées indépendamment, avec le changement d'état d'une Tâche indépendant des autres. Par conséquent, s'ils utilisent une ressource partagée, ils doivent toujours être synchronisés manuellement à l'aide de verrous ou d'autres constructions.

Voir également

Les références

Liens externes