- Synchronisation (multitaches)
-
Synchronisation (multitâches)
Pour les articles homonymes, voir Synchronisation.Problèmes classiques des
méthodes de synchronisationLes méthodes de synchronisation
Objet: Décrire les standards de la synchronisation de processus légers.- Les mutex
- Les sémaphores
- Les variables conditionnelles (condition variable en anglais)
À noter : les problèmes de synchronisation s'appliquent également au cas de deux processus distincts. On parle alors de Communication inter-processus ou IPC.
Sommaire
Pourquoi faut-il synchroniser?
À un instant t, deux processus légers peuvent lire ou écrire dans une même zone mémoire. Cette zone mémoire peut représenter une variable globale (en procédural), statique (en orienté-objet), ou tout simplement parce que deux variables pointent la même zone mémoire dans le tas.
Dans ce cas, si les opérations de lecture et d'écriture ne sont pas atomiques, ou si tout simplement les deux processus légers s'exécutent chacun sur un processeur différent, simultanément, le résultat sera imprédictible. Autrement dit, il pourra y avoir perte ou corruption de données.
Les mutex
Un mutex est une donnée permettant de verrouiller l'accès à une ressource partagée, de telle sorte qu'elle ne soit accessible que par un processus léger à un instant donné.
Voici un exemple fictif d'implémentation d'un mutex sous la forme d'un entier:
-- initialisation mutex := 0
-- ici, on effectue un appel bloquant, jusqu'à ce que la ressource soit disponible. -- certaines implémentations permettent de spécifier un délai à ne pas dépasser (timeout) -- CODE A VERIFIER définir verrouiller(mutex a): attendre jusqu'à ce que (mutex = 0) mutex := mutex + 1 fin définir
-- déverrouiller : rendre disponible la ressource pour les autres tâches définir déverrouiller(mutex a): si mutex < 1 : erreur fin si mutex := mutex - 1 fin définir
Typiquement, si on souhaite consulter en lecture ou en écriture une variable globale (qui donc, est partagée par tous les processus légers) on place cette opération dans une section critique :
- on verrouille le mutex
- on lit ou met à jour la donnée
- on déverrouille le mutex
Lorsque l'on ne verrouille pas une ressource pour les opérations de lecture, il existe un risque de corruption de données lors d'une opération d'écriture.
Le besoin d'atomicité n'existe cependant pas lorsqu'une variable statique est initialisée au démarrage du processus, puis jamais modifiée.
Implémentation
Voici, un tableau récapitulatif de l'implémentation de la synchronisation pour les processus lourds et les processus légers.
Type processus lourd, fork wait processus lourd, sémaphore IPC processus lourd, tube processus lourd, message IPC processus lourd, segment partagé Java Thread système de nommage PID / getPId cle IPC interne cle IPC cle IPC les objets nombre d'activités 2 N 2 N N N appel bloquant wait() p() read() receive() non syncronized/wait() communication exit(p) non stream message taille du segment les objets volume de la communication 2 octets non non limité taille de la boite aux lettres non limité machine virtuelle Problèmes et applications
- Portail de l’informatique
Catégorie : Programmation concurrente
Wikimedia Foundation. 2010.