Lorsqu'on examine la programmation simultanée, deux termes sont couramment utilisés, à savoir simultané et parallèle.
Et certains langages de programmation réclament spécifiquement le support de la programmation parallèle, tels que Java .
Cela signifie-t-il que la programmation parallèle et la programmation simultanée sont réellement différentes?
Réponses:
Extrait de "Une sophomorique ∗ Introduction au parallélisme et à la concomitance de la mémoire partagée" de Dan Grossman (version du 16 novembre 2013)
la source
En plus de la réponse de Nish, permettez-moi de recommander le livre de Simon Marlow sur la programmation parallèle et simultanée en Haskell ou son tutoriel plus court . Ils répondent à votre première question du point de vue de Haskell, de sorte qu'ils conviendraient mieux aux lecteurs théoriquement enclins (Haskell est un langage de programmation purement fonctionnel et paresseux, beaucoup plus proche des mathématiques que d'autres langages).
Citant à partir de là:
Je recommande de lire la suite du didacticiel (p.4), mais permettez-moi de citer une partie du reste de cette section, car elle relie les paradigmes de programmation aux caractéristiques quantitatives et qualitatives des programmes, telles que l'efficacité, la modularité et le déterminisme.
la source
La simultanéité et le parallélisme diffèrent par les problèmes qu’ils résolvent et posent, mais ils ne sont pas indépendants.
Simultanéité
L'exécution simultanée de deux tâches signifie que les étapes individuelles des deux tâches sont exécutées de manière entrelacée. Si vous ne tenez pas compte du parallélisme, vous pouvez supposer qu’une seule instruction est exécutée à un moment donné, mais vous n’aurez (a priori) aucune garantie quant à la tâche qui exécutera l’étape suivante.
Ceci est utile à certains égards:
Certains des principaux défis sont:
Parallélisme
L'exécution de deux tâches en parallèle signifie que les instructions sont exécutées en même temps . Ceci est principalement utile pour:
Les principaux défis incluent:
Voir aussi cette question pour distinguer l'informatique parallèle et l'informatique distribuée.
la source
Une réponse légèrement idéalisée, peut-être ...
La simultanéité est une propriété de la façon dont un programme est écrit . Si un programme est écrit à l'aide de constructions telles que des forks / join, des verrous, des transactions, des opérations de comparaison et d'échange atomiques, etc., il est simultané.
Le parallélisme est une propriété de la façon dont un programme s'exécute . Si un programme s'exécute sur plusieurs unités de calcul simultanément, il s'exécute en parallèle.
la source
Il existe une foule de réponses à ce sujet, mais cela peut être déroutant. J'aime penser de cette façon, et peut-être que ça aide ?:
La programmation concurrente est un code qui ne se soucie pas de l'ordre d'exécution. Java est un langage médiocre pour la programmation simultanée, mais il existe des bibliothèques et des frameworks pour vous aider. JavaScript est un excellent langage pour la programmation concurrente, et il est souvent difficile de vouloir écrire quelque chose qui n’est pas simultané (par exemple, si vous voulez forcer l’ordre d’exécution). La programmation simultanée est idéale pour la programmation événementielle (l'ordre d'exécution étant déterminé par les écouteurs d'événements, comme le code exécuté dans votre navigateur qui agit lorsque vous cliquez sur un bouton ou tapez dans une zone).
Un exemple pourrait inclure la création d'une centaine de requêtes HTTP. Dans NodeJS, la solution la plus simple consiste à ouvrir toutes les 100 demandes en même temps avec une méthode de rappel. Lorsque les réponses sont renvoyées, une méthode est exécutée à chaque fois. C'est la programmation concurrente. Dans Ruby, la solution la plus simple (la plus courante) consiste à ouvrir une demande et à gérer la réponse, à ouvrir la demande suivante et à gérer la réponse, etc. Pour de nombreuses demandes, NodeJS est plus facile à effectuer de Veillez à éviter de taper sur le serveur ou de maximiser vos connexions sortantes (facile à faire par erreur). Vous pouvez écrire le Ruby de manière concurrente, mais ce n'est pas la façon dont la plupart du code Ruby est écrit, et cela fait un peu mal de le faire.
Programmation parallèleCe code peut être exécuté simultanément dans plusieurs threads ou processus. Cela vous permet d'optimiser les performances en exécutant le code sur plusieurs processeurs (y compris souvent plusieurs machines, comme avec Akka). Parce que NodeJS n'est pas multi-thread et qu'il n'y a pas d'exécution parallèle, vous n'avez pas à vous soucier d'écrire du code threadsafe (et la plupart du code JavaScript que j'ai vu n'est pas threadsafe). En Java, même si le langage ne fait pas de la programmation simultanée le modèle normal, la programmation parallèle est très intégrée et vous devez souvent vous soucier de la sécurité des threads. Si vous écrivez un site Web en Java, celui-ci sera généralement exécuté dans un conteneur qui exécute chaque demande dans un thread distinct de la même mémoire.
Certains des éléments ci-dessus dépendent de la portée et des limites dont vous parlez. Je travaille sur des sites Web. La plupart du code Java que je vois n'est pas une programmation concurrente. Bien sûr, si vous effectuez un zoom arrière suffisant, l'ordre dans lequel les demandes du client sont entrées n'a pas d'importance, mais si vous effectuez un zoom avant, l'ordre d'exécution des tâches est dicté par le code. Mais le code est écrit pour que les requêtes puissent s'exécuter en parallèle avec de nombreux objets partagés devant être thread-safe.
Entre-temps, la plupart du code JavaScript que je vois est concurrent: il est écrit de manière à ce que l'ordre d'exécution soit sans importance à plusieurs niveaux. Mais il n'est pas écrit pour prendre en charge l'exécution parallèle dans la mémoire partagée. Bien sûr, vous pouvez exécuter le même code en parallèle sur plusieurs processus, mais les objets ne sont pas partagés. Il ne s'agit donc pas d'une programmation parallèle significative.
Pour des lectures supplémentaires, j'aime beaucoup les illustrations dans la réponse du haut à cette question ici: https://www.quora.com/What-are-the-differences-between-parallel-concurrent-and-asynchronous-programming
la source