Quelle est la différence entre les termes concurrent et parallèle exécution? Je n'ai jamais vraiment pu saisir la distinction.
La balise définit la concurrence comme une manière d'exécuter deux processus simultanément, mais je pensais que le parallélisme était exactement la même chose, c'est-à-dire: des threads ou des processus distincts qui peuvent potentiellement être exécutés sur des processeurs distincts.
De plus, si nous considérons quelque chose comme les E/S asynchrones, avons-nous affaire à la concurrence ou au parallélisme?
La concurrence 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 se produire indépendamment l'une de l'autre, et A commence à s'exécuter, puis B démarre avant que A ne soit terminé.
Il existe différentes façons d'accomplir la concurrence. L'un d'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. Un autre est par changement de tâche qui fonctionne comme ceci: la tâche A fonctionne jusqu'à un certain point, puis le processeur qui y travaille s'arrête et bascule sur la tâche B, y travaille pendant un certain temps, puis revient à la tâche A. Si les tranches de temps sont suffisamment petites, il peut sembler à l'utilisateur que les deux choses sont exécutées en parallèle, même si elles sont en fait traitées en série par un processeur multitâche.
Les deux concepts sont liés, mais différents.
Concurrence signifie que deux calculs ou plus se produisent dans le même laps de temps, et il y a généralement une sorte de dépendance entre eux.
Parallélisme signifie que deux calculs ou plus se produisent simultanément.
En termes audacieux, la concurrence décrit un problème (deux choses doivent se produire ensemble), tandis 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 une façon d'implémenter la concurrence, mais ce n'est pas la seule. Une autre solution populaire est le traitement entrelacé (al.k.a. coroutines): divisez les deux tâches en étapes atomiques et basculez entre les deux.
De loin, l'exemple le plus connu de concurrence non parallèle est le fonctionnement de JavaScript: il n'y a qu'un seul thread et tout rappel asynchrone doit attendre jusqu'à ce que le morceau de code précédent ait fini de s'exécuter. C'est important à 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 un délai d'attente, puis boucler jusqu'à ce qu'il se déclenche, car la boucle empêchera le rappel de délai d'attente de s'exécuter.
Je crois que cette réponse est plus correcte que les réponses existantes et les modifier aurait changé leur essence. J'ai essayé de créer un lien vers diverses sources ou pages wikipedia afin que d'autres puissent affirmer l'exactitude.
Concurrence: la propriété d'un système qui permet aux 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 12.
Un exemple simple de ceci est les ajouts consécutifs:
0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45
En raison de la propriété commutative d'addition, l'ordre de ceux-ci peut être réorganisé sans affecter l'exactitude; l'arrangement suivant 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 totaliseront 10, ce qui me permet plus facilement d'arriver à la bonne réponse dans ma tête.
Calcul parallèle: un type de calcul dans lequel de nombreux calculs ou l'exécution de processus sont effectués simultanément 4. Ainsi, le calcul parallèle exploite la propriété de la concurrence pour exécuter simultanément plusieurs unités du programme, de l'algorithme ou du problème.
En continuant avec l'exemple des ajouts consécutifs, 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
Ensuite, à la fin, nous additionnons les résultats de chaque travailleur pour obtenir 10 + 35 = 45
.
Encore une fois, ce parallélisme n'était possible que parce que des ajouts consécutifs ont la propriété de la simultanéité.
Cependant, la concurrence peut être exploitée par plus que du parallélisme. Considérez préemption sur un système monocœur: sur une période de temps, 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 simultanéité qui ne nécessite pas de parallélisme.
Confusion
Ce qui précède est relativement simple. Je soupçonne que les gens sont confus parce que les définitions du dictionnaire ne correspondent pas nécessairement à ce qui a été décrit ci-dessus:
Le dictionnaire définit la "simultanéité" comme un fait d'occurrence, tandis que la définition dans la langue de calcul est une propriété latente d'un programme, d'une propriété ou d'un système. Bien que liés, 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 n'est pas certain ou non pertinent que l'exécution simultanée soit employée.
Je décrirais donc la simulation d'un moteur à réaction sur plusieurs cœurs comme 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 ordre partiel. Lorsque les relations et les recettes sont définies de manière complète et correcte, cela établit la propriété de la concurrence: il existe un ordre partiel de sorte que l'ordre de certaines tâches peut ê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.
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é simultané mais l'inverse n'est pas vrai.
Pour plus de détails, lisez ce document de recherche Concepts of Concurrent Programming
Le traitement 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 les 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 parallèle est un type de traitement simultané dans lequel plusieurs ensembles d'instructions s'exécutent 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.
De toute évidence, les termes sont utilisés différemment dans différentes cultures.
Ma compréhension est la suivante:
Le parallélisme est un moyen d'accélérer le traitement. Que vous fassiez une multiplication matricielle sur un seul cœur, sur plusieurs cœurs ou même dans le GPU, le résultat est le même (sinon votre programme est cassé). Il n'ajoute pas de nouvelles fonctionnalités à certains programmes, juste de la vitesse.
Alors 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 prochaine demande. (Bien que vous puissiez simuler cela dans une certaine mesure grâce à l'entrelacement, comme cela a été fait dans les jours les plus anciens.) Notez que le comportement des programmes simultanés n'est pas déterministe. Il n'est pas clair, par exemple, lequel des trois clients sera entièrement servi en premier. Vous pouvez exécuter plusieurs tests et obtenir un résultat différent à chaque fois en ce qui concerne la commande, la demande sera terminée. Le système d'exécution devrait garantir que a) tous les clients seront servis et b) dans un délai raisonnable.
Habituellement, le cheval de bataille d'un calcul parallèle n'est pas conscient du parallélisme, ni s'en soucie. Alors que les tâches simultanées utilisent souvent explicitement des communications inter-processus ou inter-threads - telles que le blocage des files d'attente, la synchronisation et les mécanismes de verrouillage.
À 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 des threads a été créé pour simuler le traitement multicœur à l'époque où le multicœur n'était pas possible. 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 avis, ces deux termes devraient être réunis en un seul et je m'efforce d'éviter de dire "concurrentes". 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 trop d'importance. J'ai écrit mapReduce, Spark, MPI, cuda, openCL et c ++ multithread et je n'ai jamais eu à m'arrêter et à penser si le travail s'exécute avec des threads entrelacés ou avec plusieurs cœurs.
Par exemple, lorsque j'écris du c ++ multithread, parfois je ne sais pas combien de cœurs je recevrai, bien qu'il existe des moyens de faire des demandes sur le nombre de cœurs que vous obtenez comme décrit ici https://stackoverflow.com/ questions/2166425/comment-structurer-application-ac-pour-utiliser-un-processeur-multicœur . Dans spark je ne fais que mapper et réduire les opérations et je n'ai aucune idée de la façon dont le jvm les gère au niveau matériel. Sur les GPU, je pense chaque thread est assigné à son propre processeur simple, mais je synchronise toujours mes threads partout où un problème pourrait survenir. Avec MPI la communication entre les machines est spécifiée explicitement, mais nous pourrions entrelacer les fonctions s'exécutant sur plusieurs machines sur un seul cœur et combinant les résultats via une fonction appropriée à un seul thread. Et si nous utilisons MPI pour coordonner un tas de machines à cœur unique, chacune avec du multithreading? Quelle différence cela fait-il? Je dirais que rien. Appelez-le tout "parallèle" et en finir avec ça.
la déclaration de tdammer se rapproche, le reste est tout sauf le point. Il dit:
"En termes audacieux, la concurrence décrit un problème (deux choses doivent se produire ensemble), tandis 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.
Les moyens actuels se produisent maintenant, réels, pertinents en ce moment. Con signifie contre, contrer, ne pas s'aligner avec.
Parallèle signifie dans la même direction sans traverser, sans se gêner mutuellement.
Ainsi, la concurrence implique la concurrence pour la même ressource. Le parallélisme ne fonctionne pas. Les processus parallèles peuvent utiliser 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 à régler.
Une autre utilisation courante et spécifique du terme "parallèle" se réfère à processeurs matriciels. (Le GPU de votre ordinateur en est un excellent exemple.) Ici, des unités de calcul massivement redondantes littéralement = calculer de nombreux résultats au même instant.
Dans ce contexte, la "concurrence" est un peu plus lâche: nous, les humains, pourrions dire qu'au cours de la dernière seconde, de nombreuses tâches ont été travaillées, donc elles ont été "gérées" en même temps "", bien qu'il puisse être en particulier la nanoseconde, seule une d’entre elles était en cours d’élaboration.
Mais aussi: "ça dépend." Les deux mots ont la même signification familier dans la conversation humaine courante. Ainsi, vous devrez peut-être demander des éclaircissements pour déterminer si une signification plus précise était ou n'était pas prévue.