Résumé
En programmation concurrente, une section critique est une portion de code dans laquelle il doit être garanti qu'il n'y aura jamais plus d'un thread simultanément. Il est nécessaire d'utiliser des sections critiques lorsqu'il y a accès à des ressources partagées par plusieurs threads. Une section critique peut être protégée par un mutex, un sémaphore ou d'autres primitives de programmation concurrente. Puisqu'à un moment donné, jamais plus d'un thread ne peut être actif dans une section critique, le thread la détenant doit la libérer le plus vite possible pour éviter qu'elle ne devienne un goulot d'étranglement. Libérer la section critique permet d'améliorer les performances en permettant aux threads en attente d'y accéder. Soient deux threads qui souhaitent incrémenter un même compteur. L'incrémentation doit être protégée par une section critique. En effet, l'incrémentation d'une variable n'est pas forcément une opération atomique. Il serait par exemple possible de traduire l'incrémentation d'une variable dans le code assembleur (inspiré du bytecode de la JVM) suivant : load @variable // charger la variable sur une pile (en Java, chaque thread dispose de sa propre pile d'exécution) load 1 // charger la constante 1 sur la pile add // effectuer l'incrémentation store @variable // stocker le sommet de la pile dans la variable Dans cet exemple, il faut quatre opérations pour réaliser l'incrémentation de la variable. Si deux tâches souhaitent effectuer l'incrémentation en même temps, le résultat de l'incrémentation ne sera pas juste. Par exemple, si la séquence des opérations est la suivante : La tâche 1 charge la variable partagée sur sa pile d'exécution. La tâche 2 charge la variable partagée sur sa pile d'exécution. La tâche 1 charge la constante 1 sur sa pile d'exécution. La tâche 2 charge la constante 1 sur sa pile d'exécution. La tâche 1 effectue l'incrémentation. La tâche 1 stocke le sommet de sa pile dans la variable partagée. La tâche 2 effectue l'incrémentation. La tâche 2 stocke le sommet de sa pile dans la variable partagée.
À propos de ce résultat
Cette page est générée automatiquement et peut contenir des informations qui ne sont pas correctes, complètes, à jour ou pertinentes par rapport à votre recherche. Il en va de même pour toutes les autres pages de ce site. Veillez à vérifier les informations auprès des sources officielles de l'EPFL.
Publications associées (5)

Chargement

Chargement

Chargement

Afficher plus
Concepts associés (15)
Programmation concurrente
La programmation concurrente est un paradigme de programmation tenant compte, dans un programme, de l'existence de plusieurs piles sémantiques qui peuvent être appelées threads, processus ou tâches. Elles sont matérialisées en machine par une pile d'exécution et un ensemble de données privées. La concurrence est indispensable lorsque l'on souhaite écrire des programmes interagissant avec le monde réel (qui est concurrent) ou tirant parti de multiples unités centrales (couplées, comme dans un système multiprocesseurs, ou distribuées, éventuellement en grille ou en grappe).
Algorithme de Peterson
En informatique, l'algorithme de Peterson est un algorithme d'exclusion mutuelle pour la programmation concurrente. Cet algorithme est basé sur une approche par attente active et est garanti d'être sans famine et sans interblocage. Il est constitué de deux parties : le protocole d'entrée dans la section critique et le protocole de sortie. L'algorithme présenté est une version pouvant fonctionner avec deux threads. Il a été publié par Gary Peterson en 1981.
Situation de compétition
Une situation de compétition (ou situation de concurrence, accès concurrent, concurrence critique, course critique, séquencement critique ; race condition en anglais, littéralement « situation de course »), est une situation caractérisée par un résultat différent selon l'ordre dans lequel agissent les acteurs du système. Le terme est plutôt employé à propos de programmes informatiques et de systèmes électroniques. C'est généralement considéré comme un défaut car source de panne ou de blocage.
Afficher plus
Cours associés (4)
CS-307: Introduction to multiprocessor architecture
Multiprocessors are a core component in all types of computing infrastructure, from phones to datacenters. This course will build on the prerequisites of processor design and concurrency to introduce
CS-471: Advanced multiprocessor architecture
Multiprocessors are now the defacto building blocks for all computer systems. This course will build upon the basic concepts offered in Computer Architecture I to cover the architecture and organizati
CS-476: Real-time embedded systems
A real time system is subject to important temporal constraints. This course is about understanding where processing time is spent and what a designer can do in order to achieve real-time processing s
Afficher plus
Séances de cours associées (43)
Propriétés de la monnaie: Bases et serrures
Explore les propriétés de proximité, les conditions de course et les bases des écluses.
Concurrence : Exécuteurs et exclusion mutuelle
Explore les exécuteurs comme des alternatives de threads efficaces et explore les propriétés d'exclusion mutuelle dans Scala et JVM.
Verrouillage du lecteur
Introduit le verrou lecteur-auteur pour gérer la concordance dans les scénarios avec des lectures fréquentes et des mises à jour occasionnelles.
Afficher plus
MOOCs associés

Aucun résultat