Quelle est la différence entre la concurrence et le parallélisme?
Des exemples sont appréciés.
Quelle est la différence entre la concurrence et le parallélisme?
Des exemples sont appréciés.
Réponses:
La simultanéité est lorsque deux tâches ou plus peuvent démarrer, s'exécuter et se terminer dans des périodes qui se chevauchent. Cela ne signifie pas nécessairement qu'ils fonctionneront tous les deux au même instant. Par exemple, le multitâche sur une machine monocœur.
Le parallélisme est lorsque des tâches s'exécutent littéralement en même temps, par exemple sur un processeur multicœur.
Citant le Guide de programmation multithread de Sun :
Concurrence: condition qui existe lorsqu'au moins deux threads progressent. Une forme plus généralisée de parallélisme qui peut inclure le découpage temporel en tant que forme de parallélisme virtuel.
Parallélisme: condition qui se produit lorsqu'au moins deux threads s'exécutent simultanément.
La confusion existe car les significations du dictionnaire de ces deux mots sont presque les mêmes:
Pourtant, la façon dont ils sont utilisés en informatique et en programmation est très différente. Voici mon interprétation:
Alors, qu'est-ce que je veux dire par les définitions ci-dessus?
Je vais clarifier avec une analogie du monde réel. Disons que vous devez accomplir 2 tâches très importantes en une journée:
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, la tâche 2 est requise par votre bureau et c'est une tâche critique. Les deux doivent être terminés un jour spécifique.
Normalement, vous conduirez au bureau des passeports pendant 2 heures, attendez dans la file d'attente pendant 4 heures, accomplissez la tâche, revenez en arrière deux heures, rentrez chez vous, restez éveillé 5 heures de plus et faites la présentation.
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 supplémentaire 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 de passeport en attendant dans la file d'attente et travaillé sur la présentation. Lorsque votre numéro a été appelé, vous avez interrompu la tâche de présentation et êtes passé à la tâche de passeport. Le gain de temps était essentiellement possible en raison de l'interruptibilité des deux tâches.
La simultanéité, IMO, peut être comprise comme la propriété "d'isolement" dans ACID . Deux transactions de base de données sont considérées isolées si des sous-transactions peuvent être exécutées dans chacune et de n'importe quelle manière entrelacée et le résultat final est le même que si les deux tâches étaient effectuées séquentiellement. N'oubliez pas que pour les tâches de passeport et de présentation, vous êtes le seul bourreau .
Maintenant, puisque vous êtes un gars si intelligent, vous êtes évidemment un haut gradé 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 le premier brouillon de la présentation. Vous passez votre journée entière et terminez la tâche de passeport, revenez voir vos courriers et vous trouvez le brouillon de présentation. Il a fait un travail assez solide et avec quelques modifications en 2 heures de plus, vous finalisez.
Depuis, votre assistant est aussi intelligent que vous, il a pu y travailler de manière autonome , sans avoir à constamment vous demander des éclaircissements. Ainsi, en raison de l'indépendance des tâches, elles ont été exécutées en même temps par deux bourreaux différents .
Encore avec moi? Bien...
Rappelez-vous votre tâche de passeport, où vous devez faire la queue? Puisqu'il s'agit de votre passeport, votre assistant ne peut pas faire la queue pour vous. Ainsi, la tâche passeport est interruptible (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épendabilité (votre assistant ne peut pas attendre à votre place).
Supposons que le bureau du gouvernement dispose d'un contrôle de sécurité pour entrer dans les locaux. Ici, vous devez retirer tous les appareils électroniques et les soumettre aux agents, et ils ne rendent vos appareils qu'après avoir terminé votre tâche.
Dans ce cas, la tâche de passeport n'est ni indépendant, ni interruptible . Même si vous attendez dans la file d'attente, vous ne pouvez pas travailler sur autre chose car vous n'avez pas l'équipement nécessaire.
De même, supposons que la présentation est de nature 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 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 mettre 5 heures d'effort concentré), mais pas interruptible .
Maintenant, disons qu'en plus d'affecter votre assistant à la présentation, vous portez également un ordinateur portable avec vous pour la tâche de passeport. En attendant, vous voyez que votre assistant a créé les 10 premières diapositives dans un deck partagé. Vous envoyez des commentaires sur son travail avec quelques corrections. Plus tard, lorsque vous arrivez à la maison, au lieu de 2 heures pour finaliser le projet, il vous suffit de 15 minutes.
Cela était possible car la tâche de présentation a une indépendance (l'un ou l'autre d'entre vous peut le faire) et une 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 identité, l'entrer, commencer à attendre en ligne que votre numéro soit appelé, soudoyer un garde et quelqu'un d'autre pour maintenir votre position dans la ligne, vous faufiler, revenir avant que votre numéro ne soit appelé 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 vous faufiler et votre poste est occupé par votre assistant. Vous pouvez ensuite travailler tous les deux sur la présentation, etc.
Dans le monde informatique, voici des exemples de scénarios typiques de chacun de ces cas:
Si vous voyez pourquoi Rob Pike dit que la concurrence est meilleure, vous devez comprendre que la raison en est. Vous avez une tâche très longue dans laquelle il y a plusieurs périodes d'attente pendant lesquelles vous attendez certaines opérations externes comme la lecture de fichiers, le téléchargement réseau. Dans sa conférence, tout ce qu'il dit est, "juste briser cette longue tâche séquentielle afin que vous puissiez faire quelque chose d'utile pendant que vous attendez." C'est pourquoi il parle de différentes organisations avec différents gophers.
Maintenant, la force de Go vient de rendre cette rupture vraiment facile avec les go
mots clés et les chaînes. En outre, il existe un excellent support sous-jacent dans l'exécution pour planifier ces goroutines.
Mais essentiellement, la concurrence est-elle meilleure que le parallélisme?
Les pommes sont-elles meilleures 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 contre le parallélisme dans une explication visuelle et intuitive! Voici un bref résumé:
Tâche: brûlons une pile de manuels de langues obsolètes! Un à la fois!
Concurrence: il existe de nombreuses décompositions simultanées de la tâche! Un exemple:
Parallélisme: La configuration précédente se produit en parallèle s'il y a au moins 2 gophers travaillant en même temps ou non.
Pour ajouter à ce que les autres ont dit:
La concurrence, c'est comme avoir un jongleur jongler avec plusieurs balles. Quelle que soit son apparence, le jongleur n'attrape / ne lance qu'une balle par main à la fois. Le parallélisme, c'est que plusieurs jongleurs jonglent avec des balles simultanément.
Supposons que vous ayez un programme qui a deux fils. Le programme peut s'exécuter 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 plus d'un thread en cours d'exécution.
Si nous exécutions ce programme sur un ordinateur avec un seul cœur de processeur, 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 multicœur, nous pourrions exécuter les deux threads en parallèle - côte à côte en même temps.
Concurrence: si deux ou plusieurs problèmes sont résolus par un seul processeur.
Parallélisme: si un problème est résolu par plusieurs processeurs.
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 ( avec des compétences de jeu égales ) défieront un joueur d' échecs champion professionnel. Et puisque les échecs sont un jeu 1: 1, les organisateurs doivent donc organiser 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écrivent facilement plusieurs façons de mener ces 10 jeux:
1) SERIE - disons que le professionnel joue avec chaque personne un par un, c'est-à-dire qu'il commence et termine le jeu avec une personne, puis commence le jeu suivant avec la personne suivante et ainsi de suite. En d'autres termes, ils ont décidé de mener les jeux de manière séquentielle. Donc, si un jeu prend 10 minutes pour terminer, 10 jeux prendront 100 minutes, supposez également que la transition d'un jeu à l'autre prend 6 secondes, puis pour 10 jeux, ce sera 54 secondes (environ 1 minute).
de sorte que l'ensemble de l'événement se terminera environ en 101 minutes ( PIRE APPROCHE )
2) CONCURRENT - disons que le professionnel joue son tour et passe au joueur suivant, donc les 10 joueurs jouent simultanément, mais le joueur professionnel n'est pas avec 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 deux joueurs soit de 6 secondes, donc le temps de transition total pour revenir au premier joueur sera de 1 min (10x6sec). Par conséquent, au moment où il revient à la première personne avec laquelle l'événement a commencé, 2 minutes se sont écoulées (10xtime_per_turn_by_champion + 10xtransition_time = 2 minutes)
En supposant que tous les joueurs prennent 45 secondes pour terminer leur tour, sur la base de 10 minutes par partie de l'événement SERIAL no. de tours avant la fin d'un jeu devrait 600 / (45 + 6) = 11 tours (environ)
Ainsi, l'ensemble de l'événement se terminera approximativement en 11xtime_per_turn_by_player _ & _ champion + 11xtransition_time_across_10_players = 11x51 + 11x60sec = 561 + 660 = 1221sec = 20,35 minutes (environ)
VOIR L'AMÉLIORATION de 101 min à 20,35 min ( MEILLEURE APPROCHE )
3) PARALLÈLE - disons que les organisateurs obtiennent des fonds supplémentaires et ont donc décidé d'inviter deux joueurs champions professionnels (tous deux également capables) et ont divisé l'ensemble des 10 mêmes joueurs (challengers) en deux groupes de 5 chacun et les ont attribués à deux champions, c'est-à-dire un groupe chacun. Maintenant, l'événement progresse en parallèle dans ces deux sets, c'est-à-dire qu'au moins deux joueurs (un dans chaque groupe) jouent contre les deux joueurs professionnels de leur groupe respectif.
Cependant, au sein du groupe, le joueur professionnel doit prendre un joueur à la fois (c'est-à-dire de manière séquentielle), donc sans aucun calcul, vous pouvez facilement déduire que tout l'événement se terminera approximativement en 101/2 = 50,5 minutes pour terminer.
VOIR L'AMÉLIORATION de 101 min à 50,5 min ( BONNE APPROCHE )
4) CONCURRENT + PARALLÈLE - Dans le scénario ci-dessus, disons que les deux joueurs champions joueront simultanément (lire le 2e point) avec les 5 joueurs de leurs groupes respectifs, alors maintenant les matchs entre les groupes se déroulent en parallèle mais au sein du groupe, ils se déroulent simultanément.
Ainsi, les jeux dans un groupe se termineront approximativement en 11xtime_per_turn_by_player _ & _ champion + 11xtransition_time_across_5_players = 11x51 + 11x30 = 600 + 330 = 930sec = 15,5 minutes (environ)
Ainsi, l'ensemble de l'événement (impliquant deux de ces groupes de course parallèle) se terminera approximativement en 15,5 minutes.
VOIR L'AMÉLIORATION de 101 min à 15,5 min ( MEILLEURE APPROCHE )
REMARQUE: dans le scénario ci-dessus, si vous remplacez 10 joueurs avec 10 tâches similaires et deux joueurs professionnels avec deux cœurs de processeur, l'ordre suivant restera vrai:
SÉRIE> PARALLÈLE> CONCURRENT> CONCURRENT + PARALLÈLE
(REMARQUE: cet ordre peut changer pour d'autres scénarios car cet ordre dépend fortement de l'interdépendance des travaux, des besoins de communication des travaux noir et blanc et des frais généraux de transition des travaux noir et blanc)
Exemple simple:
Simultanément: "Deux files d'attente accédant à un guichet automatique"
Parallèle: "Deux files d'attente et deux distributeurs automatiques de billets"
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 simultanéité.
Vous êtes maintenant programmeur professionnel. Et vous aimez écouter de la musique calme tout en codant. Voilà le parallélisme.
Comme l'a dit Andrew Gerrand dans GoLang Blog
La concurrence consiste à gérer beaucoup de choses à la fois. Le parallélisme consiste à faire beaucoup de choses à la fois.
Prendre plaisir.
Ils résolvent différents problèmes. La simultanéité résout le problème d'avoir des ressources CPU rares 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 du 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 séparées correctement) et de les répartir sur de nombreuses ressources CPU. Le parallélisme a toujours existé, bien sûr, mais il vient au premier plan parce que les processeurs multicœurs sont très bon marché.
concordance: plusieurs flux d'exécution avec possibilité de partager les ressources
Ex: deux threads en compétition pour un port d'E / S.
paralélisme: diviser un problème en plusieurs morceaux similaires.
Ex: analyser un gros fichier en exécutant deux processus sur chaque moitié du fichier.
L'exécution de la programmation simultanée a 2 types: la programmation simultanée non parallèle et la programmation simultanée parallèle (également appelée parallélisme).
La principale différence est qu'à l'œil humain, les threads en simultanéité non parallèle semblent s'exécuter en même temps, mais en réalité ils ne le font pas. Dans les threads simultanés non parallèles, les commutateurs changent et se relaient rapidement pour utiliser le processeur via le découpage temporel. Alors que dans le parallélisme, plusieurs processeurs sont disponibles, de sorte que plusieurs threads peuvent s'exécuter sur différents processeurs en même temps.
Référence: Introduction à la concurrence dans les langages de programmation
Le parallélisme est l'exécution simultanée de processus sur un multiple cores per CPU
ou multiple CPUs (on a single motherboard)
.
La simultanéité est lorsque le parallélisme est réalisé sur un single core/CPU
en utilisant des algorithmes de planification qui divisent le temps du processeur (tranche de temps). Les processus sont entrelacés .
Unités:
- 1 ou plusieurs cœurs dans un seul processeur (à peu près tous les processeurs modernes)
- 1 ou plusieurs processeurs sur une carte mère (pensez aux serveurs old school)
- 1 application est 1 programme (pensez au navigateur Chrome)
- 1 programme peut avoir 1 ou plusieurs processus (pensez que chaque onglet du navigateur Chrome est un processus)
- 1 processus peut avoir 1 ou plusieurs fils d'un programme (onglet Chrome lisant la vidéo Youtube en 1 fil, un autre fil engendré pour la section commentaires, un autre pour les informations de connexion des utilisateurs)
- Ainsi, 1 programme peut avoir 1 ou plusieurs threads d'exécution
- 1 processus est
thread(s)+allocated memory resources by OS
(tas, registres, pile, mémoire de classe)
Accès simultané => Lorsque plusieurs tâches sont effectuées sur des périodes de temps qui se chevauchent avec des ressources partagées (maximisant potentiellement l'utilisation des ressources).
Parallèle => quand une tâche unique est divisée en plusieurs sous-tâches indépendantes simples qui peuvent être exécutées simultanément.
Considérez-le comme un service de files d'attente où le serveur ne peut servir que le premier travail dans une file d'attente.
1 serveur, 1 file d'attente de travaux (avec 5 travaux) -> pas de simultanéité, pas de parallélisme (un seul travail est en cours de maintenance jusqu'à la fin, le prochain travail de la file d'attente doit attendre que le travail traité soit terminé et il n'y a pas d'autre serveur à le service)
1 serveur, 2 files d'attente différentes ou plus (avec 5 travaux par file d'attente) -> simultanéité (puisque le serveur partage le temps avec tous les premiers travaux dans les files d'attente, de manière égale ou pondérée), toujours pas de parallélisme car à tout instant, il y en a un et seulement travail en cours d'entretien.
2 serveurs ou plus, une file d'attente -> parallélisme (2 travaux effectués au même instant) mais pas de simultanéité (le serveur ne partage pas le temps, le 3ème travail doit attendre jusqu'à ce que l'un des serveurs se termine.)
2 serveurs ou plus, 2 files d'attente différentes ou plus -> concurrence et parallélisme
En d'autres termes, la simultanéité est le partage du temps pour terminer un travail, il PEUT prendre le même temps pour terminer son travail mais au moins il commence tôt. Ce qui est important, c'est que les travaux peuvent être découpés en petits travaux, ce qui permet l'entrelacement.
Le parallélisme est atteint 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 atteint, mais c'est là que la concurrence aurait sa meilleure utilisation pratique, en prenant un autre travail qui n'a pas besoin de cette ressource.
Je vais offrir une réponse qui entre un peu en conflit avec certaines des réponses 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 en même temps physique. La raison d'être du parallélisme est d'accélérer les logiciels qui peuvent bénéficier de plusieurs ressources de calcul physiques. L'autre concept majeur qui correspond à la concurrence est l'interactivité. 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 créer des logiciels qui répondent aux entités du monde réel comme les utilisateurs, les homologues du réseau, les périphériques matériels, etc.
Le parallélisme et l'interactivité sont une dimension presque entièrement indépendante de la concurrence. Pour un projet particulier, les développeurs peuvent se soucier de l'un ou l'autre, ou des deux. Ils ont tendance à se confondre, notamment parce que l'abomination qu'est le thread 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), à des échelles moyennes (par exemple les processeurs multicœurs) et à de grandes échelles (par exemple les grappes de calcul haute performance). La pression sur les développeurs de logiciels pour qu'ils exposent davantage le 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 la mesure dans laquelle le parallélisme peut être atteint; deux tâches ne peuvent pas être exécutées en parallèle si l'une dépend de l'autre (Ignorer la spéculation).
Il existe de nombreux modèles et frameworks que les programmeurs utilisent pour exprimer le parallélisme: pipelines, pools de tâches, opérations d'agrégation 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 de faire de l'interactivité est avec les événements (c'est-à-dire une boucle d'événements et les gestionnaires / rappels). Pour les tâches simples, les événements sont formidables. Essayer de faire des tâches plus complexes avec des événements entre dans l'extraction de la pile (alias enfer de rappel; alias inversion de contrôle). Lorsque vous en avez assez des événements, vous pouvez essayer des choses plus exotiques comme les générateurs, les coroutines (aka Async / Await) ou les threads coopératifs.
Pour l'amour d'un logiciel fiable, veuillez ne pas utiliser de threads si vous recherchez l'interactivité.
Curiosité
Je n'aime pas le slogan de Rob Pike «ce n'est pas du parallélisme, c'est mieux». La concurrence n'est ni meilleure ni pire que le parallélisme. La concurrence comprend l'interactivité qui ne peut pas être comparée d'une manière meilleure / pire avec le parallélisme. C'est comme dire "le flux de contrôle est meilleur que les données".
En électronique série et parallèle 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 dynamiques liés au temps , nous utilisons les termes séquentiel et concurrent . 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 concordent donc avec le résultat réel d'une certaine action. Si beaucoup de gens 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 distribué temporellement (c'est- à- dire de manière séquentielle ) le long de la même ligne de communication (par exemple, un fil). Dans un adaptateur parallèle , celui-ci est également divisé sur des lignes de communication parallèles (par exemple, de nombreux fils), puis reconstruit à l'extrémité de réception.
Imaginons un jeu avec 9 enfants. Si nous les éliminons sous forme de chaîne, donnons un message au début et le recevons à la fin, nous aurions une communication série. D'autres 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 > ....
Il s'agit d'un processus séquentiel reproduit sur une infrastructure série .
Maintenant, imaginons de diviser les enfants en groupes de 3. Nous divisons la phrase en trois parties, donnons la première à l'enfant de la ligne à notre gauche, la seconde à 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 > ....
Il s'agit d'un processus séquentiel reproduit sur une infrastructure parallèle (encore partiellement sérialisée).
Dans les deux cas, en supposant une parfaite communication 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 savons pas quel processus sera pris en compte par l'infrastructure, le résultat final n'est donc pas déterminé à l'avance.
La concurrence est la forme généralisée de parallélisme. Par exemple, un programme parallèle peut également être appelé simultané mais l'inverse n'est pas vrai.
L'exécution simultanée est possible sur un seul processeur (plusieurs threads, gérés par le planificateur ou le pool de threads)
L'exécution parallèle n'est pas possible sur un seul processeur mais sur plusieurs processeurs. (Un processus par processeur)
Le calcul distribué est également un sujet connexe et il peut également être appelé calcul simultané, mais l'inverse n'est pas vrai, comme le parallélisme.
Pour plus de détails, lisez ce document de recherche Concepts of Concurrent Programming
J'ai vraiment aimé cette représentation graphique d'une autre réponse - je pense qu'elle répond à la question beaucoup mieux que la plupart des réponses ci-dessus
Parallélisme vs concurrence Lorsque deux threads s'exécutent en parallèle, ils s'exécutent tous les deux en même temps. Par exemple, si nous avons deux threads, A et B, leur exécution parallèle ressemblerait à 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 spécial de concurrence
Source: Une autre réponse ici
J'espère que cela pourra aider.
J'aime vraiment la réponse de Paul Butcher à cette question (il est l'auteur de Seven Concurrency Models in Seven Weeks ):
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 presque simultanés) . Le parallélisme, en revanche, est un aspect du domaine de la solution: vous voulez accélérer l'exécution de votre programme en traitant différentes parties du problème en parallèle. Certaines approches sont applicables à la concurrence, certaines au parallélisme et d'autres aux deux. Comprenez à quoi vous êtes confronté et choisissez le bon outil pour le travail.
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 également être exécutées en "ticks"). Ce qui est important, c'est que la simultanéité se réfère toujours à faire un morceau d'une plus grande tâche . Donc, fondamentalement, cela fait partie de certains calculs. Vous devez être intelligent sur ce que vous pouvez faire simultanément et ce qu'il ne faut pas faire et comment synchroniser.
Le parallélisme signifie que vous faites juste des choses simultanément. Ils n'ont pas besoin de participer à la résolution d'un problème. Vos discussions peuvent, par exemple, résoudre un seul problème chacune. Bien sûr, la synchronisation s'applique également mais sous un angle différent.
"Concurrence", c'est quand il y a plusieurs choses en cours .
Le "parallélisme", c'est quand des choses concurrentes progressent en même temps .
Exemples de simultanéité sans parallélisme:
SqlDataReader
s sur un MARS connexion .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 point de vue (effets observables de) l'exécution de votre code. Mais il existe un parallélisme au niveau de l'instruction, même au sein d'un même noyau. Il y a des morceaux de matériel qui font des choses en parallèle avec le CPU puis interrompent le CPU quand c'est fait. Le GPU peut dessiner à l'écran pendant l' exécution de la procédure de fenêtre ou du gestionnaire d'événements. Le SGBD peut traverser les arbres B pour la prochaine requête pendant que vous récupérez 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()
exécution de votre. Etc...
Alors voilà. Le monde est aussi en désordre que toujours;)
À mon avis, la façon la plus simple et la plus élégante de comprendre les deux est la suivante. La concurrence permet l'entrelacement de l'exécution et peut ainsi donner l' illusion du parallélisme. Cela signifie qu'un système simultané peut exécuter votre vidéo Youtube à côté de vous en écrivant un document dans Word, par exemple. Le système d'exploitation sous-jacent, étant un système simultané, permet à ces tâches d'entrelacer leur exécution. Parce que les ordinateurs exécutent les instructions si rapidement, cela donne l'impression de faire deux choses à la fois.
Le parallélisme, c'est quand de telles choses sont vraiment en parallèle. Dans l'exemple ci-dessus, vous pouvez trouver que le code de traitement vidéo est 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 potentiellement de se faire en parallèle.
Pourquoi ne pas tout faire parallèlement alors? L'une des raisons est que la concurrence est un moyen de structurer les programmes et est 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. Un autre est que certaines choses ne peuvent fondamentalement pas se faire en parallèle. Un exemple de cela serait d'ajouter deux choses à l'arrière d'une file d'attente - vous ne pouvez pas insérer les deux en même temps. Quelque chose doit passer en premier et l'autre derrière, sinon vous gâchez la file d'attente. Bien que nous puissions entrelacer une telle exécution (et ainsi nous obtenons une file d'attente simultanée), vous ne pouvez pas l'avoir en parallèle.
J'espère que cela t'aides!
La programmation simultanée concerne les opérations qui semblent se chevaucher et se préoccupe principalement de la complexité qui résulte du flux de contrôle non déterministe. Les coûts quantitatifs associés aux programmes simultanés sont généralement à la fois le débit et la latence. Les programmes simultanés sont souvent liés aux E / S mais pas toujours, par exemple les récupérateurs de mémoire concurrents sont entièrement sur le processeur. L'exemple pédagogique d'un programme simultané est un robot d'exploration Web. Ce programme lance des demandes de pages Web et accepte les réponses simultanément lorsque les résultats des téléchargements deviennent disponibles, accumulant un ensemble de pages qui ont déjà été visitées. Le flux 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 simultanés. Certaines applications sont fondamentalement simultanées, par exemple les serveurs Web doivent gérer les connexions client simultanément. Erlang est peut-être le langage à venir le plus prometteur pour une programmation hautement concurrente.
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 simultanée sont éludées en rendant le flux 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 ne se poursuit qu'une fois chaque sous-tâche terminée. Cela rend les programmes parallèles beaucoup plus faciles à déboguer. La partie difficile de la programmation parallèle est l'optimisation des performances en ce qui concerne des problèmes tels que la granularité et la communication. Ce dernier est toujours un problème dans le contexte des multicœurs car il y a un coût considérable associé au transfert de données d'un cache à un autre. La multiplication matrice-matrice dense est un exemple pédagogique de programmation parallèle et peut être résolue efficacement en utilisant Straasen ' s algorithme diviser pour mieux régner et attaquer les sous-problèmes en parallèle. Cilk est peut-être le langage le plus prometteur pour la programmation parallèle hautes performances sur les ordinateurs à mémoire partagée (y compris les multicœurs).
Copié de ma réponse: https://stackoverflow.com/a/3982782
Parallélisme: avoir plusieurs threads effectuent des tâches similaires qui sont indépendantes les unes des autres en termes de données et de ressources dont ils ont besoin pour le faire. Par exemple: le robot d'exploration Google peut générer des milliers de threads et chaque thread peut effectuer sa tâche indépendamment.
Concurrence: la concurrence entre en jeu lorsque vous avez partagé des données, partagé des ressources entre les threads. Dans un système transactionnel, cela signifie que vous devez synchroniser la section critique du code en utilisant certaines techniques comme les verrous, les sémaphores, etc.
(Je suis assez surpris qu'une question aussi fondamentale ne soit pas résolue correctement et proprement pendant des années ...)
En bref, la simultanéité et le parallélisme sont des propriétés de l' informatique .
En ce qui concerne la différence, voici l'explication de Robert Harper :
La première chose à comprendre est que le parallélisme n'a rien à voir avec la concurrence . La concurrence concerne la composition non déterministe des programmes (ou de leurs composants). Le parallélisme concerne l' efficacité asymptotique des programmes à comportement déterministe . La concurrence consiste à gérer l'ingérable: les événements arrivent pour des raisons indépendantes de notre volonté, et nous devons y répondre. Un utilisateur clique sur une souris, le gestionnaire de fenêtres doit répondre, même si l'affichage demande de l'attention. De telles situations sont intrinsèquement non déterministes, mais nous employons également pro formale non-déterminisme dans un cadre déterministe en prétendant que les composants signalent les événements dans un ordre arbitraire et que nous devons y répondre au fur et à mesure qu'ils surviennent. La composition non déterministe est une puissante idée de structuration de programme. Le parallélisme, en revanche, concerne les dépendances entre les sous-calculs d'un calcul déterministe. Le résultat ne fait aucun doute, mais il existe de nombreux moyens d'y parvenir, certains plus efficaces que d'autres. Nous souhaitons exploiter ces opportunités à notre avantage.
Ils peuvent être des sortes de propriétés orthogonales dans les programmes. Lisez cet article de blog pour des illustrations supplémentaires. Et celui-ci a discuté un peu plus de la différence des composants dans la programmation , comme les threads.
Notez que le threading ou le multitâche sont toutes des implémentations de calcul à des fins plus concrètes. Ils peuvent être liés au parallélisme et à la concurrence, mais pas de manière essentielle. Ce ne sont donc pas de bonnes entrées pour commencer l'explication.
Un autre point fort: le «temps» (physique) n'a presque rien à voir avec les propriétés discutées ici. Le temps n'est qu'un moyen de mise en œuvre de la mesure pour montrer l'importance des propriétés, mais loin de l'essence. Réfléchissez à deux fois au rôle du «temps» dans la complexité du temps - qui est plus ou moins similaire, même la mesure est souvent plus importante dans ce cas.
"Concurrent", c'est faire des choses - n'importe quoi - en même temps. Ce pourrait être des choses différentes, ou la même chose. Malgré la réponse acceptée, qui fait défaut, il ne s'agit pas de "paraître en même temps". C'est vraiment en même temps. Vous avez besoin de plusieurs cœurs de processeur, soit en utilisant la mémoire partagée au sein d'un hôte, soit la mémoire distribuée sur différents hôtes, pour exécuter du code simultané. Les pipelines de 3 tâches distinctes qui s'exécutent simultanément en sont un exemple: le niveau de tâche 2 doit attendre les unités terminées par le niveau de tâche 1, et le niveau de tâche 3 doit attendre les unités de travail terminées par niveau de tâche 2. Un autre exemple est la concurrence entre 1 producteur et 1 consommateur; ou plusieurs producteurs et 1 consommateur; lecteurs et écrivains; et al.
"Parallèle" fait les mêmes choses en même temps. Il est simultané, mais en plus c'est le même comportement qui se produit en même temps, et le plus souvent sur des données différentes. L'algèbre matricielle peut souvent être parallélisée, car vous exécutez la même opération de manière répétée: par exemple, les sommes de colonne d'une matrice peuvent toutes être calculées en même temps en utilisant le même comportement (somme) mais sur des colonnes différentes. C'est une stratégie courante de partitionner (diviser) les colonnes entre les cœurs de processeur disponibles, afin que vous ayez à peu près la même quantité de travail (nombre de colonnes) gérée par chaque cœur de processeur. Une autre façon de répartir le travail est le sac de tâches où les travailleurs qui terminent leur travail retournent à un gestionnaire qui distribue le travail et obtient plus de travail dynamiquement jusqu'à ce que tout soit fait. L'algorithme de billetterie en est un autre.
Non seulement le code numérique peut être parallélisé. Trop souvent, les fichiers peuvent être traités en parallèle. Dans une application de traitement du langage naturel, pour chacun des millions de fichiers de document, vous devrez peut-être compter le nombre de jetons dans le document. C'est parallèle, car vous comptez les jetons, ce qui est le même comportement, pour chaque fichier.
En d'autres termes, le parallélisme est lorsque le même comportement est exécuté simultanément. Signifie simultanément en même temps, mais pas nécessairement le même comportement. Le parallèle est un type particulier de simultanéité où la même chose se produit en même temps.
Les termes incluent par exemple les instructions atomiques, les sections critiques, l'exclusion mutuelle, l'attente de rotation, les sémaphores, les moniteurs, les barrières, le passage de messages, la réduction de carte, le rythme cardiaque, la sonnerie, les algorithmes de ticketing, les threads, MPI, OpenMP.
Le travail de Gregory Andrews est l'un des meilleurs manuels à ce sujet: la programmation multithread, parallèle et distribuée.
Super, permettez-moi de 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 écoutez. Pour A et B, ils sont parallèles: A: je suis A. B: je suis B.
Mais pour C, son cerveau doit suivre le processus simultané pour écouter A et B, c'est peut-être: je suis IA je suis B.
La simultanéité simple signifie que plusieurs tâches sont en cours d'exécution (pas nécessaire en parallèle). Par exemple, en supposant que nous ayons 3 tâches à tout moment: plus d'une peut être en cours d'exécution ou toutes peuvent être en cours d'exécution en même temps.
Le parallélisme signifie qu'ils fonctionnent littéralement en parallèle. Donc, dans ce cas, les trois doivent être exécutés 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 compatible simultanée peut présenter ou non un "parallélisme" comportemental; cela dépend de l'environnement d'exécution.
Vous ne voulez pas de parallélisme 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 au maximum concurrente afin que le système hôte puisse paralléliser son exécution lorsque cela est possible.
Le langage de programmation Pike's Go illustre cela à l'extrême: ses fonctions sont tous 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 si le système en est capable. Une application avec des centaines voire des milliers de threads est parfaitement banale dans son univers. (Je ne suis pas un expert de Go, c'est juste mon point de vue.)