SE03
SE03
SE03
Sémaphores
Systèmes d’exploitation 2 – L3
1
Les sémaphores
• Introduit par Dijkstra en 1965 pour résoudre le
problème d’exclusion mutuelle.
• Permettent l’utilisation de m ressources
identiques (exple imprimantes) par n processus.
• Un sémaphore est une structure contenant deux
champs :
– Struct {n : entier ;
en_attente : file de processus
}
2
Sémaphores: Définition(1)
• Un sémaphore est une variable globale
protégée, c’est à dire on peut y accéder
qu’au moyen des trois procédures :
– I(S, x) : initialiser le sémaphore S à une certaine
valeur x;
– P(S) ; Peut -on passer ?/peut-on continuer?
– V(S) ; libérer?/vas y?
3
Sémaphores: définition (2)
• Un sémaphore binaire est un sémaphore
dont la valeur peut prendre que deux valeurs
positives possibles : en générale 1 et 0.
• Un sémaphore de comptage : la valeur peut
prendre plus de deux valeurs positives
possibles.
– Il est utile pour allouer une ressource parmi
plusieurs exemplaires identiques : la valeur est
initialisée avec le nombre de ressources.
4
Sémaphores: définition (3)
• Sémaphore = structure de donnée est composée de :
• d’un compteur pouvant prendre des valeurs entières
(négatives, positives ou nulles) ;
• d’une liste de processus en attente ;
• deux primitives atomiques manipulant le sémaphore :
– P(s) : décrémente le compteur associé au sémaphore. Si sa
valeur est négative, le processus se bloque dans la file
d’attente
– V(s) : incrémente le compteur associé au sémaphore. Si le
compteur est négatif ou nul, un processus est choisi dans la
file d’attente est devient actif.
5
Sémaphores: Réalisations
logicielles
– I(S, x) {S.n :=x ; }
– P(S) /*S.n est tjs modifié par P(S)*/
{ S.n :=S.n -1 ;
Si S.n < 0 alors bloquer le processus en fin de
S.en_attente ;}
– V(S) /*S.n est tjs modifié par V(S)*/
{ S.n :=S.n + 1 ;
Si S.n <= 0 alors débloquer le processus en
tête de S.en_attente ; } 6
Réalisations logicielles des
primitives P et V
• Problème de l’exclusion mutuelle:
– initialiser S à 1, et la procédure d’entrée est
P(S), et la procédure de sortie est V(S)
• P et V sont des primitives plutôt que des
procédures car elles sont non interruptibles
– possible sur monoprocesseur par masquage
d'Interruption.
7
Réalisations logicielles des
primitives P et V (2)
• L’initialisation dépend du nombre de
processus pouvant effectuer en même temps
une même " section critique " :
– Exemple: m, si on a m imprimantes identiques;
• Cette implémentation donne à chaque fois
dans S.n le nombre de ressources libres :
• lorsque S.n est négative, sa valeur absolue
donne le nombre de processus dans la file.
8
Sémaphores: une deuxième
implantation logicielle
• Traduction directe de la spécification fonctionnelle:
– P(S) {
Si S.n > 0 alors S.n =S.n -1 ;
Sinon bloquer le processus en fin de S.en_attente ;
}
– V(S) {
Si S.en_attente non-vide alors débloquer le
processus en tête de S.en_attente ;
sinon S.n :=S.n +1 ;} 9
Sémaphore d'exclusion Mutuelle
Var mutex : sémaphore init. à 1
Processus Pi
Début
..
P(mutex)
SC
V(mutex)
...
Fin.
10
Sémaphores d’exclusion
mutuelle: interblocage
Processus1 Processus2
P(semA) P(semB)
P(semB) P(semA)
SC SC
V(semA) V(semB)
V(semB) V(semA)
11
Sémaphore de synchronisation:
principe
• Un processus doit attendre un autre pour
continuer (ou commencer) son exécution.
Processus1 Processus2
1 er travail P(sem)//attente process1
12
Exemple:Producteur/
Consommateur
Solution naïve : Attente active
Déclaration communes :
Type messages : suite de caractères ;
Variables communes :
Tampon : tableau [0..N-1] de messages ;
tête, queue: entier init. à 1
Producteur Consommateur
Var privée Var privée
Mess1 : messages ; Mess2 : messages ;
Répéter Répéter
Produire (Mess1) ; Tant que tête = queue faire attente
Tampon[tête] :=Mess1; Mess2 := Tampon[queue] ;
tête := tête +1 ; queue := queue + 1 ;
Jusqu’à faux ; Consommer (Mess2) ;
Jusqu’à faux ; 13
Sémaphores:
Producteur/consommateur
Cas :Tampon circulaire :
Déclaration communes :
Type messages : suite de caractères ;
Variables communes :
Tampon : tableau [0..N-1] de messages ;
NPLEIN : sémaphore initialisé à 0 ;
NVIDE : sémaphore initialisé à N ;
Producteur Consommateur
Var privée Var privée
Mess1 : messages ; Mess2 : messages ;
Tête : entier init. 1 ; Queue : entier init. 1
Répéter Répéter
Produire (Mess1) ; P(NPLEIN) ;
P(NVIDE) ; Mess2 := Tampon[queue] ;
Tampon[tête] :=Mess1; queue := queue + 1 mod N;
tête := tête +1 mod N; V(NVIDE) ;
V(NPLEIN) ; Consommer (Mess2) ;
Jusqu’à faux ; Jusqu’à faux ; 14
Exemples – Problèmes
classiques
15
Philosophes chinois
• Description du problème : cinq philosophes chinois sont assis autour
d'une table ronde. Chacun d'eux a devant lui un plat. Une baguette
sépare deux assiettes mitoyennes. Un philosophe partage son temps
entre deux actions : manger et penser.
• Lorsqu'un philosophe a faim, il tente de s'emparer de deux baguettes;
s'il les obtient il mange un certain temps avant de reposer ces baguettes
et de se remettre a penser.
• Conséquence de la loi de Murphy : un philosophe peut ne jamais avoir
deux baguettes; chaque philosophe peut en avoir une.
• Objectif : organiser le comportement de chaque philosophe pour éviter
les privations et les blocages.
16
Rédacteurs - lecteurs
• Ce problème modélise les accès a une base de données : un ensemble
de processus tente constamment d’accéder a la base de données soit
pour écrire, soit pour lire des informations.
• Afin d'assurer une certaine cohérence des données de la base, il faut
interdire l'accès (en lecture et en écriture) à l'ensemble des processus,
si un processus est en train de modifier la base (accède a la base en
mode écriture).
• Par contre, plusieurs processus peuvent accéder a la base, en même
temps, en mode lecture.
• Dans ce cadre :
– les rédacteurs représentent les processus qui demandent des accès en écriture a la
base de données;
– les lecteurs représentent les processus qui demandent des accès en lecture a la base
de données.
17
Avantage des sémaphores
(par rapport aux solutions précédentes)
Une seule variable partagée par section
critique
deux seules opérations: P, V
contrôle plus localisé (que avec les précéds)
extension facile au cas de plusieurs processus
possibilité de faire entrer plusieurs processus à
la fois dans une section critique
gestion de files d`attente par le SE: famine
évitée si le SE est équitable (p.ex. files FIFO)
18
Problème avec sémaphores: difficulté de
programmation
P et V sont dispersés parmi plusieurs
processus, mais ils doivent se correspondre
V. programme du tampon borné
Utilisation doit être correcte dans tous les
processus
Un seul “mauvais” processus peut faire
échouer toute une collection de processus
(p.ex. oublie de faire V)
Considérez le cas d`un processus qui a des P
et des V dans des boucles et des tests...
19
Interblocage
• L'interblocage est un des plus grand dangers des sémaphores simples, par
exemple
Processus_1 Processus_2
{1} P (s1); {1'} P (s2);
{2} P (s2); {2'} P (s1);
{3} Section_Critique_1; {3'} Section_Critique_2;
{4} V (s2); {4'} V (s1);
{5} V (s1); {5'} V (s2);
20
Attente indéfinie en section critique et
Privation (ou famine)
• Le fonctionnement satisfaisant de l'exclusion mutuelle par les
sémaphores suppose qu'un processus qui est rentré dans sa section
critique finit toujours par en sortir en un temps fini. Mais cela est laissé
à la responsabilité de l'utilisateur, ce qui est risqué. Pour remédier à cet
inconvénient, il faut qu'un mécanisme externe (le système
d'exploitation en général, si c'est lui qui gère les sémaphores) prenne
en charge ces situations (c'est aussi le S.E. qui gère les morts des
processus).
• La sémantique des sémaphores ne précisant pas la façon de gérer les
files d'attente, certains processus bloqués peuvent se trouver
indéfiniment privés des ressources critiques. Les files organisées en
FIFO garantissent les processus contre la famine.
21