La différence entre une exécution «simultanée» et «parallèle»?

107

Quelle est la différence entre les termes exécution simultanée et parallèle ? Je n'ai jamais été capable de saisir cette distinction.

La balise définit la simultanéité comme une manière d’exécuter deux processus simultanément, mais j’imaginais que le parallélisme était exactement la même chose, c’est-à-dire: des threads ou des processus distincts pouvant éventuellement être exécutés sur des processeurs distincts.

De même, si nous considérons quelque chose comme une entrée / sortie asynchrone, avons-nous affaire à la simultanéité ou au parallélisme?

blz
la source
27
En un mot - simultané: de nombreuses opérations différentes se produisent en même temps. parallèle: la même opération brisée en petits morceaux se produisant à la fois.
Oded
3
@Oded, je comprends ce que les mots veulent dire, mais j'ai du mal à comprendre les implications. Avez-vous un exemple concret?
blz
7
@Oded, je ne suis pas vraiment d'accord avec vous, nulle part dans leurs définitions (générales ou appliquées à la programmation) les notions de "concurrent" et de "parallèle" ne mentionnent rien quant au nombre ou à la "taille" des opérations.
Shivan Dragon
2
@Oded quand vous avez dit "petits morceaux".
Avner Shahar-Kashtan
2
@Oded: Oui, mais cela semble être à l'origine du malentendu entre vous et ShivanDragon.
Avner Shahar-Kashtan

Réponses:

97

La simultanéité et le parallélisme sont deux concepts liés mais distincts.

La simultanéité signifie essentiellement que la tâche A et la tâche B doivent toutes deux être exécutées indépendamment l'une de l'autre, et que A commence à s'exécuter, puis que B démarre avant que A ne soit terminé.

Il existe différentes manières de réaliser la concurrence. L'un d'entre eux est le parallélisme - avoir plusieurs processeurs travaillant sur les différentes tâches en même temps. Mais ce n'est pas le seul moyen. Vous pouvez également basculer d’une tâche à l’ autre , qui fonctionne comme suit: la tâche A fonctionne jusqu’à un certain point, puis la CPU qui s’y travaille s’arrête et passe à la tâche B, la travaille pendant un moment, puis revient à la tâche A. Si les tranches de temps sont suffisamment petites, il peut sembler à l'utilisateur que les deux opérations sont exécutées en parallèle, même si elles sont en cours de traitement en série par un processeur multitâche.

Maçon Wheeler
la source
4
Le cas B est comment async IO fonctionne, non?
blz
6
@blz: C'est vrai. C'est aussi comment fonctionne le multitâche préemptif. La principale différence est que sur les E / S asynchrones, le programme décide de renoncer à son temps et de dire au processeur de traiter autre chose, tandis que dans le multitâche préemptif, si le thread en cours n’abandonne pas volontairement le processeur au bout de suffisamment de temps, le système d’exploitation prévaut. il.
Mason Wheeler
1
La meilleure explication haut la main
Konrad
@MasonWheeler: Si nous n'avons qu'un seul processeur, alors nous ne pouvons avoir que la concurrence, pas de parallélisme. Droite? Le parallélisme peut être réalisé par plus d'un processeur. Droite? Et s’il est correct et que nous n’avons qu’un seul processeur, les flux de Java 8 ne sont d'aucune utilité.
Anish Mittal le
1
Droit sur les premiers points. Dans le dernier cas, le parallélisme est-il le seul avantage des Streams? Je ne suis pas un développeur Java, mais j'ai l'impression que les Java Streams sont à peu près équivalents à LINQ, ce qui présente de réels avantages en termes d'expressivité et de facilité de développement.
Mason Wheeler
37

Les deux concepts sont liés, mais différents.

La simultanéité signifie que deux ou plusieurs calculs ont lieu dans le même laps de temps et qu’il existe généralement une sorte de dépendance entre eux.

Le parallélisme signifie que deux ou plusieurs calculs sont effectués simultanément.

En termes clairs, la concurrence d'accès décrit un problème (deux choses doivent se produire ensemble), alors que le parallélisme décrit une solution (deux cœurs de processeur sont utilisés pour exécuter deux choses simultanément).

Le parallélisme est un moyen d'implémenter la concurrence, mais ce n'est pas le seul. Une autre solution populaire est le traitement entrelacé (ou coroutines): divisez les deux tâches en étapes atomiques et basculez entre les deux.

L'exemple le plus connu de concurrence simultanée non parallèle est le fonctionnement de JavaScript: il n'y a qu'un seul thread et tout rappel asynchrone doit attendre la fin de l'exécution du bloc de code précédent. Il est important de le savoir, car cela garantit que toute fonction que vous écrivez est atomique - aucun rappel ne peut l’interrompre jusqu’à ce qu’elle revienne. Mais cela signifie également que les "boucles occupées" ne fonctionneront pas - vous ne pouvez pas définir de délai d'expiration, puis de boucle jusqu'à son déclenchement, car celle-ci empêchera l'exécution du rappel de délai d'expiration.

tdammers
la source
8
Vous dites que Concurrency means that two or more calculations happen within the same time frame, and there is usually some sort of dependency between them.Mais l'utilisateur qui a écrit cette réponse acceptée dit Concurrency means, essentially, that task A and task B both need to happen independently of each other. Alors, quelle est la conclusion?
nbro
Pourriez-vous expliquer pourquoi le modèle de JavaScript est concourant? Selon votre définition de la simultanéité, deux calculs ou plus doivent avoir lieu dans le même laps de temps. Mais en JavaScript, les calculs sont ordonnés séquentiellement en utilisant une seule file d'attente.
Damluar
4
Par "dans le même laps de temps", je ne veux pas nécessairement dire "simultanément", mais simplement que les délais globaux au cours desquels ils se produisent se chevauchent. Ceci peut être réalisé en parallèle (par exemple, deux cœurs de processeur exécutant chacun une tâche), mais également en sérialisant complètement l'exécution (effectuez la tâche 1 en premier, mémorisez le résultat, puis exécutez la tâche 2, puis indiquez les deux). , ou en coupant les morceaux et en les imbriquant. Ce dernier est ce que JS fait.
tdammers
9

Je pense que cette réponse est plus correcte que les réponses existantes et leur édition en aurait changé l’essence. J'ai essayé de créer des liens vers diverses sources ou pages wikipedia afin que d'autres puissent affirmer leur exactitude.


Concurrence: propriété d'un système permettant à des unités du programme, de l'algorithme ou du problème d'être exécutées dans le désordre ou dans un ordre partiel sans affecter le résultat final 1 2 .

Un exemple simple est celui des ajouts consécutifs:

0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45

En raison de la propriété d'addition commutative, l'ordre de ceux-ci peut être réorganisé sans affecter la correction; la disposition suivante donnera la même réponse:

(1 + 9) + (2 + 8) + (3 + 7) + (4 + 6) + 5 + 0 = 45

Ici, j'ai regroupé les nombres en paires qui totalisent 10, ce qui me permet d’arriver plus facilement à la bonne réponse dans ma tête.

Calcul parallèle: type de calcul dans lequel de nombreux calculs ou l'exécution de processus sont effectués simultanément 3 4 . Ainsi, le calcul parallèle exploite la propriété de simultanéité pour exécuter simultanément plusieurs unités du programme, de l'algorithme ou du problème.

En reprenant l'exemple des additions consécutives, nous pouvons exécuter différentes parties de la somme en parallèle:

Execution unit 1:  0 + 1 + 2 + 3 + 4 = 10
Execution unit 2:  5 + 6 + 7 + 8 + 9 = 35

Puis, à la fin, nous additionnons les résultats de chaque travailleur 10 + 35 = 45.

Encore une fois, ce parallélisme n’était possible que parce que des additions consécutives ont la propriété de simultanéité.

Cependant, la concurrence peut être exploitée par plus que le simple parallélisme. Envisagez la préemption sur un système monocœur: sur une période donnée, le système peut progresser sur plusieurs processus en cours d'exécution sans qu'aucun d'entre eux ne se termine. En effet, votre exemple d’E / S asynchrones est un exemple courant de concurrence ne nécessitant pas de parallélisme.


Confusion

Ce qui précède est relativement simple. Je soupçonne que les gens se perdent parce que les définitions du dictionnaire ne correspondent pas nécessairement à ce qui a été décrit précédemment:

  • Concurrent: survenant ou existant simultanément ou côte à côte 5 .
  • Accès simultané: le fait que deux événements ou plus ou plusieurs événements ou circonstances se produisent ou existent en même temps De la recherche sur Google: "define: accès simultané" .

Le dictionnaire définit la "simultanéité" comme une réalité, alors que la définition dans le langage informatique est une propriété latente d'un programme, d'une propriété ou d'un système. Bien que liées, ces choses ne sont pas les mêmes.


Recommandations personnelles

Je recommande d'utiliser le terme "parallèle" lorsque l'exécution simultanée est assurée ou attendue, et d'utiliser le terme "simultané" lorsqu'il est incertain ou sans importance que l'exécution simultanée soit utilisée.

Je décrirais donc la simulation d’un moteur à réaction sur plusieurs cœurs en parallèle.

Je décrirais les Makefiles comme un exemple de concurrence. Les Makefiles indiquent les dépendances de chaque cible. Lorsque les cibles dépendent d'autres cibles, cela crée un classement partiel. Lorsque les relations et les recettes sont définies de manière complète et correcte, ceci établit la propriété de concurrence: il existe un ordre partiel tel que l’ordre de certaines tâches puisse être réorganisé sans affecter le résultat. Encore une fois, cette concurrence peut être exploitée pour créer plusieurs règles simultanément mais la concurrence est une propriété du Makefile, que le parallélisme soit utilisé ou non.

Levi Morrison
la source
6

L'exécution simultanée est la forme généralisée d'exécution parallèle. Par exemple, un programme parallèle peut également être appelé concurrent mais reverse n'est pas vrai.

  1. L'exécution simultanée est possible sur un seul processeur (plusieurs threads, gérés par le planificateur)
  2. L'exécution en parallèle n'est pas possible sur un seul processeur mais sur plusieurs processeurs. (Un processus par processeur)

Pour plus de détails, lisez ce document de recherche Concepts de la programmation concurrente


la source
1
"L'exécution en parallèle n'est pas possible sur un seul processeur, mais sur plusieurs processeurs", à l'exception bien entendu des chemins d'exécution parallèles au sein d'un processeur, par exemple des systèmes exploitant des architectures de niveau d'instruction (alias "superscalar", par exemple des processeurs Intel depuis Pentium, ARM Cortex et la plupart des autres processeurs haut de gamme) et Single Instruction Multiple Data, également appelés architectures de données parallèles (par exemple, MMX / SSE / etc). Sans parler des arrangements exotiques tels que les processeurs de flux de données, etc.
Jules
3

Le traitement en parallèle est un sous-ensemble du traitement simultané.

Le traitement simultané décrit deux tâches se produisant de manière asynchrone, ce qui signifie que l'ordre dans lequel les tâches sont exécutées n'est pas prédéterminé. Deux threads peuvent s'exécuter simultanément sur le même cœur de processeur en entrelaçant des instructions exécutables. Par exemple, le thread 1 s'exécute pendant 10 ms, le thread 2 s'exécute pendant 10 ms, etc.

Le traitement en parallèle est un type de traitement simultané dans lequel plusieurs ensembles d'instructions sont exécutés simultanément. Il peut s'agir de plusieurs systèmes travaillant sur un problème commun, comme dans l'informatique distribuée, ou de plusieurs cœurs sur le même système.

ConditionRacer
la source
0

la déclaration de tdammer est proche, le reste est tout sauf le point. Il dit:

"En clair, la simultanéité décrit un problème (deux choses doivent se produire ensemble), alors que le parallélisme décrit une solution (deux cœurs de processeur sont utilisés pour exécuter deux choses simultanément"

Analysons simplement les mots.

Actuel signifie qu’il se passe maintenant, actuel, pertinent en ce moment. Con signifie contre, contre, ne pas aligner avec.

Par parallèle, on entend dans le même sens sans se croiser, sans se gêner.

Donc, la simultanéité implique la compétition pour la même ressource. Le parallélisme ne fait pas. Les processus parallèles utilisent peut-être la même ressource mais ce n'est pas considéré comme un problème, ce n'est pas un problème. Avec la concurrence, c'est un problème à traiter.

Martin Maat
la source
"Actuel signifie qu’il se passe maintenant, actuel, pertinent en ce moment. Con veut dire contre, contrer, ne pas s’aligner sur." - citation requise. Je doute fortement de ces deux déclarations. Bien que "current" puisse avoir le sens mentionné ici en anglais, ce n’est pas le sens du mot "concurrent"
Hulk
1
Je pense que la traduction de concurrent du latin est "fonctionner ensemble". Le préfixe « con » signifie souvent ensemble , comme conséquence de complot (pour respirer ensemble) (ensemble des résultats ou suivants) conclure (rapprochés) etc. Il est une facette ennuyeux du langage que quelque chose peut avoir des sens opposés, la sanction est mon exemple favori .
@no comprende Dans ce cas (courant), le sens de la fusion semble être le meilleur ajustement. Puisqu'il n'y a pas de pro-courant ... En néerlandais, concurrent est un nom qui signifie concurrent. Courant est commun, bouge tout autour de vous. C'est aussi un journal. Quelque chose qui est actif maintenant. "Rekening courant" est un compte courant. Je pense que la simultanéité implique un conflit (!). Un combat pour la même ressource. Courir dans le même espace. Peut-être à cause du sens néerlandais (concurrent).
Martin Maat
Qu'est-ce que Dijkstra dirait, je me le demande?
-1

De toute évidence, les termes sont utilisés différemment selon les cultures.

Ma compréhension est la suivante:

Le parallélisme est un moyen d'accélérer le traitement. Que vous fassiez la multiplication de matrice sur un seul cœur, sur plusieurs cœurs ou même dans le GPU, le résultat est le même (ou bien votre programme est en panne). Cela n'ajoute pas de nouvelles fonctionnalités à certains programmes, mais simplement de la vitesse.

Tandis que la simultanéité concerne des choses que vous ne pouvez pas faire de manière séquentielle. Par exemple, servir 3 pages Web différentes en même temps à 3 clients, en attendant la demande suivante. (Bien que vous puissiez simuler cela dans une certaine mesure par l'entrelacement, comme ce fut le cas à l'époque plus âgée.) Notez que le comportement des programmes concurrents est non déterministe. Par exemple, il est difficile de savoir lequel des 3 clients sera complètement servi en premier. Vous pouvez exécuter de nombreux tests et obtenir un résultat différent chaque fois que la demande est terminée. Le système d'exécution devrait garantir que a) tous les clients seront servis et b) dans un délai raisonnable.

D'habitude, le cheval de travail d'un calcul parallèle ne se préoccupe pas du parallélisme et ne s'en soucie pas davantage. Alors que les tâches simultanées utilisent souvent explicitement des communications entre processus ou entre threads, telles que le blocage de files d'attente, la synchronisation et les mécanismes de verrouillage.

Ingo
la source
-1

À mon avis, du point de vue de la programmation d'applications, il n'y a pas de différence entre ces deux concepts et avoir deux mots est source de confusion pour la confusion. Je pense que l'entrelacement de threads a été créé pour simuler le traitement multicœur à une époque où le multicœur n'était pas une possibilité. Pourquoi avons-nous un mot pour cet état d'esprit dépassé?

Mason Wheeler et Penguin ont donné la même réponse. Un cœur avec commutation de tâches et / ou multicœur est simultané, strictement multicœur = parallèle.

Mon opinion est que ces deux termes devraient être fusionnés en un seul et je fais un effort pour éviter de dire "simultané". Je suppose qu'au niveau de la programmation du système d'exploitation, la distinction est importante, mais du point de vue du programmeur d'application, cela n'a pas beaucoup d'importance. J'ai écrit mapReduce, Spark, MPI, cuda, openCL et c ++ multithread et je n'ai jamais eu à m'arrêter pour penser si le travail s'exécute avec des threads entrelacés ou avec plusieurs cœurs.

Par exemple, lorsque j'écris en c ++ multithread, je ne sais pas toujours combien de cœurs je vais obtenir, bien qu'il existe des moyens de demander le nombre de cœurs que vous obtenez, comme décrit ici: https://stackoverflow.com/questions/2166425/ comment structurer une application pour utiliser un processeur multi-cœur . Dans spark, je ne fais que cartographier et réduire les opérations et je ne sais pas du tout comment jvm les gère au niveau matériel. Je pense que sur les GPUchaque thread est assigné à son propre processeur simple, mais je synchronise toujours mes threads chaque fois qu'un problème peut survenir. Avec MPI, la communication entre les machines est spécifiée explicitement, mais nous pourrions intercaler les fonctions s'exécutant sur plusieurs machines sur un même cœur et combiner les résultats via une fonction à un seul thread appropriée. Et que se passe-t-il si nous utilisons MPI pour coordonner un ensemble de machines à cœur unique, chacune avec multithreading? Quelle différence cela fait? Je dirais aucun. Appelez tout cela "parallèle" et faites-en.

Julian Cienfuegos
la source
2
La distinction est toujours d'actualité aujourd'hui. Vous ne pouvez avoir un parallélisme que jusqu’au nombre de cœurs de processeur dont dispose votre matériel. Cependant, de nombreux programmes ont des centaines de calculs simultanés exécutés en même temps, bien au-delà du nombre de cœurs du matériel. Ne pas comprendre cette distinction pourrait amener les programmeurs à ne pas comprendre pourquoi leurs programmes parallélisés s'exécutent plus lentement que leur version à thread unique (ou un petit nombre de threads).
Lie Ryan