Académique Documents
Professionnel Documents
Culture Documents
Systèmes d’Exploitation
Cours 4/10 : Processus III
Nicolas Sabouret
Université Paris-Sud
Licence 3 - semestre S5
Plan
1 Synchronisation de processus
2 Méthodes de synchronisation
3 Conclusion
Plan
1 Synchronisation de processus
Producteurs-consommateurs
Section critique
2 Méthodes de synchronisation
3 Conclusion
Espace partagé
#define MAX 10
int taille = 0;
int [MAX] boite;
void produire(char c) {
while(taille==MAX)
; // attendre que la boite se vide
boite[taille] = c;
taille++; // déposer et avancer
}
Espace partagé
taille
Espace partagé
taille
Espace partagé
taille
Espace partagé
taille
Espace partagé
3
taille
Espace partagé
3 5
taille
Espace partagé
3 5 8
taille
Espace partagé
3 5 8 2
taille
Espace partagé
3 5 8 2 5
taille
Espace partagé
3 5 8 2 5
taille
Espace partagé
3 5 8 2 5
taille
taille
taille
Espace partagé
3 5 8
taille
Espace partagé
3 5 8
taille
Espace partagé
3 5 8
taille
Espace partagé
3 5 8
taille
Espace partagé
3 5 8
taille
Espace partagé
3 5 8
taille
Espace partagé
3 5 8
taille
Espace partagé
3 5 4
8
taille
Entrelacement
Remarque
Les entrelacements se font au niveau du code binaire !
→ couper entre chaque instruction assembleur !
Exemple : incrément (cf. cours 2)
ldr r0, @var
add r0, #1
str r0, @var
Entrelacement
Remarque
Les entrelacements se font au niveau du code binaire !
→ couper entre chaque instruction assembleur !
Exemple : incrément (cf. cours 2)
ldr r0, @var
add r0, #1
str r0, @var
Section critique
Lorsqu’il y a des variables partagées, il existe des portions de code
qu’on ne veut pas pouvoir interrompre.
→ Ce sont les sections critiques.
Exclusion mutuelle
Principe
Déclarer une portion de code comme critique
L’OS garantit qu’au plus un seul processus prêt, en attente ou en
exécution ou une seule thread est dans une section critique
Exclusion mutuelle
Principe
Déclarer une portion de code comme critique
L’OS garantit qu’au plus un seul processus prêt, en attente ou en
exécution ou une seule thread est dans une section critique
→ les autres processus/threads sont mis en attente s’ils
demandent à commencer une section critique
ils sont réveillés par une interruption lorsque le processus finit sa S.C.
Exclusion mutuelle
Principe
Déclarer une portion de code comme critique
L’OS garantit qu’au plus un seul processus prêt, en attente ou en
exécution ou une seule thread est dans une section critique
→ les autres processus/threads sont mis en attente s’ils
demandent à commencer une section critique
ils sont réveillés par une interruption lorsque le processus finit sa S.C.
Définition
On parle alors d’exclusion mutuelle.
Propriétés
Exclusion Mutuelle
Si une thread effectue sa section critique, alors aucune autre
thread ne peut entrer en section critique
Propriétés
Exclusion Mutuelle
Si une thread effectue sa section critique, alors aucune autre
thread ne peut entrer en section critique
Déroulement
Une thread qui souhaite entrer en section critique ne peut pas
décider qui doit rentrer en section critique
Propriétés
Exclusion Mutuelle
Si une thread effectue sa section critique, alors aucune autre
thread ne peut entrer en section critique
Déroulement
Une thread qui souhaite entrer en section critique ne peut pas
décider qui doit rentrer en section critique
Objectif
Synchronisation
Définir des mécanismes qui garantissent ces trois propriétés
Exclusion mutuelle
Déroulement
Attente bornée
Plan
1 Synchronisation de processus
2 Méthodes de synchronisation
Mutex
Algorithme de Dekker
Sémaphores
Moniteurs
Synchronisation en Java
3 Conclusion
Principe
Un contrôleur central
Met en attente
Autorise les SC chacune à son tour
→ respecte les 3 objectifs de la synchronisation
Principe
Un contrôleur central
Met en attente
Autorise les SC chacune à son tour
→ respecte les 3 objectifs de la synchronisation
Utilisation du Mutex
... code non-critique ...
commencerSectionCritique(my id);
... code critique ...
finirSectionCritique(my id);
... code non-critique ...
Utilisation du Mutex
... code non-critique ...
commencerSectionCritique(my id);
... code critique ...
finirSectionCritique(my id);
... code non-critique ...
Fonctionnement
Lorsque ti invoque commencerSectionCritique(i) :
Vérifier que t1−i n’est pas en SC (sinon, attendre)
Noter que ti est en SC
Utilisation du Mutex
... code non-critique ...
commencerSectionCritique(my id);
... code critique ...
finirSectionCritique(my id);
... code non-critique ...
Fonctionnement
Lorsque ti invoque commencerSectionCritique(i) :
Vérifier que t1−i n’est pas en SC (sinon, attendre)
Noter que ti est en SC
Et lorsqu’elle invoque finirSectionCritique(i) :
Noter que ti n’est plus en SC
Info32b Systèmes d’Exploitation Nicolas Sabouret 11/37
Synchronisation de processus Méthodes de synchronisation Conclusion
Mutex Algorithme de Dekker Sémaphores Moniteurs Synchronisation en Java
Problème
Ce code contient lui-même des SC !
est SC = F F
Problème
Ce code contient lui-même des SC !
est SC = F F
Problème
Ce code contient lui-même des SC !
est SC = F F
Problème
Ce code contient lui-même des SC !
est SC = F F
Problème
Ce code contient lui-même des SC !
est SC = F F
Problème
Ce code contient lui-même des SC !
est SC = F F
Problème
Ce code contient lui-même des SC !
est SC = F F
Problème
Ce code contient lui-même des SC !
est SC = T
F F
Problème
Ce code contient lui-même des SC !
est SC = T
F F
Problème
Ce code contient lui-même des SC !
est SC = T
F T
F
Principe
Mettre en attente la thread demandeuse si l’autre est déjà en SC
Problème
Risque d’interblocage !
est SC = F F
Problème
Risque d’interblocage !
est SC = F F
Problème
Risque d’interblocage !
est SC = F F
Problème
Risque d’interblocage !
est SC = T
F F
Problème
Risque d’interblocage !
est SC = T
F F
Problème
Risque d’interblocage !
est SC = T
F F
Problème
Risque d’interblocage !
est SC = T
F T
F
Problème
Risque d’interblocage !
est SC = T
F T
F
Problème
Risque d’interblocage !
est SC = T
F T
F
est SC = F F
tour = ?
est SC = F F
tour = ?
est SC = F F
tour = ?
est SC = F F
tour = 1
est SC = T F
tour = 1
est SC = T F
tour = 1
est SC = T F
tour = 0
est SC = T T
tour = 0
est SC = T T
tour = 0
est SC = T T
tour = 0
Attente active
Problème
Les processus font de l’attente active.
while (est SC[1-id] && tour==1-id)
;
→ Utilisation inutile du processeur
Attente active
Problème
Les processus font de l’attente active.
while (est SC[1-id] && tour==1-id)
;
→ Utilisation inutile du processeur
Solution
Attente active
Problème
Les processus font de l’attente active.
while (est SC[1-id] && tour==1-id)
;
→ Utilisation inutile du processeur
Solution
Appels systèmes :
wait : l’OS met le processus en attente
notify : l’OS réveille les processus en attente
Attente active
Mutex
void commencerSectionCritique(int id) {
tour=1-id;
est SC[id]=true;
while (est SC[1-id] && tour==1-id)
wait();
}
void finirSectionCritique(int id) {
est SC[id]=false;
notify();
}
Algorithme de Dekker
Algorithme de Dekker II
etat[id] = DEMANDE;
}
Info32b Systèmes d’Exploitation Nicolas Sabouret 22/37
Synchronisation de processus Méthodes de synchronisation Conclusion
Mutex Algorithme de Dekker Sémaphores Moniteurs Synchronisation en Java
etat[id] = DEMANDE;
while (tour!=id) déroulement
if (etat[tour] != DEMANDE)
tour=id;
etat[tour] = TIENT; entrée en SC
⇒ Jamais deux threads en DEMANDE en même temps
}
Info32b Systèmes d’Exploitation Nicolas Sabouret 22/37
Synchronisation de processus Méthodes de synchronisation Conclusion
Mutex Algorithme de Dekker Sémaphores Moniteurs Synchronisation en Java
etat[id] = DEMANDE;
while (tour!=id) déroulement
if (etat[tour] != DEMANDE)
tour=id;
etat[tour] = TIENT; entrée en SC
⇒ Jamais deux threads en DEMANDE en même temps
n = 0; attendre la fin des autres SC
while ((n<N)&&((n==id)||(etat[n]!=TIENT)))
n++;
}
Info32b Systèmes d’Exploitation Nicolas Sabouret 22/37
Synchronisation de processus Méthodes de synchronisation Conclusion
Mutex Algorithme de Dekker Sémaphores Moniteurs Synchronisation en Java
Algorithme de Dekker IV
Algorithme de Dekker IV
Avantages
Respecte les 3 principes (déroulement, exclusion et pas de famine)
Inconvénients
N doit être connu à l’avance !
Sémaphore
E. Dijkstra, 1962-1963
Principe (simplifié)
On définit un objet partagé (le sémaphore) :
Qu’on peut acquérir ;
Qui met en attente ceux qui le demandent ;
Qui donne la main dans l’ordre des demandes.
Sémaphore
E. Dijkstra, 1962-1963
Principe (simplifié)
On définit un objet partagé (le sémaphore) :
Qu’on peut acquérir ;
Qui met en attente ceux qui le demandent ;
Qui donne la main dans l’ordre des demandes.
Sémaphore : utilisation
Utilisation du Sémaphore
Semaphore s = new Semaphore();
... code non-critique ...
s.acquerir();
... code critique ...
s.liberer();
... code non-critique ...
Sémaphore : utilisation
Utilisation du Sémaphore
Semaphore s = new Semaphore();
... code non-critique ...
s.acquerir();
... code critique ...
s.liberer();
... code non-critique ...
Difficultés
Vivacité : on veut passer la main dans le bon ordre
Sémaphore : utilisation
Utilisation du Sémaphore
Semaphore s = new Semaphore();
... code non-critique ...
s.acquerir();
... code critique ...
s.liberer();
... code non-critique ...
Difficultés
Vivacité : on veut passer la main dans le bon ordre
→utilisation d’une file d’attente
Sémaphore : utilisation
Utilisation du Sémaphore
Semaphore s = new Semaphore();
... code non-critique ...
s.acquerir();
... code critique ...
s.liberer();
... code non-critique ...
Difficultés
Vivacité : on veut passer la main dans le bon ordre
→utilisation d’une file d’attente
acquerir et relacher doivent être atomiques !
Elles sont elles-même des SC pour l’état du sémaphore et de la
file. . .
Info32b Systèmes d’Exploitation Nicolas Sabouret 25/37
Synchronisation de processus Méthodes de synchronisation Conclusion
Mutex Algorithme de Dekker Sémaphores Moniteurs Synchronisation en Java
Sémaphore : implémentation
Appels systèmes
disableInterrupt et enableInterrupt
→ bloquer l’ordonnancement !
wait et notify
→ pour mettre la thread en attente
Sémaphore : implémentation
Appels systèmes
disableInterrupt et enableInterrupt
→ bloquer l’ordonnancement !
wait et notify
→ pour mettre la thread en attente
Principe
acquerir et relacher commencent chacune par un
disableInterrupt et se terminent par un enableInterrupt
Dans acquerir, si la file n’est pas vide, appeler wait
Dans relacher, appeler notify
Sémaphore : code
int S = 0;
LinkedList < Thread > file = new LinkedList < Thread >();
...
}
Sémaphore : code II
public class Semaphore {
int S = 0;
LinkedList < Thread > file = new LinkedList < Thread >();
...
Sémaphore : code II
int S = 0;
LinkedList < Thread > file = new LinkedList < Thread >();
...
Remarque
Le compteur S du sémaphore permet de contrôler l’accès à plus
d’une seule ressource de même type. . .
Interblocages et sémaphores
Interblocages
Les sémaphores sont des ressources partagées
C’est l’utilisateur (le programmeur) qui décide quand sont
utilisés les sémaphores
→ risque d’interblocage !
Thread 1 Thread 2
S1.acquerir(); S2.acquerir();
S2.acquerir(); S1.acquerir();
... ...
S1.relacher(); S2.relacher();
S2.relacher(); S1.relacher();
Espace partagé
Semaphore S1, S2;
Interblocages et sémaphores
Interblocages
Les sémaphores sont des ressources partagées
C’est l’utilisateur (le programmeur) qui décide quand sont
utilisés les sémaphores
→ risque d’interblocage !
Thread 1 Thread 2
S1.acquerir(); S2.acquerir();
S2.acquerir(); S1.acquerir();
... ...
S1.relacher(); S2.relacher();
S2.relacher(); S1.relacher();
Espace partagé
Semaphore S1, S2;
Interblocages et sémaphores
Interblocages
Les sémaphores sont des ressources partagées
C’est l’utilisateur (le programmeur) qui décide quand sont
utilisés les sémaphores
→ risque d’interblocage !
Thread 1 Thread 2
S1.acquerir(); S2.acquerir();
S2.acquerir(); S1.acquerir();
... ...
S1.relacher(); S2.relacher();
S2.relacher(); S1.relacher();
Espace partagé
Semaphore S1, S2;
Interblocages et sémaphores
Interblocages
Les sémaphores sont des ressources partagées
C’est l’utilisateur (le programmeur) qui décide quand sont
utilisés les sémaphores
→ risque d’interblocage !
Thread 1 Thread 2
S1.acquerir(); S2.acquerir();
bloqué S2.acquerir(); S1.acquerir();
... ...
S1.relacher(); S2.relacher();
S2.relacher(); S1.relacher();
Espace partagé
Semaphore S1, S2;
Interblocages et sémaphores
Interblocages
Les sémaphores sont des ressources partagées
C’est l’utilisateur (le programmeur) qui décide quand sont
utilisés les sémaphores
→ risque d’interblocage !
Thread 1 Thread 2
S1.acquerir(); S2.acquerir();
bloqué S2.acquerir(); bloqué S1.acquerir();
... ...
S1.relacher(); S2.relacher();
S2.relacher(); S1.relacher();
Espace partagé
Semaphore S1, S2;
Interblocages et sémaphores
Interblocages
Les sémaphores sont des ressources partagées
C’est l’utilisateur (le programmeur) qui décide quand sont
utilisés les sémaphores
→ risque d’interblocage !
Utilisation
Le sémaphore garantit l’exclusion mutuelle, la vivacité, la
non-famine
Le programmeur doit s’assurer qu’il ne crée pas d’interblocage
Moniteurs
Principe
Repose sur le principe de la programmation par objet.
Moniteurs
Principe
Repose sur le principe de la programmation par objet.
Exemple
Mot-clef synchronize en Java = moniteur simplifié
Sémaphore : utilisation
Principe
Application de la programmation orientée objets aux sémaphores :
un sémaphore pour chaque objet.
Sémaphore : utilisation
Principe
Application de la programmation orientée objets aux sémaphores :
un sémaphore pour chaque objet.
Sémaphore : utilisation
Principe
Application de la programmation orientée objets aux sémaphores :
un sémaphore pour chaque objet.
Nomenclature
Le moniteur désigne le mécanisme ;
Les objets associés aux sémaphores sont appelés des
conditions.
Moniteurs en Java
Principe
1 moniteur par objet
attente = bloc synchronize(objet) {
relâcher = fin du bloc synchronize }
Moniteurs en Java
Principe
1 moniteur par objet
attente = bloc synchronize(objet) {
relâcher = fin du bloc synchronize }
Méthodes
Possibilité de déclarer tout une méthode synchronized
Équivalent à un bloc synchronized(this) englobant tout le
corps de la fonction
Moniteurs en Java
Principe
1 moniteur par objet
attente = bloc synchronize(objet) {
relâcher = fin du bloc synchronize }
Méthodes
Possibilité de déclarer tout une méthode synchronized
Équivalent à un bloc synchronized(this) englobant tout le
corps de la fonction
Conséquences
Une seule thread à la fois dans un bloc synchronize pour un
objet donné
Info32b Systèmes d’Exploitation Nicolas Sabouret 33/37
Synchronisation de processus Méthodes de synchronisation Conclusion
Mutex Algorithme de Dekker Sémaphores Moniteurs Synchronisation en Java
Moniteurs en Java
Attention
Une thread qui possède un verrou peut rentrer dans n’importe
quelle méthode (verrou récursif)
Une thread peut verrouiller plusieurs objets (risque
d’interblocage)
Tout bloc non synchronized peut être appelé par n’importe
qui n’importe quand
Méthodes wait et notify de la classe Object appelables dans
un bloc synchronized (uniquement)
Démo
Plan
1 Synchronisation de processus
2 Méthodes de synchronisation
3 Conclusion
Synthèse