Quelle est la différence entre la concurrence et le parallélisme?

Quelle est la différence entre la concurrence et le parallélisme?

Des exemples sont appréciés.

La simultanéité se produit lorsque deux tâches ou plus peuvent démarrer, s’exécuter et se terminer pendant des périodes de chevauchement. Cela ne signifie pas forcément qu’ils fonctionneront tous les deux au même instant. Par exemple, le multitâche sur une machine à cœur unique.

Le parallélisme se produit lorsque les tâches s’exécutent littéralement au même moment, par exemple sur un processeur multicœur.


Citant le Guide de programmation multithread de Sun :

  • Concurrence: Une condition qui existe quand au moins deux threads progressent. Une forme de parallélisme plus généralisée pouvant inclure le découpage temporel en une forme de parallélisme virtuel.

  • Parallélisme: Une condition qui se produit quand au moins deux threads s’exécutent simultanément.

Pourquoi la confusion existe

La confusion existe parce que les significations du dictionnaire de ces deux mots sont presque identiques:

  • Concurrent : existant, existant ou réalisé en même temps (dictionary.com)
  • Parallèle : très similaire et se produisant souvent en même temps (Webster Merriam).

Pourtant, leur utilisation en informatique et en programmation est très différente. Voici mon interprétation:

  • Concurrence : interruptibilité
  • Parallélisme : Independentability

Alors qu’est-ce que je veux dire par les définitions ci-dessus?

Je vais clarifier avec une analogie réelle. Disons que vous devez faire 2 tâches très importantes en une journée:

  1. Obtenir un passeport
  2. Faites une présentation

Maintenant, le problème est que la tâche 1 vous oblige à vous rendre dans un bureau gouvernemental extrêmement bureaucratique qui vous fait attendre 4 heures d’affilée pour obtenir votre passeport. Pendant ce temps, votre bureau a besoin de la tâche 2, et c’est une tâche critique. Les deux doivent être terminés un jour précis.

Cas 1: Exécution séquentielle

Normalement, vous allez au bureau des passeports pendant 2 heures, attendez dans la file pendant 4 heures, faites la tâche, revenez deux heures, rentrez chez vous, restz cinq heures de plus et faites la présentation.

Cas 2: Exécution simultanée

Mais tu es intelligent. Vous planifiez à l’avance. Vous portez un ordinateur portable avec vous et, en attendant, vous commencez à travailler sur votre présentation. De cette façon, une fois de retour à la maison, il vous suffit de travailler 1 heure au lieu de 5.

Dans ce cas, les deux tâches sont effectuées par vous, juste en morceaux. Vous avez interrompu la tâche du passeport en attendant dans la file et travaillé à la présentation. Lorsque votre numéro a été appelé, vous avez interrompu la tâche de présentation et vous êtes passé à la tâche de passeport. Le gain de temps était essentiellement possible grâce à l’interruption des deux tâches.

La concomitance, IMO, doit être considérée comme une “isolation” dans les propriétés ACID d’une firebase database. Deux transactions de firebase database satisfont aux exigences en matière d’isolement si vous effectuez des sous-transactions dans chacune des manières nestedes et que le résultat final est le même que si les deux tâches étaient effectuées en série. Rappelez-vous que pour les tâches de passeport et de présentation, vous êtes le seul exécuteur .

Cas 3: Exécution parallèle

Maintenant que vous êtes un gars intelligent, vous êtes évidemment un plus haut placé et vous avez un assistant. Donc, avant de partir pour commencer la tâche de passeport, vous l’appelez et lui dites de préparer la première version de la présentation. Vous passez toute la journée et terminez votre tâche de passeport, revenez voir vos e-mails et trouvez le brouillon de présentation. Il a fait un travail assez solide et avec quelques modifications en 2 heures de plus, vous le finalisez.

Maintenant que votre assistant est aussi intelligent que vous, il a pu travailler de manière autonome , sans avoir à vous demander constamment des clarifications. Ainsi, grâce à l’indépendance des tâches, elles ont été exécutées en même temps par deux exécuteurs différents .

Encore avec moi? Bien…

Cas 4: concomitant mais pas parallèle

Rappelez-vous votre tâche de passeport, où vous devez attendre dans la file? Comme c’est votre passeport, votre assistant ne peut pas vous attendre. Ainsi, la tâche de passeport est interrompue (vous pouvez l’arrêter en attendant dans la ligne et la reprendre plus tard lorsque votre numéro est appelé), mais pas d’ indépendance (votre assistant ne peut pas attendre à votre place).

Cas 5: parallèle mais non simultané

Supposons que le bureau du gouvernement ait un contrôle de sécurité pour entrer dans les locaux. Ici, vous devez supprimer tous les appareils électroniques et les soumettre aux agents, qui ne vous renvoient que lorsque vous avez terminé votre tâche.

Dans ce cas, la tâche du passeport n’est ni indépendant ni interruptible . Même si vous attendez dans la queue, vous ne pouvez pas travailler sur autre chose parce que vous n’avez pas l’équipement nécessaire.

De même, la présentation est tellement mathématique que vous avez besoin d’une concentration de 100% pendant au moins 5 heures. Vous ne pouvez pas le faire en attendant en ligne pour la tâche de passeport, même si vous avez votre ordinateur portable avec vous.

Dans ce cas, la tâche de présentation est indépendante (vous ou votre assistant pouvez effectuer 5 heures d’efforts ciblés), mais pas interruptible .

Cas 6: Exécution simultanée et parallèle

Maintenant, disons qu’en plus d’affecter votre assistant à la présentation, vous portez également un ordinateur portable avec vous pour effectuer un passeport. En attendant dans la queue, vous voyez que votre assistant a créé les 10 premières diapositives d’un deck partagé. Vous envoyez des commentaires sur son travail avec quelques corrections. Plus tard, à votre retour à la maison, au lieu de 2 heures pour finaliser le brouillon, il vous suffit de 15 minutes.

Cela était possible parce que la tâche de présentation est indépendante (l’un de vous peut le faire) et l’ interruptibilité (vous pouvez l’arrêter et la reprendre plus tard). Vous avez donc exécuté simultanément les deux tâches et exécuté la tâche de présentation en parallèle.

Disons qu’en plus d’être trop bureaucratique, le bureau du gouvernement est corrompu. Ainsi, vous pouvez montrer votre identification, y entrer, commencer à attendre que votre numéro soit appelé, corrompre un garde et quelqu’un d’autre pour garder votre position sur la ligne, sortir furtivement, appeler votre numéro et reprendre l’attente. toi même.

Dans ce cas, vous pouvez effectuer les tâches de passeport et de présentation simultanément et en parallèle. Vous pouvez sortir et votre position est tenue par votre assistant. Vous pouvez tous deux travailler sur la présentation, etc.


Retour à l’informatique

En informatique, voici des exemples de scénarios typiques de chacun de ces cas:

  • Cas 1: traitement d’interruption.
  • Cas 2: lorsqu’il n’y a qu’un seul processeur, mais que toutes les tâches en cours ont des temps d’attente dus aux E / S.
  • Cas 3: Souvent vu lorsque nous parlons de grappes de réduction de carte ou de hadoop.
  • Cas 4: Je pense que le cas 4 est rare. Il est rare qu’une tâche soit simultanée mais non parallèle. Mais cela pourrait arriver. Par exemple, supposons que votre tâche nécessite un access à une puce de calcul spéciale accessible uniquement via le processeur 1. Ainsi, même si le processeur 2 est libre et que le processeur 1 exécute une autre tâche, la tâche de calcul spéciale ne peut pas continuer sur le processeur 2.
  • Cas 5: également rare, mais pas aussi rare que le cas 4. Un code non concurrent peut être une région critique protégée par des mutex. Une fois démarré, il doit être terminé. Cependant, deux régions critiques différentes peuvent progresser simultanément sur deux processeurs différents.
  • Cas 6: OMI, la plupart des discussions sur la programmation parallèle ou concurrente portent essentiellement sur le cas 6. Il s’agit d’un mélange d’exécutions parallèles et simultanées.

Concurrence et Go

Si vous voyez pourquoi Rob Pike dit que la concurrence est meilleure, vous devez comprendre que la raison en est. Vous avez une très longue tâche dans laquelle vous attendez plusieurs opérations externes telles que la lecture de fichiers, le téléchargement réseau. Dans sa conférence, tout ce qu’il dit, c’est simplement «rompre cette longue tâche séquentielle pour pouvoir faire quelque chose d’utile pendant que vous attendez».

Maintenant, la force de Go vient de rendre cette rupture vraiment facile avec des mots go clés et des canaux. En outre, il existe un excellent support sous-jacent lors de l’exécution pour planifier ces goroutines.

Mais essentiellement, la concurrence est-elle meilleure que le parallélisme?

Les pommes sont-elles plus préférées que les oranges?

J’aime le discours de Rob Pike: la concurrence n’est pas le parallélisme (c’est mieux!) (Slides) (talk)

Rob parle généralement de Go et aborde généralement la question de la concurrence et du parallélisme dans une explication visuelle et intuitive! Voici un bref résumé:

Tâche: Graver une stack de manuels de langue obsolètes! Un à la fois!

Tâche

Concurrence: il existe de nombreuses décompositions simultanées de la tâche! Un exemple:

Gophers

Parallélisme: La configuration précédente a lieu en parallèle si au moins 2 gaufres travaillent au même moment ou non.

Pour append à ce que les autres ont dit:

La concurrence est comme si un jongleur jonglait avec beaucoup de balles. Indépendamment de ce que cela semble, le jongleur attrape / lance une balle par main à la fois. Le parallélisme consiste à jongler avec plusieurs balles simultanément.

Disons que vous avez un programme qui a deux threads. Le programme peut fonctionner de deux manières:

 Concurrency Concurrency + parallelism (Single-Core CPU) (Multi-Core CPU) ___ ___ ___ |th1| |th1|th2| | | | |___| |___|___ | |___ |th2| |___|th2| ___|___| ___|___| |th1| |th1| |___|___ | |___ |th2| | |th2| 

Dans les deux cas, nous avons la simultanéité du simple fait que nous avons plusieurs threads en cours d’exécution.

Si nous exécutions ce programme sur un ordinateur avec un cœur de processeur unique, le système d’exploitation basculerait entre les deux threads, permettant à un thread de s’exécuter à la fois.

Si nous exécutions ce programme sur un ordinateur doté d’un processeur multi-cœur, nous pourrions exécuter les deux threads en parallèle , côte à côte, au même moment.

Concurrence: Si plusieurs problèmes sont résolus par un seul processeur. texte alt

Parallélisme: Si un problème est résolu par plusieurs processeurs.

texte alt

Je vais essayer d’expliquer avec un exemple intéressant et facile à comprendre. 🙂

Supposons qu’une organisation organise un tournoi d’échecs où 10 joueurs ( ayant les mêmes capacités de jeu d’échecs ) défieront un champion d’ échecs professionnel. Et comme les échecs durent 1: 1, les organisateurs doivent gérer 10 matchs de manière efficace afin de pouvoir terminer l’événement le plus rapidement possible.

Espérons que les scénarios suivants décriront facilement plusieurs façons de mener ces 10 jeux:

1) SÉRIE – disons que le professionnel joue avec chaque personne une à une, c’est-à-dire commence et termine la partie avec une personne, puis commence la partie suivante avec la personne suivante et ainsi de suite. En d’autres termes, ils ont décidé de mener les jeux séquentiellement. Donc, si une partie prend 10 minutes pour compléter, 10 parties prendront 100 minutes, supposons également que la transition d’un jeu à un autre prend 6 secondes et que pour 10 jeux, elle sera de 54 secondes (environ 1 minute).

donc l’événement complet se terminera approximativement en 101 minutes ( PIRE APPROCHE )

2) CONCURRENCE – disons que le professionnel joue son tour et passe au joueur suivant pour que tous les 10 joueurs jouent simultanément mais le joueur professionnel n’a pas deux personnes à la fois, il joue son tour et passe à la personne suivante. Supposons maintenant que le joueur professionnel prenne 6 secondes pour jouer son tour et que le temps de transition du joueur professionnel n / b avec deux joueurs soit de 6 secondes. Le temps de transition total pour revenir au premier joueur sera donc de 1 minute (10x6sec). Par conséquent, au moment où il est de retour à la première personne avec qui l’événement a été lancé, 2 minutes se sont écastings (10xtime_per_turn_by_champion + 10xtransition_time = 2mins)

En supposant que tous les joueurs prennent 45 secondes pour terminer leur tour, basé sur 10 minutes par match à partir de l’événement SERIAL, le non. des tours avant la fin de la partie devrait 600 / (45 + 6) = 11 tours (environ)

Donc, l’événement complet se terminera approximativement dans 11xtime_per_turn_by_player _ & _ champion + 11xtransition_time_across_10_players = 11×51 + 11x60sec = 561 + 660 = 1221sec = 20.35min (environ)

VOIR L’AMÉLIORATION de 101 minutes à 20,35 minutes ( meilleure approche )

3) PARALLELE – disons que les organisateurs obtiennent des fonds supplémentaires et ont donc décidé d’inviter deux champions professionnels (tous deux également compétents) et de répartir le même groupe de 10 joueurs (challengers) en deux groupes de 5 chacun. groupe chacun Maintenant, l’événement progresse parallèlement dans ces deux séries, c’est-à-dire qu’au moins deux joueurs (un dans chaque groupe) jouent contre les deux joueurs professionnels de leur groupe respectif.

Cependant, dans le groupe, le joueur professionnel avec un joueur à la fois (c.-à-d. Séquentiellement), donc sans aucun calcul, vous pouvez facilement en déduire que tout l’événement sera complet en 101/2 = 50.5 minutes pour terminer

VOIR L’AMÉLIORATION de 101 minutes à 50,5 minutes ( bonne approche )

4) CONCURRENT + PARALLÈLE – Dans le scénario ci-dessus, disons que les deux champions joueront simultanément (lire le deuxième point) avec les 5 joueurs de leurs groupes respectifs. Désormais, les jeux des différents groupes se déroulent en parallèle mais au sein du groupe.

Ainsi, les jeux d’un groupe seront presque terminés dans 11xtime_per_turn_by_player _ & _ champion + 11xtransition_time_across_5_players = 11×51 + 11×30 = 600 + 330 = 930sec = 15,5 minutes (environ)

Ainsi, l’ensemble de l’événement (impliquant deux groupes en cours d’exécution en parallèle) se terminera approximativement à 15,5 minutes.

VOIR L’AMÉLIORATION de 101 minutes à 15,5 minutes ( meilleure approche )

NOTE: dans le scénario ci-dessus, si vous remplacez 10 joueurs avec 10 tâches similaires et deux lecteurs professionnels avec deux cœurs de processeurs, l’ordre suivant restra vrai:

SERIAL> PARALLEL> CONCURRENT> CONCURRENT + PARALLEL

(REMARQUE: cette commande peut changer pour d’autres scénarios, car cette commande dépend fortement de l’interdépendance des tâches, des besoins de communication b / w et des tâches de transition de transition b / w)

concurency: plusieurs stream d’exécution avec le potentiel de partager des ressources

Ex: deux threads en compétition pour un port d’E / S.

paralélisme: diviser un problème en plusieurs morceaux similaires.

Ex: parsingr un gros fichier en exécutant deux processus sur chaque moitié du fichier.

Ils résolvent différents problèmes. La simultanéité résout le problème d’avoir des ressources CPU limitées et de nombreuses tâches. Ainsi, vous créez des threads ou des chemins d’exécution indépendants via du code afin de partager le temps sur la ressource rare. Jusqu’à récemment, la concurrence a dominé la discussion en raison de la disponibilité du processeur.

Le parallélisme résout le problème de trouver suffisamment de tâches et de tâches appropriées (celles qui peuvent être divisées correctement) et de les répartir sur des ressources processeur abondantes. Le parallélisme a toujours existé, mais il est au premier plan parce que les processeurs multi-coeurs sont très bon marché.

Exemple simple:

Concurrent est: “Deux files d’attente accédant à un guichet automatique”

Le parallèle est: “Deux files d’attente et deux guichets automatiques”

Imaginez apprendre un nouveau langage de programmation en regardant un didacticiel vidéo. Vous devez mettre la vidéo en pause, appliquer ce qui a été dit dans le code puis continuer à regarder. C’est la concurrence.

Maintenant vous êtes un programmeur professionnel. Et vous aimez écouter de la musique calme pendant le codage. C’est du parallélisme.

Prendre plaisir.

Considérez-le comme des files d’attente de service où le serveur ne peut servir que le premier travail dans une queue.

1 serveur, 1 queue de travaux (avec 5 travaux) -> pas de concurrence, pas de parallélisme (un seul travail est exécuté jusqu’à la fin, le prochain travail de la queue doit attendre que le travail soit effectué et le servir)

1 serveur, 2 files d’attente différentes ou plus (avec 5 tâches par queue) -> simultanéité (puisque le serveur partage le même temps avec les 1ères tâches dans les files d’attente, égales ou pondérées), toujours sans parallélisme travail en cours de maintenance.

2 serveurs ou plus, une queue -> parallélisme (2 tâches effectuées au même instant) mais pas de concurrence (le serveur ne partage pas son temps, le 3e travail doit attendre que l’un des serveurs soit terminé).

2 serveurs ou plus, 2 files d’attente différentes ou plus -> simultanéité et parallélisme

En d’autres termes, la simultanéité est le partage du temps pour terminer un travail, elle PEUT prendre le même temps pour terminer son travail, mais au moins elle commence tôt. Ce qui est important, c’est que les tâches peuvent être divisées en tâches plus petites, ce qui permet un entrelacement.

Le parallélisme est réalisé avec juste plus de processeurs, serveurs, personnes, etc. qui fonctionnent en parallèle.

Gardez à l’esprit que si les ressources sont partagées, le parallélisme pur ne peut pas être réalisé, mais c’est là que la simultanéité aurait la meilleure utilisation pratique, en prenant un autre travail qui n’a pas besoin de cette ressource.

Concurrence => Lorsque plusieurs tâches sont exécutées dans des périodes de chevauchement avec des ressources partagées (optimisation potentielle de l’utilisation des ressources).

Parallel => quand une tâche unique est divisée en plusieurs sous-tâches indépendantes simples pouvant être exécutées simultanément.

Je vais offrir une réponse qui est un peu en conflit avec certaines des réponses les plus populaires ici. À mon avis, la concurrence est un terme général qui inclut le parallélisme. La concurrence s’applique à toute situation où des tâches ou des unités de travail distinctes se chevauchent dans le temps. Le parallélisme s’applique plus spécifiquement aux situations où des unités de travail distinctes sont évaluées / exécutées au même moment physique. La raison d’être du parallélisme est d’accélérer les logiciels pouvant bénéficier de multiples ressources de calcul physiques. L’interactivité est l’autre concept majeur qui s’adapte à la concurrence. L’interactivité s’applique lorsque le chevauchement des tâches est observable du monde extérieur. La raison d’être de l’interactivité est de rendre les logiciels sensibles aux entités du monde réel, telles que les utilisateurs, les pairs de réseau, les périphériques matériels, etc.

Le parallélisme et l’interactivité sont une dimension presque totalement indépendante de la concurrence. Pour un projet particulier, les développeurs peuvent se soucier de l’un ou l’autre, des deux ou de l’un ou de l’autre. Ils ont tendance à être confondus, notamment parce que l’abomination qui est des threads donne une primitive raisonnablement pratique pour faire les deux.

Un peu plus de détails sur le parallélisme :

Le parallélisme existe à de très petites échelles (par exemple, le parallélisme au niveau de l’instruction dans les processeurs), les échelles moyennes (par exemple les processeurs multicœurs) et les grandes échelles (par exemple les grappes de calcul haute performance). La pression sur les développeurs de logiciels pour exposer davantage de parallélisme au niveau des threads a augmenté ces dernières années, en raison de la croissance des processeurs multicœurs. Le parallélisme est intimement lié à la notion de dépendance . Les dépendances limitent l’étendue du parallélisme. deux tâches ne peuvent être exécutées en parallèle si l’une dépend de l’autre (Ignorer la spéculation).

Les programmeurs utilisent de nombreux schémas pour exprimer le parallélisme: les pipelines, les pools de tâches, les opérations d’agrégat sur les structures de données («tableaux parallèles»).

Un peu plus de détails sur l’interactivité :

La manière la plus élémentaire et la plus courante d’interactivité concerne les événements (c’est-à-dire une boucle d’événement et des gestionnaires / rappels). Pour les tâches simples, les événements sont formidables. Essayer d’effectuer des tâches plus complexes avec des événements se transforme en extraction de stack (alias callback, alias inversion de contrôle). Lorsque vous en avez marre des événements, vous pouvez essayer des choses plus exotiques comme des générateurs, des coroutines (aka Async / Await) ou des threads coopératifs.

Pour l’amour des logiciels fiables, veuillez ne pas utiliser de threads si vous préférez l’interactivité.

Curmudgeon précité

Je n’aime pas que «la concurrence est un parallélisme, c’est mieux». La concurrence n’est ni meilleure ni pire que le parallélisme. La concurrence inclut l’interactivité, qui ne peut être comparée de manière meilleure / pire avec le parallélisme. C’est comme dire “le stream de contrôle est meilleur que les données”.

En électronique, les séries et les parallèles représentent un type de topologie statique, déterminant le comportement réel du circuit. Lorsqu’il n’y a pas de concurrence, le parallélisme est déterministe .

Afin de décrire des phénomènes dynamics liés au temps , nous utilisons les termes séquentiel et simultané . Par exemple, un certain résultat peut être obtenu via une certaine séquence de tâches (par exemple, une recette). Lorsque nous parlons avec quelqu’un, nous produisons une séquence de mots. Cependant, en réalité, de nombreux autres processus se produisent au même moment et, par conséquent, concourent au résultat réel d’une certaine action. Si beaucoup de personnes parlent en même temps, des discussions simultanées peuvent interférer avec notre séquence, mais les résultats de cette interférence ne sont pas connus à l’avance. La concurrence introduit l’indétermination .

La caractérisation série / parallèle et séquentielle / simultanée est orthogonale. Un exemple en est la communication numérique. Dans un adaptateur série , un message numérique est dissortingbué temporellement ( séquentiellement ) le long de la même ligne de communication (par exemple, un câble). Dans un adaptateur parallèle , celui-ci est également divisé sur des lignes de communication parallèles (par exemple, de nombreux fils), puis reconstruit à la réception.

Imaginons un jeu avec 9 enfants. Si nous les disposons en chaîne, donnons un message au premier et le recevons à la fin, nous aurons une communication en série. Plus de mots composent le message, consistant en une séquence d’unités de communication.

 I like ice-cream so much. > X > X > X > X > X > X > X > X > X > .... 

Ceci est un processus séquentiel reproduit sur une infrastructure série .

Maintenant, laissez-nous l’image pour diviser les enfants en groupes de 3. Nous divisons la phrase en trois parties, donnons le premier à l’enfant de la ligne à notre gauche, le second à l’enfant de la ligne centrale, etc.

 I like ice-cream so much. > I like > X > X > X > .... > .... > ice-cream > X > X > X > .... > so much > X > X > X > .... 

Ceci est un processus séquentiel reproduit sur une infrastructure parallèle (encore partiellement sérialisée).

Dans les deux cas, en supposant une communication parfaite entre les enfants, le résultat est déterminé à l’avance.

S’il y a d’autres personnes qui parlent au premier enfant en même temps que vous, alors nous aurons des processus simultanés . Nous ne soaps pas quel processus sera considéré par l’infrastructure, le résultat final n’est donc pas déterminé à l’avance.

La concurrence est la forme généralisée du parallélisme. Par exemple, un programme parallèle peut également être appelé simultané mais l’inverse n’est pas vrai.

  1. L’exécution simultanée est possible sur un seul processeur (plusieurs threads, gérés par le planificateur ou le pool de threads)

  2. L’exécution parallèle n’est pas possible sur un seul processeur mais sur plusieurs processeurs. (Un processus par processeur)

  3. L’informatique dissortingbuée est également un sujet connexe et on peut aussi l’appeler l’informatique concurrente, mais l’inverse n’est pas vrai, comme le parallélisme.

Pour plus de détails, lisez ce document de recherche Concepts de programmation simultanée

J’aime beaucoup la réponse de Paul Butcher à cette question (il est l’auteur de sept modèles de simultanéité en sept semaines ):

Bien qu’ils soient souvent confus, le parallélisme et la concurrence sont des choses différentes. La concurrence est un aspect du domaine problématique: votre code doit gérer plusieurs événements simultanés (ou quasi simultanés) . Le parallélisme, en revanche, est un aspect du domaine de la solution: vous souhaitez que votre programme s’exécute plus rapidement en traitant différentes parties du problème en parallèle. Certaines approches sont applicables à la concurrence, d’autres au parallélisme et d’autres aux deux. Comprendre ce que vous êtes confronté et choisir le bon outil pour le travail.

J’ai vraiment aimé cette représentation graphique d’une autre réponse – je pense qu’elle répond bien mieux à la question que beaucoup de réponses ci-dessus

Parallélisme et concurrence Lorsque deux threads sont exécutés en parallèle, ils s’exécutent tous deux en même temps. Par exemple, si nous avons deux threads, A et B, leur exécution parallèle ressemblera à ceci:

CPU 1: A ————————->

CPU 2: B ————————->

Lorsque deux threads s’exécutent simultanément, leur exécution se chevauche. Le chevauchement peut se produire de deux manières: soit les threads s’exécutent en même temps (c’est-à-dire en parallèle, comme ci-dessus), soit leurs exécutions sont entrelacées sur le processeur, comme ceci:

CPU 1: A ———–> B ———-> A ———–> B ——– ->

Donc, pour nos besoins, le parallélisme peut être considéré comme un cas particulier de concurrence

Source: Une autre réponse ici

J’espère que cela pourra aider.

La concurrence peut impliquer des tâches exécutées simultanément ou non (elles peuvent en effet être exécutées dans des processeurs / cœurs séparés, mais elles peuvent aussi être exécutées en “ticks”). Ce qui est important, c’est que la simultanéité se réfère toujours à faire une partie d’une tâche plus grande . Donc, fondamentalement, cela fait partie de certains calculs. Vous devez être intelligent sur ce que vous pouvez faire simultanément et sur ce qu’il ne faut pas faire et comment synchroniser.

Le parallélisme signifie que vous ne faites que certaines choses en même temps. Ils n’ont pas besoin de participer à la résolution d’un problème. Vos threads peuvent, par exemple, résoudre chacun un problème. Bien sûr, les éléments de synchronisation s’appliquent également, mais dans une perspective différente.

Parallélisme: Avoir plusieurs threads effectuent des tâches similaires, indépendantes les unes des autres en termes de données et de ressources. Par exemple: Google crawler peut générer des milliers de threads et chaque thread peut effectuer sa tâche de manière indépendante.

Concurrence: la concurrence entre en image lorsque vous avez des données partagées, une ressource partagée entre les threads. Dans un système transactionnel, cela signifie que vous devez synchroniser la section critique du code en utilisant des techniques telles que les verrous, les sémaphores, etc.

“Concurrence”, c’est quand il y a plusieurs choses en cours .

“Parallélisme”, c’est quand les choses concurrentes progressent en même temps .


Exemples de concurrence sans parallélisme:

  • Plusieurs threads sur un seul kernel.
  • Plusieurs messages dans une queue de messages Win32.
  • Plusieurs SqlDataReader sur une connexion MARS .
  • Plusieurs promesses JavaScript dans un onglet de navigateur.

Notez, cependant, que la différence entre la concurrence et le parallélisme est souvent une question de perspective. Les exemples ci-dessus ne sont pas parallèles du sharepoint vue de (effets observables de) l’exécution de votre code. Mais il existe un parallélisme au niveau des instructions, même au sein d’un seul cœur. Il y a des morceaux de matériel faisant des choses en parallèle avec le CPU, puis en interrompant le CPU une fois terminé. Le GPU peut être dessiné à l’écran pendant l’exécution de la procédure de fenêtre ou du gestionnaire d’événements. Le SGBD peut traverser les arborescences B pour la requête suivante pendant que vous récupérez toujours les résultats de la précédente. Le navigateur peut faire la mise en page ou la mise en réseau pendant l’ Promise.resolve() . Etc…

Alors voilà. Le monde est aussi en désordre que jamais;)

La programmation concurrente concerne les opérations qui semblent se chevaucher et concerne principalement la complexité due au stream de contrôle non déterministe. Les coûts quantitatifs associés aux programmes concurrents sont généralement à la fois le débit et la latence. Les programmes simultanés sont souvent liés à l’IO, mais pas toujours, par exemple, les ramasse-miettes simultanés sont entièrement sur CPU. L’exemple pédagogique d’un programme simultané est un robot d’indexation Web. Ce programme lance des requêtes pour les pages Web et accepte les réponses simultanément lorsque les résultats des téléchargements deviennent disponibles, accumulant un ensemble de pages déjà visitées. Le stream de contrôle n’est pas déterministe car les réponses ne sont pas nécessairement reçues dans le même ordre à chaque exécution du programme. Cette caractéristique peut rendre très difficile le débogage de programmes concurrents. Certaines applications sont fondamentalement concurrentes, par exemple les serveurs Web doivent gérer les connexions client simultanément. Erlang est peut-être la langue la plus prometteuse pour la programmation hautement simultanée.

La programmation parallèle concerne les opérations qui se chevauchent dans le but spécifique d’améliorer le débit. Les difficultés de la programmation concurrente sont évitées en rendant le stream de contrôle déterministe. En règle générale, les programmes génèrent des ensembles de tâches enfants qui s’exécutent en parallèle et la tâche parent continue uniquement lorsque toutes les sous-tâches sont terminées. Cela rend les programmes parallèles beaucoup plus faciles à déboguer. La partie la plus difficile de la programmation parallèle est l’optimisation des performances pour des questions telles que la granularité et la communication. Ce dernier problème rest un problème dans le contexte des multicœurs car le transfert de données d’un cache à un autre entraîne des coûts considérables. La multiplication masortingce-masortingce dense est un exemple pédagogique de la programmation parallèle et peut être résolue de manière efficace en utilisant l’algorithme de division et de conquête de Straasen et en attaquant les sous-problèmes en parallèle. Cilk est peut-être le langage le plus prometteur pour la programmation parallèle haute performance sur les ordinateurs à mémoire partagée (y compris les multicores).

Copié de ma réponse: https://stackoverflow.com/a/3982782

Super, laissez-moi prendre un scénario pour montrer ce que je comprends. Supposons qu’il y ait 3 enfants nommés: A, B, C. A et B parlent, C écoutent. Pour A et B, ils sont parallèles: A: Je suis A. B: Je suis B.

Mais pour C, son cerveau doit suivre le même processus pour écouter A et B, peut-être: je suis IA, je suis B.

La concurrence simple signifie que plus d’une tâche est en cours d’exécution (pas nécessaire en parallèle). Par exemple, supposons que nous ayons 3 tâches à tout moment: plusieurs peuvent être en cours d’exécution ou toutes peuvent être exécutées en même temps.

Le parallélisme signifie qu’ils fonctionnent littéralement en parallèle. Donc, dans ce cas, tous les trois doivent fonctionner en même temps.

La notion de «concurrence» de Pike est une décision intentionnelle de conception et de mise en œuvre. Une conception de programme à capacité concurrente peut ou non présenter un “parallélisme” comportemental; cela dépend de l’environnement d’exécution.

Vous ne voulez pas que le parallélisme soit présenté par un programme qui n’a pas été conçu pour la concurrence. 🙂 Mais dans la mesure où il s’agit d’un gain net pour les facteurs pertinents (consommation d’énergie, performances, etc.), vous souhaitez une conception simultanée maximale afin que le système hôte puisse paralléliser son exécution lorsque cela est possible.

Le langage de programmation de Pike’s Go l’illustre à l’extrême: ses fonctions sont toutes des threads qui peuvent s’exécuter correctement simultanément, c’est-à-dire que l’appel d’une fonction crée toujours un thread qui s’exécutera en parallèle avec l’appelant. Une application avec des centaines voire des milliers de threads est parfaitement ordinaire dans son monde. (Je ne suis pas un expert de Go, c’est juste mon sharepoint vue.)

L’explication de cette source m’a été utile:

La concurrence est liée à la manière dont une application gère plusieurs tâches sur lesquelles elle travaille. Une application peut traiter une tâche à la fois (de manière séquentielle) ou travailler sur plusieurs tâches simultanément (simultanément).

Le parallélisme, quant à lui, est lié à la manière dont une application gère chaque tâche individuelle. Une application peut traiter la tâche en série du début à la fin, ou diviser la tâche en sous-tâches pouvant être complétées en parallèle.

Comme vous pouvez le voir, une application peut être simultanée, mais pas parallèle. Cela signifie qu’il traite plus d’une tâche à la fois, mais que les tâches ne sont pas divisées en sous-tâches.

Une application peut également être parallèle mais pas simultanée. Cela signifie que l’application ne fonctionne que sur une tâche à la fois, et que cette tâche est décomposée en sous-tâches pouvant être traitées en parallèle.

De plus, une application ne peut être ni simultanée ni parallèle. Cela signifie qu’il ne fonctionne que sur une tâche à la fois et que la tâche n’est jamais décomposée en sous-tâches pour une exécution parallèle.

Enfin, une application peut également être à la fois simultanée et parallèle, car elle fonctionne à la fois sur plusieurs tâches et divise chaque tâche en sous-tâches pour une exécution parallèle. Cependant, certains avantages de la simultanéité et du parallélisme peuvent être perdus dans ce scénario, car les processeurs de l’ordinateur sont déjà suffisamment occupés par la simultanéité ou le parallélisme. Combiner cela peut entraîner seulement un faible gain de performance ou même une perte de performance.

À mon avis, la manière la plus simple et la plus élégante de comprendre les deux est la suivante. La concurrence permet une imbrication de l’exécution et peut donner l’ illusion du parallélisme. Cela signifie qu’un système concurrent peut exécuter votre vidéo Youtube avec vous en écrivant un document dans Word, par exemple. Le système d’exploitation sous-jacent, étant un système concurrent, permet à ces tâches d’entrelacer leur exécution. Parce que les ordinateurs exécutent des instructions si rapidement, cela donne l’impression de faire deux choses à la fois.

Le parallélisme, c’est quand ces choses sont vraiment en parallèle. Dans l’exemple ci-dessus, il se peut que le code de traitement vidéo soit exécuté sur un seul cœur et que l’application Word s’exécute sur un autre. Notez que cela signifie qu’un programme simultané peut également être en parallèle! La structuration de votre application avec des threads et des processus permet à votre programme d’exploiter le matériel sous-jacent et de le faire potentiellement en parallèle.

Pourquoi ne pas tout être parallèle alors? L’une des raisons est que la concurrence est un moyen de structurer les programmes et constitue une décision de conception pour faciliter la séparation des préoccupations, alors que le parallélisme est souvent utilisé au nom de la performance. Une autre est que certaines choses ne peuvent pas être entièrement réalisées en parallèle. An example of this would be adding two things to the back of a queue – you cannot insert both at the same time. Something must go first and the other behind it, or else you mess up the queue. Although we can interleave such execution (and so we get a concurrent queue), you cannot have it parallel.

J’espère que cela t’aides!

(I’m quite surprised such a fundamental question is not resolved correctly and neatly for years…)

In short, both concurrency and parallelism are properties of computing .

As of the difference, here is the explanation from Robert Harper :

The first thing to understand is parallelism has nothing to do with concurrency . Concurrency is concerned with nondeterministic composition of programs (or their components). Parallelism is concerned with asymptotic efficiency of programs with deterministic behavior. Concurrency is all about managing the unmanageable: events arrive for reasons beyond our control, and we must respond to them. A user clicks a mouse, the window manager must respond, even though the display is demanding attention. Such situations are inherently nondeterministic, but we also employ pro forma nondeterminism in a deterministic setting by pretending that components signal events in an arbitrary order, and that we must respond to them as they arise. Nondeterministic composition is a powerful program structuring idea. Parallelism, on the other hand, is all about dependencies among the subcomputations of a deterministic computation. The result is not in doubt, but there are many means of achieving it, some more efficient than others. We wish to exploit those opportunities to our advantage.

They can be sorts of orthogonal properties in programs. Read this blog post for additional illustrations. And this one discussed slightly more on difference about components in programming , like threads.

Note that threading or multitasking are all implementations of computing serving more concrete purposes. They can be related to parallelism and concurrency, but not in an essential way. Thus they are hardly good ensortinges to start the explanation.

One more highlight: (physical) “time” has almost nothing to do with the properties discussed here. Time is just a way of implementation of the measurement to show the significance of the properties, but far from the essence. Think twice the role of “time” in time complexity – which is more or less similar, even the measurement is often more significant in that case.

Just by consulting the dictionary, you can see that concurrent (from latin) means to run together, converge, agree; ergo there is a need to synchronize because there is competition on the same resources. Parallel (from greek) means to duplicate on the side; ergo to do the same thing at the same time.