Question

Récemment, je me suis trouvé dans l'obligation de rédiger certaines préoccupations relatives aux conditions de concurrence dans une application en développement (et non par moi). Ceci sera probablement porté à l'attention d'intervenants non techniques avec lesquels je n'ai pas de lien de communication direct. Mon explication doit donc être écrite.

J'ai déjà tenté cette rédaction. Je passe le plus clair possible des détails techniques, donne un exemple de la situation de concurrence dans l'application et décris son impact. Je pense que je me suis bien débrouillé, mais c'est loin d'être parfait.

Le problème est que, même si j'essaie de protéger le lecteur de l'informatique, il m'est toujours difficile d'éliminer des expressions telles que "threads d'exécution". et " exclusion mutuelle " sans perdre la justesse et la substance. Le risque est que, avec trop d'agitation de la main, ces préoccupations pourraient être considérées comme un boogeyman inventé.

Quoi qu'il en soit, ma question est la suivante: Comment expliqueriez-vous les conditions de compétition à un public non technique? Oseriez-vous expliquer la planification de la CPU? Invoqueriez-vous les philosophes du repas ?

Vous n'êtes pas obligé de travailler dans les limites de ma situation (mais ce serait extrêmement utile si vous le faisiez).

Était-ce utile?

La solution

La société X a 1 000 $ à la banque. X paie un loyer de 2 000 dollars et a reçu un paiement de 10 000 dollars pour des services rendus à la société Y. Toutefois, en raison d’une situation de concurrence impérieuse, X est en déficit de 1 000 dollars et fait maintenant une demande de faillite. = (

Vous voudrez peut-être expliquer comment la banque gère le compte de la société X de la manière suivante: Le personnel de la banque A prend la valeur actuelle de 1 000 USD et y ajoute 10 000 USD. Le personnel de la banque B prend la valeur actuelle de 1 000 dollars et en soustrait 2 000 dollars. Le personnel de la banque A met la valeur à 11 000 dollars. Le personnel de la banque B met la valeur à -1 000 dollars.

Autres conseils

Je pense que les transactions bancaires pourraient être un bon exemple, à la fois parce qu'il est facile de voir qu'un résultat incorrect est mauvais et parce que les conditions de concurrence sont faciles à créer dans un tel environnement.

J'ai 500 $ sur mon compte. Quelqu'un me transfère 200 dollars en même temps que je retire 50 dollars.

Maintenant, si la banque ne gère pas correctement les conditions de concurrence, elle procédera comme suit (en supposant que les transactions soient traitées manuellement, bien sûr) Le greffier A verra la demande d’ajouter 200 $ à mon solde et notera que mon solde est actuellement de 500 $. Le greffier B verra la demande de soustraire 50 dollars de mon solde et notera que mon solde est actuellement de 500 dollars (le greffier A n’a pas encore transféré l’argent).

Le commis A termine les documents et fixe le solde de mon compte à 700 $ (500 + les 200 qu'il était censé ajouter). Et puis, une minute plus tard (parce que le commis B avait juste à prendre une tasse de café), le commis B finissait l’autre transaction et fixait mon solde à 450 $ (les 500 que j’avais lorsqu’il a vérifié, moins les 50 qu’il était censé soustraire ).

Mon solde est maintenant de 450 dollars, alors qu'il aurait dû être 650 dollars, à cause d'une situation de concurrence critique. Le résultat dépend de l'ordre dans lequel différentes parties des deux transactions ont été effectuées.

C’est la description générale de la gravité des conditions de course. Supposons maintenant que notre application traite deux tâches distinctes en même temps (ce sont vos "threads d'exécution") et, comme ci-dessus, elles lisent toutes les deux une valeur, modifient la valeur qu'elles elles lisez, puis écrivez-le. Une des modifications peut alors être perdue si cela se produit dans l'ordre indiqué ci-dessus. Cela devrait être lié aux problèmes spécifiques de votre application.

Je choisirais une approche digne d'un philosophe de la salle à manger, mais en fonction de mon public, j'essaierais de l'analoguer au contexte de mon public. Parlez-vous à des dirigeants d'entreprise? Puis assimilez cela à quelque chose comme allouer une salle de réunion ou une voiture de société ou réserver une chambre d'hôtel ou autre. Parlez-vous à des gens ordinaires? L’exemple du philosophe de la salle à manger est bon, ou vous pouvez imaginer une situation similaire consistant à s’occuper d’animaux de la ferme ou à s’asseoir sur des chaises ou autre.

Que vous détourniez l’exemple du philosophe des restaurants ou inventiez le vôtre, utilisez certainement une métaphore.

Si vous écrivez à un public non technique, vous voudrez simplifier vos explications et les relier à quelque chose qu’ils peuvent comprendre. Une explication tirée de l'article Analogies pour l'enseignement de l'informatique parallèle à des programmeurs inexpérimentés ( http: // portal .acm.org / citation.cfm? doid = 1189136.1189172 ) l’explique en termes de jeu de plume:

  

Nous allons jouer à un jeu appelé le   Jeu de stylo. Les règles sont simples: je & # 8217; m   va tenir un stylo dans ma main, et   ensuite, je dirai & # 8220; Un, deux, trois, allez-y. & # 8221;   Quand je dis & # 8220; aller, & # 8221; prendre le stylo de mon   main. Celui qui obtient le stylo gagne.   Prêt? Un, deux, trois, allez-y.

Vous demandez ensuite si le résultat de ce jeu peut être prédit à l’avance. Si cela ne peut être prédit, pouvons-nous garantir un résultat correct? Cela devrait permettre de réaliser qu'il est possible d'obtenir des résultats incorrects pour des écritures simultanées sur le même morceau de mémoire.

J'allais recommander les philosophes de la restauration, mais je vois que vous l'avez déjà trouvée. Alors, au lieu de cela, que diriez-vous d'utiliser une impasse comme une analogie?

Imaginez une circulation normale le long des quatre rues adjacentes à un pâté de maisons unique (North Avenue, South Avenue, East Street et West Street). Lorsqu'il n'y a qu'une ou deux voitures sur la route, tout se passe bien. Lorsque la circulation est régulière, certaines voitures devront s’arrêter et attendre que d’autres voitures passent, mais c’est un problème qui peut être résolu. Une voiture s’arrête pour attendre qu’une autre voiture passe devant, puis continue son chemin joyeux.

Imaginez maintenant le trafic aux heures de pointe au même endroit. Supposons qu'une voiture conduisant vers le sud sur la rue West ne puisse pas traverser l'intersection au coin nord-ouest de notre pâté de maisons. Cette voiture bloque maintenant tout le trafic transversal en direction ouest sur l'avenue du Nord. Il ne faut pas longtemps avant qu'une voiture en direction ouest tente de traverser l'intersection du coin Nord-Est et reste bloquée, bloquant ainsi tout le trafic en direction du nord sur la rue East. Quand cette situation fait le tour des quatre intersections, aucune voiture ne peut bouger! Chacun attend que les voitures devant lui aillent de l'avant, mais il n'y a aucun moyen de se libérer du blocage du trafic sans tirer les voitures en arrière.

La comparaison avec l'informatique devrait être simple. Les voitures sont des threads ou des processus, les rues et avenues sont des processeurs, des tampons ou des noyaux. Le concept de blocage peut être décrit à l'aide de feux de signalisation ou de panneaux d'arrêt. L'ensemble commence à prendre un sens intuitif, même pour les non-programmeurs.

Écrire un programme:

  1. Attendez le salaire.
  2. Allez au magasin.
  3. Acheter de la nourriture.
  4. Allumez la plaque.
  5. Mettez de la nourriture dans l'assiette.
  6. Conservez votre assiette pendant 20 minutes.
  7. Mangez.
  8. Allez vous coucher.

Maintenant, essayez de faire en sorte que deux threads (vous, sa femme) l'exécutent sans synchronisation.

  • Vous: attendez votre salaire.
  • Femme: rendez-vous au magasin sans argent, crash

  • Vous: Allumez la plaque.

  • Vous: Conservez votre assiette pendant 20 minutes.
  • Vous: Allez vous coucher.

  • Femme: Mangez chez quelqu'un d'autre.

  • Femme: va te coucher.

Peter veut sortir de son allée. Il vérifie que rien ne gêne sa voiture, puis monte à l'intérieur. Son fils Frank se cache alors derrière la voiture. Peter ne peut pas le voir et le renverse.

La chose importante ici est que pour un ordinateur, "inspecter". et " modifier " tendent à être deux actions distinctes, donc un exemple où vous ne pouvez pas vérifier quelque chose lorsque vous le modifiez est bon.

Que diriez-vous de la simple évidence?

Une condition de concurrence critique est littéralement une course entre deux personnes.

Une entreprise mise sur un projet. Deux employés travaillant indépendamment sur des offres les soumettent au client, mais l'un des employés dispose d'informations obsolètes. Aucun des employés ne sait que l'autre est en train de soumettre une offre. Par conséquent, en fonction de celui qui est le plus rapide, la première offre peut être remplacée par l'employé le plus lent. Cela entraînera de la confusion, car l'offre peut avoir changé au fil du temps.

Il doit y avoir une communication entre les deux employés pour travailler ensemble ou en arrêter un.

Une difficulté à expliquer le concept général est que les conditions de concurrence se manifestent dans une grande variété de situations. Si votre objectif est de donner à votre auditoire non technique le sentiment qu'il s'agit d'un type de problème générique, essayez plutôt de donner plusieurs exemples.

Une image vaut 1000 mots. C'est vrai. Si vous dessinez un plan de montage chronologique et placez une entité dessus, et montrez que son état change au fil du temps, vous pouvez démontrer assez facilement une situation de concurrence critique dans un diagramme. Quelques retouches peuvent être nécessaires pour obtenir une image parfaite, mais j’ai toujours trouvé que le faire ressortir me suffisait plus rapidement que de le décrire.

Je pense qu'il est difficile d'expliquer cela d'une manière simple, car il est fondamentalement difficile de penser à la concurrence. L’idée de base d’une transaction financière peut constituer un bon point de départ, car les gens y seront familiarisés avec la réalité.

Dans tout type de transaction, vous devez effectuer des entrées simultanées à deux endroits: les débits et les crédits. Si la transaction est interrompue au milieu par une autre personne tentant d’en effectuer une autre, elle verra le mauvais solde dans l’un ou l’autre des comptes.

La Programmation simultanée structurée avec des applications de système d'exploitation constitue un excellent exemple. ( comme je me souviens)

Dans le pays pauvre du Bezerkistan, deux lignes se rejoignent sur une seule voie dans un tunnel. Il y a eu des collisions et la junte au pouvoir a besoin d'une solution.

Le problème est qu’il est montagneux et que les ingénieurs sont aveugles. Il y a très peu de préavis de deux trains sur le point d'entrer en collision dans le tunnel.

Voici le plan.

  1. Placez un grand bol au moment opportun.

  2. Donnez à chaque ingénieur un petit singe en laiton.

Lorsque vous êtes sur le point d'entrer dans le tunnel, vous arrêtez votre train. Vous fouillez dans le bol pour voir si un singe en laiton est dans le bol.

S'il y a un singe, quelqu'un d'autre utilise le tunnel, vous devez donc attendre que leur train soit entièrement dans le tunnel, puis le chef de train sort du fourgon de queue et saisit le singe du bol.

S'il n'y a pas de singe, personne d'autre n'utilise le tunnel. Vous pouvez donc prendre votre singe dans le compartiment moteur, le placer dans la cuvette et emprunter le tunnel, sachant que vous avez acquis un accès exclusif à la piste. Bien sûr, vous vous arrêtez brièvement pour permettre au chef d’or de récupérer le singe en laiton.

Devinez quoi?

Ils ont toujours des collisions!

Pourquoi? Quelle est la situation ou la séquence d'actions à l'origine de cet échec?

C’est une situation de concurrence critique.

Dans un document écrit, vous pouvez expliquer comment la situation de concurrence critique conduit à un accident.

Dans une présentation, vous pouvez guider le public par des raisonnements sur la concurrence et le verrouillage.

Je voudrais utiliser un exemple de compte de banque de mémoire partagée pour un compte bancaire à mémoire partagée.

expliquez que l'ordinateur fait quelque chose comme: équilibre de charge; ajouter 1; solde du magasin ;. Prenez en compte deux discussions qui modifient le solde de votre compte bancaire (vous et votre femme déposez un dollar en même temps).

si les deux threads sont interrompus après le: balance de charge; et ensuite, vous pouvez perdre un dollar.

voir: http://wasp.cs.washington.edu/atomeclipse/handouts .pdf

Comme vous l'avez mentionné, il est souvent nécessaire d'introduire d'autres concepts (exclusion mutuelle, processus d'exécution) pour décrire avec précision les conditions de concurrence, même dans une métaphore. Alors essayez d’abord de définir ces termes (ou au moins de faire passer l’idée) en utilisant la métaphore.

Comme exemple simple, utilisons une intersection à quatre voies (située dans un pays où vous conduisez à droite). Divisez l'intersection en 4 quadrants: Nord-Ouest, Nord-Est, Sud-Est et Sud-Ouest. Appelez à présent une ressource dans chaque quadrant et appelez un thread d'exécution pour chaque voiture. Ces voitures ne respectent que les systèmes de circulation, et comme il n'y a pas de panneau d'arrêt ni de feux de circulation à cette intersection, les voitures se barrent sans ralentir ni prendre en compte la circulation.

Vous pouvez facilement montrer que l'utilisation simultanée de l'un de ces quadrants par plusieurs voitures est mauvaise et entraîne un accident de voiture. Une solution évidente consiste à installer un système de circulation. Le système garantit que pas plus d'une voiture ne traverse un quadrant en même temps. Il peut le faire de manière complexe, sans engager toutes les ressources. Par exemple, les voitures venant du sud tournent à gauche pour se diriger vers l'ouest (dans les quadrants sud-est et nord-ouest), tandis que les voitures venant de l'ouest tournent à droite pour se diriger vers le sud (utilisant le quadrant sud-ouest). . Le système de circulation assure l'exclusion mutuelle ou empêche l'utilisation simultanée (par plusieurs voitures) d'une ressource commune (le quadrant de la route dans l'intersection).

Cela fournit au moins les idées qui sous-tendent ces définitions, l'idée qu'accéder simultanément aux ressources partagées peut être mauvaise et qu'une exclusion mutuelle peut résoudre ce problème. Une fois que cela est établi, vous devrez les associer à une métaphore plus appropriée pour montrer en quoi consiste une situation de concurrence critique et en quoi il s’agit de l’une des conséquences négatives de l’absence d’exclusion mutuelle pour une ressource commune.

Cela prend un peu plus de temps, mais cela donne une certaine connaissance des termes et une vue d’ensemble avant d’entrer dans une métaphore plus complexe.

Parler d’argent à vos parties prenantes peut les envoyer en mode panique, en particulier si elles supposent perdre de l’argent pour cette raison, ce qui n’est pas tout à fait idéal si le problème ne provoque pas spécifiquement une perte nette de profits. histoire moins axée sur les finances sur la façon dont vous pouvez expliquer une situation de compétition à qui que ce soit.

Cette histoire n'aborde pas le concept d'impasse , mais le scénario et les conséquences plus traditionnels de la condition raciale.

L'HISTOIRE COMMENCE ICI:

Le paramètre: Trois villes sont reliées par un réseau de chemin de fer. Les trains ne portent aucune indication indiquant leur ville d'origine et leur destination, car ils sont utilisés entre les trois villes et que le réseau ferroviaire ne voulait pas se soucier de la difficulté de changer les panneaux temps. Le réseau étant petit, il n’ya pas d’horaire précis pour l’arrivée et le départ des trains. Les surveillants des gares ne reçoivent qu'un appel des surveillants des autres gares de la ville quand un train part, le surveillant note l'heure à laquelle il est parti et, comme tous les trains sont identiques, ils circulent à la même vitesse, de sorte que le surveillant reçoit un appel des autres villes, ils annoncent aux gens de la gare que: "Le prochain train se dirigera vers la ville C". Ainsi, les personnes qui souhaitent se rendre dans la ville C attendent le train, prennent le train et se dirigent joyeusement vers la ville C.

Le problème: Mais un jour, alors qu'un train planifiait son itinéraire de A à B à C, il s'est effondré à mi-chemin entre A et B. Heureusement, les techniciens sont très compétents et être capable de réparer le train en peu de temps. Cependant, le même jour, un autre train prévoyait également un itinéraire différent de C à B à A. Le surveillant de la gare B a reçu un appel de A indiquant qu'un train venait, et peu de temps après, il avait reçu un autre appel de C indiquant qu'un autre train venait également. Le surveillant de la gare a alors annoncé aux passagers en attente dans la gare: "Le premier train arrivant se dirigera vers la gare C et, peu après, le train se dirigera ensuite vers la gare A." Comme les passagers ont rassemblé leurs bagages et se sont rendus à leurs plateformes respectives. Le surveillant a vu un train arriver et a redirigé les rails vers le quai où les gens prévoyaient de se diriger vers la ville C. Ils ne savaient pas que le train se dirigeait réellement vers la ville A. L’autre train, après avoir réglé ses problèmes mécaniques, est également arrivé à la gare et le surveillant l’a dirigé joyeusement vers le quai contenant les passagers souhaitant se rendre à la ville A. Inutile de dire qu’aucun des passagers n’est arrivé à l’endroit prévu, tous le surveillant a supposé qu’ils arriveraient dans l’ordre comme d'habitude.

Le problème des conditions de concurrence et de nombreuses constructions informatiques est que les utilisateurs ne sont pas des ordinateurs. Chaque fois que j'explique un algorithme à mes étudiants, ils disent "mais cela n'a pas de sens de le faire de cette façon", à laquelle je réponds "les ordinateurs n'ont pas de sens commun, ils n'ont que des instructions". Cela dit, vous devriez expliquer une situation de concurrence raciale en tant que race et il est donc tout à fait logique de laisser les gens essayer réellement la course, s'ils le peuvent. De cette façon, ils peuvent voir comment les choses vont mal. Mais ... ils ne sont pas autorisés à faire preuve de bon sens.

Supposons donc que nous avons un jeu où 2 personnes remplissent des piles de blocs de couleurs dans l’ordre suivant: Rouge, Orange, Jaune. Ils ont beaucoup de blocs rouges, oranges et jaunes. Toutes les piles doivent avoir exactement trois blocs de hauteur.

Dans le premier jeu, les deux joueurs essaient de le faire aussi vite que possible, mais ils ne travaillent que sur leurs propres piles.

Dans le deuxième jeu, ils essaient de travailler ensemble en se permettant d’empiler des blocs les uns sur les autres. Cependant, ils ne sont pas autorisés à modifier le bloc qu'ils ont entre les mains et ils doivent placer un bloc planifié.

Vous pouvez imaginer une telle situation dans la pile 1:

player 1 grabs a red block
player 1 places red block         - player 2 grabs an orange block
player 1 grabs an orange block    - player 2 places an orange block
player 1 places an orange block

Nous avons donc maintenant une pile avec deux blocs orange. Il est évident qu'avec un jeu humain, cela ne se produira jamais, car les gens ont du bon sens: ils voient que le bloc orange est déjà placé et reviennent sur leur décision de placer également un bloc orange.

Vous pouvez également leur montrer cette vidéo: https://www.youtube.com/watch? v = TcGwNdbsAbc

Utilisons un tableau blanc pour effectuer une tâche comptable triviale. Nous avons 100 $ en main - écrivez-le sur le tableau blanc.

Alice a des dizaines de factures qui s’élèvent à 100 $. Elle va donc noter que 100 $, ajouter sa liste, revenir dans 5 minutes et écrire 200 $ au tableau.

Bob a été faire des courses. Il va prendre ce nombre sur le tableau blanc et soustraire 50 $ d’achats, puis écrire 50 $ au tableau.

Si Bob revient en premier, nous verrons 200 $ après qu'Alice aura écrit son résultat. Si Alice revient en premier, nous verrons 50 $, ce qui est également faux. Ce que nous voulons voir, c’est 150 dollars, et nous devons ajouter des précautions quelque part pour que cela se produise.

Cela devrait suffire à échafauder une discussion sur les solutions techniques aux intuitions raisonnables.

Par exemple, un mutex signifie que vous verrouillez la porte de la pièce contenant le tableau blanc et que vous leur faites faire leur travail. Une solution optimiste signifie que vous demandez aux deux de vérifier et de recommencer si le nombre a changé pendant leur absence. Si vous voulez parler de blocages, vous pouvez rire de la façon dont Bob a appelé Alice de l'intérieur de la pièce verrouillée pour lui demander de se dépêcher.

Envoyez-les à Condition de concurrence sur Wikipedia.

La première partie aura un sens, et la suite (non illustrée ci-dessous) vous donnera une apparence intelligente, car ils supposeront que vous la comprenez.

"Une condition de concurrence ou un risque de concurrence est une faille dans un système ou un processus dans lequel la sortie et / ou le résultat du processus dépendent de manière inattendue et critique de la séquence ou du moment choisi pour d'autres événements. Le terme trouve son origine dans l’idée que deux signaux se font concurrence pour influencer d’abord la sortie. "

Je pense que l’essentiel, c’est que c’est le plus souvent un problème de synchronisation qui peut être imprévisible, car la synchronisation varie d’un moment à l’autre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top