Pourquoi devrais-je connaître la programmation simultanée?


17

La programmation simultanée est assez difficile pour moi: même regarder une diapositive de base me semble difficile. Cela semble tellement abstrait.

Quels sont les avantages de bien connaître les concepts de programmation simultanée? Cela m'aidera-t-il dans une programmation régulière et séquentielle? Je sais qu'il y a une satisfaction à comprendre comment nos programmes fonctionnent, mais quoi d'autre?


3
Je pense que c'est un peu topicky, mais peut devenir un peu topicky si vous éditez tous les trucs personnels (bien que la programmation simultanée soit assez difficile pour tout le monde ) et demandez les mérites techniques concrets des concepts.
yannis

1
Les avantages devraient être assez évidents. Vous pouvez écrire des programmes qui peuvent tirer parti de toutes les améliorations de performances disponibles grâce à la division du travail offerte par la programmation simultanée. Ce n'est facile pour personne. C'est un concept très difficile aujourd'hui.
Rig

3
Nous ne pouvons pas vous aider à vous motiver à apprendre quelque chose, mais la question générale de savoir pourquoi il faut savoir sur la concurrence est assez sur le sujet.

2
Je connais la programmation simultanée. Je peux dire que la diapositive que vous fournissez n'aide pas à comprendre. Au lieu de cela, allez à une fête avec des philosophes gastronomiques .
mouviciel

1
Détendez-vous, même les plus grands trouvent difficile: informit.com/articles/article.aspx?p=1193856
SK-logic

Réponses:


32

Voici une motivation rapide et facile: Si vous voulez coder quoi que ce soit , mais les plus petits, les plus faibles systèmes, vous serez écrirez du code concurrent.

Vous voulez écrire pour le cloud? Les instances de calcul dans le cloud sont petites. Vous n'en avez pas de gros, vous en avez plein de petits. Soudain, votre petite application Web est une application simultanée. Si vous l'avez bien conçu, vous pouvez simplement ajouter plus de serveurs à mesure que vous gagnez des clients. Sinon, vous devez apprendre comment pendant que votre instance a sa moyenne de charge indexée.

OK, vous voulez écrire des applications de bureau? Tout a un processeur dual-ou-plus-core. Sauf les machines les moins chères. Et les gens avec les machines les moins chères ne vont probablement pas débourser pour votre logiciel cher, n'est-ce pas?

Vous souhaitez peut-être faire du développement mobile? Hé, l'iPhone 4S a un processeur dual-core. Le reste ne sera pas loin derrière.

Jeux vidéo? La Xbox 360 est un système multi-CPU et la PS3 de Sony est essentiellement un système multi-core.

Vous ne pouvez tout simplement pas vous éloigner de la programmation simultanée, sauf si vous travaillez sur de petits problèmes simples.

Mise à jour 2016 : L'itération actuelle du Raspberry Pi à 35 $ est construite autour d'un système quadricœur sur une puce destinée aux téléphones portables. Des progrès spectaculaires dans l'IA ont été réalisés en partie en raison de la disponibilité de cartes graphiques haut de gamme en tant que moteurs de calcul parallèles.


1
Bien que je sois d'accord en principe, dire que cela Everything has a dual-or-more-core-CPU. Except the least expensive machines.semble un peu absurde. Beaucoup de gens ont des machines à cœur unique, non pas parce que c'était bon marché, mais parce qu'ils sont satisfaits de ce qu'ils ont et ne voient pas la nécessité de mettre à niveau. Cela dit, penser en termes de concurrence aidera le programmateur sur un système monocœur ainsi, il est donc pas un effort inutile où vous pouvez supposer le multitâche préemptif, que ce soit ( ce qui est à propos de tous les environnements multitâches la plupart des développeurs entrent en contact avec, ces jours-ci).
un CVn

1
ok - c'est un peu exagéré, mais le nouveau matériel a tendance à être majoritairement multicœur. Je ne vois pas ça disparaître. Donc, si vous êtes un étudiant aujourd'hui en pensant au travail que vous ferez professionnellement à l'avenir, il est sûr de supposer que vous travaillerez sur des systèmes multicœurs.
ObscureRobot

Je me demande si je suis en désaccord avec votre réponse autant que vous seriez en désaccord avec la mienne lol;)

1
D'après ma lecture, il y a un noyau de similitude avec ce que nous disons tous les deux, @ acidzombie24. Je dis qu'un développeur doit savoir comment gérer la concurrence, car elle sera partout. Vous dites que vous n'avez pas besoin d'être bon en programmation simultanée tant que vous ... évitez les pièges des systèmes concurrents :)
ObscureRobot

Je suis d'accord qu'il est très utile de connaître la concurrence, mais vous n'êtes pas d'accord que vous ne pouvez vous en éloigner que pour "de petits problèmes simples". Vous pouvez vous éloigner beaucoup de la concurrence, même dans des systèmes non triviaux, par exemple si vous comptez sur des frameworks et des serveurs d'applications existants. Une fois que l'infrastructure est en place, je peux être un développeur junior qui écrit de nouveaux services pour une application web et ne sait presque RIEN sur la concurrence ou le parallélisme.
Andres F.1

21

De 1970 à environ 2002, les processeurs ont doublé de vitesse tous les 18 mois environ. En tant que programmeur, tout ce que vous aviez à faire était d'attendre et votre programme irait plus vite. Le problème est que vers 2002 les règles ont changé. Maintenant, ils ne font pas de plus gros processeurs rapides, ils font de plus petits processeurs plus lents, mais les mettent en groupes. L'ordinateur sur lequel je travaille a maintenant 4 cœurs et des puces avec jusqu'à 8 cœurs (et 4 threads par cœur) existent. Bientôt, nous aurons des puces avec beaucoup plus de cœurs.

Donc, si vous écrivez un programme qui n'est pas du tout simultané, vous constaterez que vous utilisez 1 cœur ou thread, mais le reste du CPU est assis là à ne rien faire. Donc, si vous avez 16 cœurs, 1 exécutera votre programme et les 15 autres seront assis là!

Le problème avec la concurrence est qu'elle n'est pas déterministe. Cela signifie que vous ne savez pas exactement dans quel ordre les différents threads feront les choses. Traditionnellement, les programmeurs ont essayé de résoudre ce problème en utilisant des verrous et autres. Cela a conduit à BEAUCOUP de douleur. Avoir une forme d'état mutable auquel plus d'un thread peut accéder librement est souvent une formule pour la douleur et les insectes!

Ces derniers temps, la tendance a été de passer à des langages fonctionnels qui contrôlent étroitement l'état mutable. Il existe deux méthodes de base permettant aux langages fonctionnels de gérer la concurrence. La première consiste à utiliser la transmission de messages. Ceci est mieux illustré par Erlang. Dans Erlang, il n'y a en général pas d'état partagé entre les processus. Ils communiquent non pas en partageant la mémoire, mais en passant mes messages. Cela devrait vous sembler logique, car nous le faisons actuellement. Je vous envoie ces informations en vous envoyant un message, pas en vous en souvenant de mon cerveau! En passant au message passant la plupart des bugs de verrouillage disparaissent tout simplement. De plus, les messages peuvent être transmis sur le réseau ainsi que dans un nœud.

L'autre méthode est STM, qui signifie Software Transcriptional Memory, Ceci est présent dans clojure et Haskell (et autres). Dans la mémoire STM est partagée mais les modifications ne peuvent être effectuées que via une transaction. Comme les gens de la base de données ont compris tout cela dans les années 1970, il est assez facile de s'assurer que tout est bien fait.

En fait, j'ai un peu simplifié un peu, Clojure et Haskell peuvent tous deux faire passer des messages, et Erlang peut faire STM.

Clause de non-responsabilité Je suis l'auteur de la programmation des services Web avec Erlang , qui sera disponible en version anticipée dans les prochaines semaines.


1
@Zachary K: existe-t-il des approches qui mélangent les langages fonctionnels avec les langues natives afin que les parties à forte intensité de calcul soient implémentées dans la langue native mais fournissent des interfaces qui peuvent être consommées par un serveur écrit en langage fonctionnel?
rwong

Pas sûr à 100%, mais Clojure et Scala existent sur la JVM, c'est donc par là que je commencerais. Jetez peut-être un œil au framework Akka. Je ne l'ai pas utilisé, mais j'ai écouté un discours sur Akka il y a quelque temps et il semble que ce soit plutôt cool. Pour l'instant je fais Erlang et Javascript qui prennent la plupart de mon temps!
Zachary K

1
@rwong: .NET permet aux programmeurs d'utiliser C # ou d'autres langages non fonctionnels pour certaines parties de leurs applications et F #, un langage fonctionnel, pour d'autres.
Kevin

5

Parce que la simultanéité peut exploser dans votre visage quand vous vous y attendez le moins ...


4
+10000000000000000000000000000000000000000

8
La concurrence est la nouvelle Inquisition espagnole [/ python] [comme dans: personne ne s'y attend ...]
ObscureRobot

1
@ObscureRobot deux fois plus drôle! (l'explication n'était pas nécessaire :-p)
fortran

4

La première règle de programmation simultanée est "C'est difficile". La deuxième règle de la programmation simultanée est "C'est. Est. Difficile" .. !!

Plus sérieusement cependant, il existe deux approches communes pour la programmation simultanée, le multithread et le multitraitement. Le multi-traitement est le plus facile à comprendre car cela signifie simplement que plusieurs instances d'un processus s'exécutent pour accomplir une tâche. Le est assez facile à faire sur les systèmes basés sur Unix via des appels à fork / join, mais pas si facile sur les systèmes Windows.

Le multi-threading est probablement l'approche à laquelle la plupart des gens pensent lorsqu'ils parlent de simultanéité. Il n'est pas difficile de démarrer plusieurs threads dans une application, mais le diable est dans les détails. Vous devez coordonner le partage de données entre les threads (généralement à l'aide de verrous), ce qui peut entraîner un blocage ou des données dans un état non valide. Vous devez également comprendre comment communiquer entre les threads à l'aide de concepts tels que les sémaphores, les variables conditionnelles, etc., etc.

L'avantage de tout cela est qu'une fois que vous le comprenez, vous pouvez utiliser plus efficacement le matériel sous-jacent. De nos jours, c'est à peu près la norme pour un processeur d'avoir plusieurs cœurs. En utilisant la programmation simultanée, vous pouvez faire fonctionner ces cœurs pour vous, et votre application obtiendra une amélioration de la vitesse.

L'inconvénient est que vous devez commencer à réfléchir à la façon dont vous allez diviser votre application en petites parties qui peuvent être exécutées sur différents threads. C'est beaucoup plus difficile qu'il n'y paraît. De plus, les solutions hautement concurrentes peuvent être difficiles à tester unitaire car l'ordre d'exécution est moins déterministe.

De nos jours, la plupart des langues sont livrées avec une abstraction sur la plupart des primitives simultanées pour vous faciliter la vie. Par exemple, .NET 4 est livré avec la bibliothèque parallèle de tâches, ce qui facilite un peu la vie. En Java, ils ont le package Concurrency .


1
Il obtient des ordres de grandeur si vous fuyez les écluses le plus rapidement possible. Utilisez STM ou des acteurs et tout ce que vous avez dit disparaît. Bien sûr, cela signifie passer de Java à des langages comme Scala, Erlang ou Clojure. (même si je dirais que c'est aussi une bonne chose)
Zachary K

@Zachary: C'est peut-être une bonne chose, mais si vous travaillez dans une boutique .NET, par exemple, ce n'est pas pratique. La STM pourrait être une option à l'avenir, mais pour l'instant ce n'est pas une option dans les langues traditionnelles.
Sean

Clojure fonctionne sur .net, et il y a F #. Je parierais qu'il existe également des implémentations STM pour C #.
Zachary K

3

J'ai récemment eu une tâche très intéressante à accomplir dans laquelle le multitraitement m'a sauvé. J'ai essentiellement dû faire beaucoup de demandes à quelques serveurs distincts, traitant de très petites quantités de données, mais de nombreuses demandes.

En travaillant avec PHP, j'ai fait les choses à l'ancienne, et le meilleur temps que j'ai obtenu après quelques heures de travail a abouti à environ 120 secondes pour exécuter un certain test (beaucoup de demandes + délai réseau + pas d'async)

Mais ce n'était pas suffisant par rapport à ce dont j'avais besoin, et après avoir échoué lamentablement avec le multitraitement PHP, je suis passé à Python.

Après quelques heures, j'ai eu un script de multi-traitement Python en cours d'exécution qui a fonctionné en 20 secondes, et après un peu de bidouiller avec les délais d'attente et non. de threads à utiliser, je l'ai réduit à ~ 10 secondes .

Il s'agissait d'un site Web écrit à 100% en PHP, à l'exception d'un seul script Python de 100 lignes. Et le tout fonctionne parfaitement.

Ma conclusion serait que même si cela ne vous aide pas au jour le jour, vous pouvez rencontrer des situations où connaître au moins les bases de la programmation simultanée vous aidera grandement.

Bonne chance et bon codage!

PS: Je n'essaie pas de bash PHP, mais PHP n'était tout simplement pas le bon outil pour le travail à accomplir.

PS2: Connaître une nouvelle technologie ou une nouvelle façon de faire peut ouvrir la porte à un tout nouveau monde de possibilités.


2

Si vous effectuez n'importe quel type de développement Web, la concurrence entre en jeu, au moins avec la plupart des langues. Par exemple, j'utilise spring pour le développement web et chaque nouvelle requête arrive comme son propre thread. Par conséquent, si une requête finit par accéder à un objet partagé, où l'état peut être modifié d'une variable, la concurrence est un facteur très important et doit être prise en considération. Si ce n'est pas le cas, les données peuvent être modifiées de manière imprévisible et une corruption des données peut en résulter. Il n'est pas essentiel de connaître tous les détails de la concurrence, mais l'apprentissage des éléments à la fois est important pour mieux comprendre la programmation des applications Web.Si vous travaillez sur des applications de bureau, ce n'est peut-être pas si important, sauf si vous devez exécuter plusieurs threads.


-1

Apprenez à mieux comprendre les systèmes d'exploitation. La lecture du code source des planificateurs et des pilotes de périphériques vous aidera; ils sont définitivement concurrents.


2
La concurrence pour les programmeurs va généralement pour vos propres programmes exécutés dans plusieurs instances.

J'ai essayé de souligner que vous ne pouvez pas écrire votre propre programme simultané de toute façon sans connaître les détails de l'algorithme de planification du noyau du système d'exploitation.
jj1bdx

Pourquoi pas? Si vous utilisez correctement les mécanismes de verrouillage, l'algorithme de planification du système d'exploitation n'a pas d'importance.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.