Exemple d'usage du sémaphore
Sémaphores bloquants
Outre les sémaphores à compteur interne, il existe également les sémaphores bloquants. Un sémaphore bloquant est un sémaphore qui est initialisé avec la valeur 0. Ceci a pour effet de bloquer n'importe quel thread qui effectue P(S) tant qu'un autre thread n'aura pas fait un V(S). Ce type d'utilisation est très utile lorsque l'on a besoin de contrôler l'ordre d'exécution entre threads. Cette utilisation des sémaphores permet de réaliser des barrières de synchronisation.
Il existe également le sémaphore binaire qui est une exclusion mutuelle (mutex). Il est toujours initialisé avec la valeur 1.
Résolution du problème des lecteurs/rédacteurs
Un problème classique pouvant être résolu à l'aide des sémaphores est le problème des lecteurs/rédacteurs. Ce problème traite de l'accès concurrent en lecture et en écriture à une ressource. Plusieurs processus légers (thread) peuvent lire en même temps la ressource, mais il ne peut y avoir qu'un et un seul thread en écriture.
Résolution du problème des producteurs/consommateurs
Lorsque des processus légers souhaitent communiquer entre eux, ils peuvent le faire par l'intermédiaire d'une file. Il faut définir le comportement à avoir lorsqu'un thread souhaite lire depuis la file lorsque celle-ci est vide et lorsqu'un thread souhaite écrire dans la file mais que celle-ci est pleine. Voir l'article sur le problème des producteurs et consommateurs.
Les sémaphores aujourd'hui
Les sémaphores sont toujours utilisés dans les langages de programmation qui n'implémentent pas intrinsèquement d'autres formes de synchronisation. Ils sont le mécanisme primitif de synchronisation de beaucoup de systèmes d'exploitation. La tendance dans le développement des langages de programmation est de s'orienter vers des formes plus structurées de synchronisation comme les moniteurs. Outre les problèmes d'interblocages qu'ils peuvent provoquer, les sémaphores ne protègent pas les programmeurs de l'erreur courante qui est de bloquer un sémaphore par un processus qui est déjà bloqué par ce même processus, et d'oublier de libérer un sémaphore qui a été bloqué. Hoare, Hansen, Andrews, Wirth, et même Dijkstra ont jugé le sémaphore obsolète.
Problèmes pouvant être induits par l'utilisation des sémaphores
Les sémaphores servant notamment à effectuer de la synchronisation, ils peuvent conduire à des situations indésirables, par exemple
- Interblocage
- Inversion de priorité
Synchronisation en programmation concurrente |
Principes de base | Atomicité • Section critique • Communication inter-processus • Thread Local Storage |
Patrons de conception | Barrière de synchronisation • Futex • Moniteur • Mutex • Sémaphore • Spinlock • Algorithme de Peterson • Algorithme de Dekker • Algorithme du banquier |
Problèmes classiques | Couplage fort • Famine • Interblocage • Inversion de priorité • Conditions de concurrence |
Éléments de programmation informatique |
Bibliothèque logicielle | Bibliothèque standard • Espace de nom • Framework • Gabarit (template) • Interface • Interface de programmation (API) |
Vocabulaire | Algorithme • Expression • Indentation • Ligne de code • Opérateur • Pseudo-code • Surcharge des opérateurs | Autour des fonctions | Convention de nommage • Factorisation • Fonction imbriquée • Fonction de rappel • Fonction récursive • Généricité • Opérande • Paramètre • Polymorphisme • Procédure • Signature de type | Autour de l'objet | Classe • Constructeur • Destructeur • Encapsulation • Héritage • Héritage multiple • Instance • Méthode • Ramasse-miettes (garbage collector) • Référence | |
Dans le code source | Structures de données | Arbre • Attribut • Caractère • Enregistrement • File • First in, first out (fifo) • Last in, first out (lifo) • Liste • Liste chaînée • Pile • Table de symboles • Tableau • Tas • Type abstrait • Sémaphore | Déclarations : types et variables | Affectation • Pointeur • Portée • Tableau associatif • Type énuméré • Type récursif • Typage statique • Variable • Variable globale • Variable locale | Structures de contrôle | case • do • else • eval • if • for • goto • loop • switch • while | Fonctions usuelles | Concaténation • Incrémentation • malloc • printf | |
Outil de développement logiciel | Environnement de développement • Environnement de développement intégré (IDE) • Générateur de documentation • Gestion de versions • Modèle • Patch • Spécification |
Folklore | Hello world • Keep it Simple, Stupid • Langage de programmation exotique |
Catégorie:Développement logiciel • Catégorie:Programmation informatique |