Vous êtes sur la page 1sur 2

Université de Blida 1 Système d’exploitation 2

Département d’informatique 3ème SIQ

Chapitre 3 : Synchronisation des processus par les sémaphores


1. Introduction
Dans un système d'exploitation multiprogrammé en temps partagé, plusieurs processus s'exécutent
en pseudo-parallèle ou en parallèle et partagent des objets (mémoires, imprimantes, etc.). Le
partage d'objets sans précaution particulière peut conduire à des résultats imprévisibles. La solution
au problème s'appelle synchronisation des processus.
Pour contrôler les accès à un objet partagé, Dijkstra suggéra l'emploi d'un nouveau mécanisme de
synchronisation appelée le sémaphore. Il s’agît d’une structure de données qui comprend (1) une
variable entière non négative donnant le nombre de ressources disponibles et (2) une file d’attente
de processus.
L'objectif des outils de synchronisation est d'éviter l'attente active "monopolisation du processeur
dans une boucle d'attente vide".

2. Définition
Un sémaphore S est constitué par un couple composé de :
 Un compteur entier e(S) appelé valeur du sémaphore S.
 Une file d’attente associée F(S) où seront insérés les processus en attente de la ressource.
Sur le sémaphore S seront définies deux procédures indivisibles : P(S) et V(S) (qui s'exécutent en
exclusion mutuelle).
La valeur du compteur e(S) est initialisée à e0(S) et sera toujours un entier non négatif (≥0). Cette
valeur représente le nombre d’unités libres de la ressource. Elle est utilisée pour déterminer si un
processus peut ou non continuer son exécution.
Les processus qui ne peuvent pas continuer leur exécution sont mis dans la file d’attente associée au
sémaphore.
Il est important de noter que les seules actions permises sur e(S) et F(S) ne sont que les procédures
P(S) et V(S) tel que :
Algorithme de P(S) : Algorithme de V(S) :
Début Début
e(S)=e(S)-1 ; e(S)=e(S)+1 ;
si e(S) < 0 alors si e(S) ≤ 0 alors
Mettre le processus appelant dans F(S) Retirer un processus de F(S) et le
avec état bloqué. réveiller.
Fin. Fin.

3. Propriétés des sémaphores


La définition d'un sémaphore et des primitives P et V a les conséquences suivantes:
• Un sémaphore ne peut pas être initialisé à une valeur négative, mais il peut devenir négatif après
un certain nombre d'opérations P.
• Un processus qui invoque la primitive V sur un sémaphore, réveillera un autre processus bloqué
derrière ce sémaphore, si sa valeur est inférieure ou égale à 0.
• L'invocation de la primitive P sur un sémaphore par un processus peut avoir l'un des effets
suivants:
 Le processus sera bloqué et mis dans la liste associée au sémaphore; lorsque la valeur du
sémaphore est inférieure à zéro.
 Lorsque la valeur du sémaphore est supérieure ou égale à zéro; le processus continue son
exécution normalement.
• La valeur d'un sémaphore dénote :
 Soit le nombre de processus bloqués derrière ce sémaphore (valeur <0),
 Soit le nombre de processus qui peuvent exécuter la primitive P sans être bloqués (valeur>=0).

Chargée de cours Docteur N. TOUBALINE 1/2


Université de Blida 1 Système d’exploitation 2
Département d’informatique 3ème SIQ

4. Exemple d’utilisation de sémaphores

On considère deux catégories de processus : des Producteurs et des Consommateurs


Il s'agit de producteurs qui produisent des objets (valeur quelconque) et les déposent dans une
mémoire commune appelée Tampon.
Les processus consommateurs utilisent les valeurs déposées dans le tampon.
Le tampon étant de taille limitée N.

Contraintes de synchronisation:( Schéma de synchronisation)


Le fonctionnement de ces deux catégories de processus doit satisfaire les contraintes suivantes:
 Les producteurs ne déposent pas les objets lorsque le tampon est plein.
 Les consommateurs ne consomment pas du tampon lorsqu'il est vide.
 Un seul processus pourra accéder au tampon à un moment donné.
 Les objets ne doivent pas être perdu ni consommés deux fois.

Solution: Utilisation de trois sémaphores.


 Plein bloque la production
 Vide bloque la consommation
 Mutex assure l'exclusion mutuelle pour l'accès au tampon.

Program ProducteursConsommateurs;
Const N=…;
Type objet=….;
Var Tampon : Array [0…N-1] of objet;
Mutex : Semaphore Initial Value = 1;
Vide : Semaphore Initial Value = N;
Plein : Semaphore Initial Value = 0;

Process Producteur-I; Process Consommateur-j;


Var objetproduit:objet; Var objetconsomme: objet;
Begin Begin
Repeat Repeat
Produire (objetproduit); P(Plein)
P(Vide) P(Mutex)
P(Mutex) Retirer(tampon , objetconsomme);
Deposer(objetproduit,tampon); V(Mutex)
V(Mutex) V(Vide)
V(Plein) consommer(objetconsomme);
Until Fin= true; Until Fin= true;
End ; End ;

Begin
ParBegin
Producteur-1;Producteur-2; Producteur-3; …….; Producteur-I;
Consommateur-1; Consommateur-2; Consommateur-3;……;Consommateur-j;
ParEnd;
End;

La consommation et la production se font à l'extérieur de la section critique afin de minimiser le


temps passé dans la section critique.

Chargée de cours Docteur N. TOUBALINE 2/2

Vous aimerez peut-être aussi