Chapitre3 Synchronisation
Chapitre3 Synchronisation
Chapitre3 Synchronisation
MIRA-BEJAIA
FACULTE DES SCIENCES EXACTES
DEPARTEMENT INFORMATIQUE
SUPPORT DE COURS
SYSTEMES D’EXPLOITATION
SYNCHRONISATION DE PROCESSUS
1. Définitions :
Synchronisation : La synchronisation introduit une condition d’attente sur un ou plusieurs
processus parallèles.
Points de synchronisation : On impose un ordre de précédence dans le temps logique sur certains
points de la trace temporelle des processus. On impose à certains processus une condition pour
autoriser le franchissement de certains points de leur trace temporelle. Ces points sont appelés
des points de synchronisation.
1.2 Allocation de ressources : Dans une application parallèle (ou distribuée) les ressources mises
à la disposition des processus sont en nombre limité. Les stratégies d’allocation de ressources
sont :
- stratégie d’ordonnancement de requêtes
- stratégie de priorité et optimisation de nombre de requêtes satisfaites.
L’objectif est une utilisation optimale des ressources et une distribution équitable des ressources
entre les processus demandeurs.
Deux solutions peuvent être envisagées :
- lors d’une requête de N ressources, le nombre de ressources est suffisant et la requête est
satisfaite, alors que d’autres requêtes pour un nombre plus élevé de ressources restent en attente
(risque de famine).
- lors d’une restitution de M ressources plusieurs processus demandeurs peuvent être servis.
Trois stratégies de solution peuvent être suivis :
- FIFO : les requêtes sont satisfaites suivant l’ordre d’arrivée
- Priorité aux petit-demandeurs : avec risque de famine des gros demandeurs.
- Ascenseur : les requêtes sont satisfaites selon le nombre croissant des ressources demandées. A
chaque étape (étage) les requêtes en attente sont satisfaites si le nombre de ressources est
suffisant. Si aucune requête n’est en attente on passe à l’étape (étage) suivant.
L’allocation de ressources peut aboutir à un problème d’interblocage.
1.4 Modèle Lecteur-Rédacteur : Quand des processus partagent une structure de données (un
fichier par exemple) qui peut être à un instant donné accédé par un processus lecteur qui ne fait
que consulter ou par un processus rédacteur qui modifie. Les deux types de processus doivent
respecter les contraintes suivantes :
- la lecture est simultanée : plusieurs lecteurs peuvent lire en même temps
- l’écriture est en exclusion mutuelle : un seul processus rédacteur à la fois peut accéder au fichier.
- Lorsque le fichier est libre, les lecteurs et rédacteurs suivent une stratégie de priorité :
variante1 : Priorité aux lecteurs tant que la ressource n’est pas occupé par un rédacteur.
variante2 : Priorité aux rédacteurs où une demande de lecture est acceptée si aucun rédacteur
n’est en cours d’écriture ou en attente d’accès.
variante3 : FIFO mais en autorisant la lecture simultanée.
varainte4 : Priorité aux lecteurs sans famine de rédacteurs où une demande de lecture est acceptée
si la ressource est accédée en lecture et aucun rédacteur n’est en attente. A la libération de la
ressource par un rédacteur, tous les lecteurs sont réveillés.
1.5 Modèle Client-Serveur : le modèle s’applique à toute activité distribuée (répartie). L’activité
parallèle se structure en 2 processus : des processus systèmes qui offrent et exécutent des services
et des processus utilisateurs qui émettent des requêtes de services. La relation entre ces processus
est une relation de client à serveur.
Remarque : un processus serveur peut être lui-même client.
Le protocole client serveur est implémenté par l’appel procédural à distance (RPC : remote
procedure call). L’implantation des RPC est difficile car le serveur n’est pas sur le même site que
le client. Le passage des paramètres de l’appel est par valeur car toute transmission d’adresse est
exclue.
Le problème de fiabilité du réseau de communication oblige des sémantiques du protocole de
communication. Pour être sure que la requête est bien reçue le client émet la requête à chaque
délai de garde. Le serveur qui reçoit plusieurs versions d’une même requête peut envoyer
plusieurs réponses. Certains protocoles assurent que le service a été exécuté au moins une fois, et
d’autres assurent que le service a été exécuté une seule fois au plus.
var V : verrou ;
Verrouiller(V){ Deverrouiller(V){
if (V.état== ouvert) V.état=fermé ; if (¬filevide(V.file))
else enfiler(V.file) ; P=defiler(V.file) ;
} else V.état=ouvert;
}
2.4 Les événements : Pendant l’exécution d’une application parallèle, différents événements
peuvent se produire : expiration d’un délai, libération d’une ressource, envoi/réception d’un
message. Certains systèmes possèdent le type événement et en général il est privé à un processeur.
Un événement est une variable de type enregistrement :
type événement : enregistrement {
état : (déclenché non-déclenché) ;
file : liste de processus en attente ;
}
Exemple1 : un événement particulier utilisé dans les applications temps réels est l’événement
« expiration de délai » (time-out). Deux primitives sont associées à cet événement :
- activer(N) : l’événement est déclenché après N unités de temps
- annuler( ) : pour annuler la dernière demande de délai du processus.
Exemple2 : UNIX (Linux) offre des primitives qui utilisent des signaux :
- pause() : bloque un processus jusqu’a réception d’un signal
- kill(processus-id, signal-id) : envoie un signal à un processus particulier
- alarm(n) : le signal SIGALARM est envoyé à un processus après n secondes.
Exemple3 : le noyau 68K KERNEL (systèmes temps réel) offre des primitives pour synchroniser
des taches sur des événements. Chaque tache possède 16 événements (0..15).
-SignalEvent(Num-T :tache-id, Num-Ev :événement) ;
-WaitEvents(attendus : array[15] of Boolean, délai :integer, Var arrivés: array[15] of Boolean, Var
result: (OK, time-out));
- EventsOccured(attendus: array[15] of Boolean): Boolean;
-ClearEvents(evts: array[15] of Boolean);
Variantes de sémaphore :
- Sémaphore privé à un processus : seul ce processus effectue P (donc au plus un seul processus
en attente) et V est effectué par tous les autres processus y compris le propriétaire.
- P immédiat : le processus qui demande un ticket ne sera pas bloqué dans le file d’attente s’il n
y’a pas de ticket, mais recevra un message d’échec et continue son exécution.
- P temporisé : le processus qui exécute P précise le délai maximum d’attente et se ce délai expire
il sera réveillé et recevra un message d’échec.
- P avec priorité : les processus en attente seront enfilés selon leur priorités.
- Sémaphore binaire : l’entier S.e ne peut prendre que deux valeurs 0 ou 1 donc pas de file
d’attente.
- P à plusieurs tickets: le processus peut demander n tickets en exécutant P (n est un argument de
P) et libérer m tickets en exécutant V.
Exemple1 : Soient les deux programmes parallèles suivants. Ajouter les sémaphores pour
garantir la relation de précédence.
ProgA(){ ProgB{ T1
T1 ; T2 ;
} }
T1
Exemple2 : Soit une ressource partageable R qui peut être utilisée par au plus N processus
simultanément. Ecrire l’algorithme d’un tel processus.
2.6 Le moniteur de Hoare (1974) :
Un moniteur décrit les règles de synchronisation nécessaires à une application parallèle donnée
dans une unité syntaxique et sémantique unique. Par analogie, une classe en POO permet de
construire une abstraction de données, et un moniteur permet de définir une abstraction de
synchronisation. Le moniteur encapsule des données partagées et définit des méthodes d’accès à
ces données. Le moniteur assure un accès en exclusion mutuelle. C’est le compilateur du langage
de programmation parallèle qui assure l’exclusion mutuelle et quand un processus est en attente
du moniteur il est ajouté à la mémoire tampon alloué au moniteur par le système.
Une procédure du moniteur peut éventuellement appeler une autre procédure du même
moniteur. Ce genre de moniteur garantit l’exclusion mutuelle mais pas la synchronisation.
Les variables condition de Hoare : ce sont des classes d’objets de synchronisation dans un moniteur.
Deux opérations complémentaires s’appliquent aux variables condition :
Lors de l’exécution de signal(c) deux processus sont actifs à l’intérieur du moniteur : signaleur et
le signalé. La règle de Hoare dit que le processus signaleur est suspendu donnant l’accès au
signaleur (prioritaire), mais pour éviter la famine du signaleur, il est prioritaire aux autres
processus demandant l’accès au moniteur.
while (!libre);
libre:=FALSE;
Section critique;
libre :=TRUE ;
}}
Algorithme2 : Une variable booléenne par processus pour indiquer leur état.
shared boolean demande[2] ;
Proc(int i ) {while (TRUE){
demande[i]:=TRUE;
while (demande[1-i]);
Section critique;
demande[i]:=FALSE;
}}
Question : les trois algorithmes ne garantissent pas l’exclusion mutuelle. Trouver quelle condition
n’est pas vérifiée pour chacune des solutions.
Process(int i) {while(True){
choix[i]=True;
tour[i]:=max(tour[0],...,tour[n-1])+1 ;
choix[i]=False ;
for( j=0 ; j<n ;j++) {
while (choix[j]) ;
while (tour[j] && (tour[j],j)<(tour[i],i));
}
Section critique() ;
tour[i]=0 ;
}}
Questions :
a) A quoi servent les deux instructions choix[i] = True et choix[i] =False?
b) Pourquoi chaque processus commence par vérifier si choix[j]=vraie?
c) Montrer que si un processus Pi est dans sa section critique et Pk (k≠ i) a calculé son
tour[k] alors (tour[i],i)<(tour[k],k).
d) Vérifier si dans le cas ou plusieurs processus attendent que la section critique soit libérée
alors le premier arrivé sera le premier servi.
Solution 1 : Sémaphore
semaphore mutex=1 ; plein :=0 ; Cons( ) {while(true){
vide :=n ; P(plein) ;
Prod() {while(true){ P(mutex) ;
produire(objet) ; objet=retirer( buffer) ;
P(vide) ; V(mutex) ;
P(mutex) ; V(vide) ;
mettre (objet, buffer) ; consommer(objet);
V(mutex) ; }}
V(plein ) ;
}}
Solution2 : Moniteur
Processus utilisateurs :
Lecteur: Redacteur :
begin begin
variante.demander-lecture; variante.demander-ecriture ;
lire( ) ; ecrire( ) ;
variante.terminer-lecture ; variante.terminer-ecriture ;
end end
Questions :
1) quelle variante est implémentée par cette solution ?
2) vérifier que les contraintes du modèle sont respectées
3) pourquoi y’a-t-il un signal(lecture) avant un signal(ecriture) dans la procedure terminer-
ecriture?
Solution2 : Sémaphore
semaphore mutex :=1, ecriture=1 ; Lect( ) {while(true){
int n-lect :=0 ; P(mutex)
n-lect++;
Redact( ) {while(true){ if (n-lect==1) P(ecriture);
P(ecriture); V(mutex);
ecrire( ); lire( );
V(ecriture); P(mutex);
}} n-lect-- ;
if ( !n-lect) V(ecriture) ;
V(mutex);
}}
Questions :
1) Quelle variante est implémentée par cette solution ?
2) pourquoi l’opération écrire( ) est entre un P puis V alors que l’opération lire( ) est entre un V
puis P ?
Exercices :
Problème de la voir unique :
Soit un pont, à voie unique, traversé pas des véhicules en sens inverse (sens A et sens B). A tout
moment, le pont ne doit contenir que des véhicules allant dans un sens uniquement. On
assimilera les véhicules à des processus parallèles.
Voiture AversB : Voiture BversA :
Demande d’accès AB ; Demande d’accès BA ;
Circulation sur le pont de A vers B; Circulation sur le pont de B vers A;
Libère le pont; Libère le pont;
Problème du carrefour :
La circulation à un carrefour à deux voies est réglée par des feux verts ou rouges. Les règles de
circulations sont les suivantes :
- quand le feu est rouge sur une voie, les voitures y circulant doivent attendre ; quand le feu est
vert les voitures peuvent traverser le carrefour,
- une voiture se présentant au carrefour doit le franchir au bout d'un temps fini,
- les feux de chaque voie passent alternativement du rouge au vert,
- à un instant donné, le carrefour ne doit contenir que des voitures d'une même voie,
- les voitures traversent le carrefour en ligne droite.
Ecrire les programmes correspondant aux processus :
- changement assurant la gestion de la commande des feux,
- traversée1 et traversée2 assurant respectivement la traversée d'une voiture des voies 1 et 2,
quand le carrefour peut contenir une seule voiture à la fois, puis au plus k voitures à la fois.
Mme YAICI.