Synchronisation (multitâches)
Un article de Wikipédia, l'encyclopédie libre.
- Pour les articles homonymes, voir 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 |
[modifier] 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.
[modifier] 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) 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.
[modifier] 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 nomage | PID / getPId | cle IPC | interne | cle IPC | cle IPC | les objets |
nombre d'activités | 2 | N | 2 | N | N | N |
appelle 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 |
[modifier] Problèmes et applications
Portail de l'informatique – Accédez aux articles de Wikipédia concernant l’informatique. |