Avez-vous déjà couru une course? Si c'est ainsi, Vous savez que parfois une finition photographique est nécessaire pour choisir 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 un nouveau processus informatique. / Informaticien.
Un thread est un processus informatique / ordinateur qui fonctionnera / exécutera les différentes é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 (Identificateur de processus). Pour en savoir plus sur les PID sous Linux, vous pouvez lire nos articles Bash Automation et 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 par un ID de processus (Réf. PID colonne dans le gestionnaire des tâches de Windows), bien que la mise en œuvre de la gestion des processus soit différente entre Linux et Windows; code différent derrière, différent PID outils d'interaction, etc. et compatibilité limitée. En outre, l'ID de processus 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, donc, 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 beaucoup de 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 (c'est-à-dire, 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 dans laquelle deux coureurs franchissent la ligne d'arrivée au même moment.. C'est possible, bien que peu probable, que cela arrive dans les races humaines. Pour les ordinateurs qui traitent des milliers d'opérations par milliseconde, devient beaucoup plus faisable.
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 participants à 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 de jeton précédent 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. Habituellement, c'est parce que deux threads sont 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 (un terme 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 normalement ê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 un terme de 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. Un terme fréquemment utilisé 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, c'est-à-dire, é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 exempt de la possibilité de conditions de course. Dans beaucoup de 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 son support natif pour améliorer la gestion des threads.. Par exemple, et C ++ on peut regarder le std :: mutex classe pour implémenter un mutex (c'est-à-dire mutuellement exclusifs) fermer à clé. En bas, cependant, on ne trouve pas nativement une telle construction.
Faire un pas de plus, vous pouvez également considérer quelles constructions, les fonctions ou même les exécutables et les bibliothèques en particulier sont déjà thread-safe, puis utiliser lesdites constructions, les fonctions, exécutables et bibliothèques comme base pour construire une nouvelle version, fonction, exécutable, bibliothèque. ou progiciel complet.
Implémenter même des constructions de base de gestion de sécurité des threads peut être une affaire complexe. Par exemple, considérer la difficulté d'implémenter un sémaphore dans bash.
Fin
Dans cet article, 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.. Finalement, 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é cet article, jetez un œil à l'article Comment fonctionnent les portes logiques: OU, ET, OU exclusif, NI, NAND, XNOR et NON.