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?
Réponses:
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.
la source
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.
la source
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 ditConcurrency means, essentially, that task A and task B both need to happen independently of each other
. Alors, quelle est la conclusion?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:
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:
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:
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:
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.
la source
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.
Pour plus de détails, lisez ce document de recherche Concepts de la programmation concurrente
la source
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.
la source
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.
la source
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.
la source
À 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.
la source