Qu'est-ce qu'une condition de course?

Contenu

bâton de course

Avez-vous déjà couru une course? Si c'est ainsi, Vous savez que parfois une finition photographique est nécessaire pour sélectionner le gagnant! Mais, Et si deux personnes atteignaient la ligne d'arrivée en même temps? Bienvenue aux conditions de course.

Quels sont Fils d'ordinateur?

Pour expliquer une condition de course, nous devons d'abord comprendre un peu comment les ordinateurs fonctionnent en interne. Lors de l'utilisation d'un système d'exploitation, effectuera diverses actions telles que l'ouverture d'une fenêtre de terminal de commande, ouvrir un navigateur, etc. Chacune de ces actions entraînera une réaction du système d'exploitation pour démarrer une nouvelle procédure informatique / Informaticien.

Un thread est une procédure informatique / ordinateur qui fonctionnera / exécutera les multiples étapes (étapes de programmation, écrit à l'origine au format du code source et régulièrement compilé par un compilateur) nécessaire pour exécuter la tâche que vous avez demandée à partir du système d'exploitation ou du logiciel qui s'exécute dessus. .

En Linux, un tel fil est identifié de manière unique par un PID (Identifiant de la procédure). Pour en savoir plus sur les PID sous Linux, puede leer nuestros publie Bash Automation and Scripting Basics (Partie 3) y Comment fonctionnent les signaux Linux: SIGINT, SIGTERM et SIGKILL.

En Windows, un thread est également identifié de manière unique via un ID de procédure (Réf. PID colonne dans le gestionnaire des tâches de Windows), même si la mise en œuvre de la gestion des processus est différente entre Linux et Windows; code différent derrière, différent PID outils d'interaction, etc. et compatibilité limitée. En même temps, l'ID de procédure Windows PID à ne pas confondre avec l'identifiant du produit PID (même terme, sens différent) O À (Identifiant du fournisseur). Les deux derniers se réfèrent à l'identification de l'appareil et ne sont pas liés à la gestion des processus.

Quand un fil commence, peut lui-même démarrer d'autres threads. Le thread d'origine est souvent appelé thread principal ou parent. Par exemple, lorsque vous cliquez sur l'icône de votre navigateur web préféré, va immédiatement commencer un fil (le fil conducteur), et ce thread démarrera très rapidement plusieurs threads ou threads enfants et, pour cela, deviendra le fil conducteur.

Vous pouvez également considérer les threads comme des coureurs dans une course. Par exemple, pensez à un serveur de base de données occupé servant de nombreux clients connectés différents. Chacun de ces threads clients (notez l'utilisation du mot fil) aura (dans plusieurs cas) en lui-même au moins un thread sur le serveur hôte de la base de données et / ou dans le logiciel de base de données lui-même (En d'autres termes, deux fils, un enregistré dans le système d'exploitation et un dans le logiciel de base de données).

Le serveur de base de données essaie de servir tous ces threads en même temps, d'où le terme processus simultanés O threads simultanés et s'il y a des bugs dans le logiciel de base de données (ou dans le système d'exploitation, etc.), tôt ou tard, vous pouvez vous retrouver dans une condition de course.

Qu'est-ce qu'un Condition de course?

Un moyen simple de faire le lien avec les coureurs participant à une course est d'imaginer une photo d'arrivée sur laquelle deux coureurs franchissent la ligne d'arrivée au même moment.. Est faisable, même si peu probable, que cela arrive dans les races humaines. Pour les ordinateurs qui traitent des centaines d'opérations par milliseconde, devient beaucoup plus viable.

Comme autre exemple, imaginez une course de relais dans laquelle les coureurs passent un témoin (le bâton de couleur flashy) d'une personne à une autre. Imaginez maintenant qu'un des membres de la course fait une erreur, et maintenant il y a deux coureurs qui pensent qu'ils devraient recevoir le drapeau rouge.

Un événement important dans une course de relais est le passage du témoin, car cela peut signifier que le détenteur précédent du jeton peut cesser de fonctionner, et maintenant c'est au nouveau propriétaire du témoin de faire de son mieux. Maintenant, il y a deux coureurs qui saisissent le bâton. Ça va être une situation intéressante à regarder à la télévision (si tu aimes ce genre de truc), mais il est clair qu'il y aura des conséquences.

Essentiellement, une condition de concurrence est une erreur, erreur ou problème dans le code du système informatique qui produit des résultats imprévisibles: une séquence d'événements inattendue. C'est régulièrement dû à deux threads en conflit d'une manière ou d'une autre, puisque plus de deux threads peuvent être impliqués dans le conflit réel et, souvent, plus de deux threads s'exécutant dans un logiciel défectueux.

Dans notre exemple de la race humaine, nous avons eu deux personnes accédant à un objet à peu près en même temps, et le la corruption (une définition informatique pour indiquer que certaines données ont été corrompues, où ces données pourraient résider en mémoire ou sur disque ou sur CPU, etc.) c'est arrivé au moment où deux personnes (ou deux threads en analogie avec l'ordinateur) ils ont essayé d'attraper le témoin et le conflit s'est produit. En termes informatiques, deux threads ont essayé d'écrire un espace mémoire qui ne devrait régulièrement être écrit que par un seul thread (un coureur).

Les conditions de course peuvent survenir dans divers domaines, comme l'électronique interne, les logiciels informatiques et la vie en général. Par exemple, une collision d'appels est une définition des télécommunications pour décrire la situation dans laquelle un canal de communication est saisi aux deux extrémités simultanément. À l'intérieur du logiciel informatique, l'un des domaines les plus importants des conditions de course, il y a une grande variété de conditions de course possibles.

Comme autre exemple d'une condition de concurrence dans les logiciels informatiques, imaginez deux threads de calcul travaillant avec un espace mémoire donné. Un utilisateur vient de soumettre un formulaire et le logiciel backend écrit ce formulaire en mémoire. En même temps, un autre utilisateur lit les champs de ce formulaire depuis le même espace mémoire. En fonction de ce qui se passe, l'utilisateur lecteur peut recevoir un formulaire partiellement incorrect avec des informations partiellement mises à jour.

Prévention des conditions de course: Sécurité du fil

Il y a eu beaucoup de discussions sur les conditions de carrière dans l'industrie informatique. Selon le langage de codage que vous utilisez, il peut y avoir beaucoup ou peu de dispositions pour gérer les conditions de course. Une définition fréquemment utilisée est sécurité du fil ou un à l'abri des menaces langage d'application ou de programmation [construction]. Ces termes sont utilisés pour indiquer si un morceau de code ou un logiciel dans son ensemble est à l'abri des menaces, En d'autres termes, écrit de manière à éviter et même éviter les conditions de course.

Si le logiciel est considéré à l'abri des menaces, est considéré comme libre de l'opportunité des conditions de course. Dans divers cas, ‘pris en considération« Thread-safe est le meilleur que les développeurs peuvent offrir, et encore plus lorsque de nombreux threads et interactions sont possibles. La complexité de nombreux threads fonctionnant avec de nombreuses ressources peut facilement se transformer en une myriade de gestion de code et une myriade encore plus grande de conditions de concurrence possibles.

Diverses constructions de programmation peuvent être utilisées pour éviter les conditions de concurrence. Par exemple, feux de circulation et mutex. La complexité de l'utilisation de telles constructions dépendra du langage de programmation utilisé et de sa prise en charge native pour piloter la gestion des threads.. Par exemple, et C ++ on peut regarder le std :: mutex classe pour implémenter un mutex (En d'autres termes mutuellement exclusifs) fermer à clé. En bas, malgré cela, on ne trouve pas nativement une telle construction.

Faire un pas de plus, en plus vous pouvez considérer quelles constructions, les fonctions ou même les exécutables et les bibliothèques en particulier sont déjà thread-safe, et utiliser plus tard lesdites constructions, les fonctions, exécutables et bibliothèques comme base pour construire une nouvelle version, fonction, exécutable, une bibliothèque. ou progiciel complet.

Mettre en pratique même des constructions de base de gestion de la sécurité des threads peut être une question complexe.. Par exemple, considérer la difficulté d'implémenter un sémaphore dans bash.

Fin

Dans ce billet, nous explorons les fils de calcul et les conditions de concurrence. Nous analysons les analogies avec les courses de course et les courses de relais dans la vie humaine pour explorer certaines conditions de course de base qui peuvent se produire dans les ordinateurs.. Pour terminer, nous explorons la sécurité des threads, les différentes implémentations de la gestion des conditions de concurrence dans les langages de codage informatique et comment nous pouvons empêcher les conditions de concurrence.

Si vous avez aimé ce post, jetez un oeil à l'article Comment fonctionnent les portes logiques: OU, ET, OU exclusif, NI, NAND, XNOR et NON.

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.