Académique Documents
Professionnel Documents
Culture Documents
Chapitre 5 - Synchronisation Avec Sémaphores
Chapitre 5 - Synchronisation Avec Sémaphores
d’exploitation centralisés
Chapitre 5
Les Processus :
La Synchronisation avec
les sémaphores
Mme L. BOUZAR
© 2020-2021
-1-
1. L’Exclusion Mutuelle
2. Synchronisation des processus avec sémaphores
3. Outils de synchronisation de haut niveau:
Les moniteurs
-2-
Synchronisation des processus avec sémaphores
1. Introduction
2. Définition
3. Comment exprimer les contraintes de synchronisation ?
4. Spécification de la synchronisation
5. Les problèmes types
6. Exemples
6.1 Allocation d’une imprimante
6.2 Rendez-vous
6.2.1 Rendez-vous de deux processus
6.2.2 Rendez-vous de trois processus
6.2.3 Rendez-vous de n processus
6.3 Le modèle des lecteurs/rédacteurs
6.3.1 Ordre d’accès au fichier est quelconque
6.3.2 Ordre d’accès au fichier est FIFO
-3-
6.4 Communication par variables communes
6.4.1 Définitions
6.4.2 Propriétés de la communication
6.4.3 Schéma général du producteur-consommateur
6.4.4 Producteur-consommateur avec un tampon à un seul élément
6.4.5 Producteur-consommateur avec un tampon à n éléments
6.4.6 Plusieurs producteurs et plusieurs consommateurs
6.4.7 Producteur-consommateur avec un tampon à éléments alloués
dynamiquement
7. La communication interprocessus : IPC Unix System V
7.1 Introduction
7.2 Identification d’une IPC
7.3 Les segments de mémoire partagée
7.3.1 Utilisation d’un segment de mémoire partagée
7.3.2 Fonctions de manipulation des segments de mémoire
partagée
7.3.3 Exemple : Création et d’utilisation d’un segment de mémoire- 4 -
7.4 Les Sémaphores Unix System V
7.4.1 Utilisation des sémaphores Unix system V
7.4.2 Création d’un ensemble de sémaphores
7.4.3 Initialisation d’un ensemble de sémaphores
7.4.4 Opérations sur un ensemble de sémaphores
7.4.5 Destruction d’un sémaphore
7.4.6 Exemple
7.5 Gestion des IPC avec des commandes shell
-5-
La Synchronisation des processus
1. Introduction
Exemple :
Soient deux Processus concurrents P1 et P2 qui coopèrent pour lire et
imprimer le contenu d’un fichier f.
Le fichier f est composé d’un ensemble d’articles.
On dispose de deux procédures :
• Lire(f, article): permet de lire un article du fichier f et le ranger
dans la zone utilisateur d’adresse « article ».
• Ecrire(article) : permet d’afficher/imprimer le contenu de la zone
utilisateur « article » sur l’écran/l’imprimante.
On dispose en mémoire centrale d’un seul tampon qui est partagé par
les deux processus. -6-
-7-
tampon T init(‘’’’); /* T: initialiser à vide */
Processus P1 Processus P2
Structure … artcle1; Structure … artcle2;
Début Début
Lire(article1,f);
Signaler(dépôt); Signaler(retrait);
Lire(article1,f); Ecrire(article2);
Finfaire; Finfaire;
T=‘’fin’’; Fin;
Fin;
-8-
Déposer(article,T) Retirer(article,T)
Début Début
Si tampon T est plein alors Si T est vide alors
Attendre; Attendre;
T = article; Article = T;
Fin; Fin;
- 11 -
3. Comment exprimer les contraintes de
synchronisation ?
1. Imposer un ordre de précédence dans le temps logique, pour l’exécution
des actions des processus .
Exemples:
a) La précédence
Exécuter l’action i du processus P1 avant l’action j du processus P2.
b) Le rendez-vous
Deux étudiants de fixent un rendez-vous pour travailler ensemble.
Etudiant 1 Etudiant 2
Début Début
. . . . . .
Attendre étudiant 2; Attendre étudiant1;
Travailler ensemble; Travailler ensemble;
- 12 -
La forme d’un programme de rendez-vous
Debut i
. . .
Rendez-vous i; *
* Suite i;
Fin i
* i, j : fin(rendez-vous i) avant début(suite j)
Aucun processus i ne peut exécuter la séquence suite i que si tous
les autres processus sont arrivés à leur point de rendez-vous.
Processus P1 Processus P2
Lire(article1,f);
Signaler(dépôt); Signaler(retrait);
Lire(article1,f); Ecrire(article2);
Finfaire; Finfaire;
T=‘’fin’’;
• - 15 -
● Points de synchronisation :
Déposer (article1,T), Retirer(article2,T), Signaler(dépôt) et
Signaler(retrait).
· Variable d’état:
Etat du tampon (vide ou plein).
- 16 -
5. Les problèmes types
● Les problèmes de synchronisation rencontrés dans la pratique
peuvent, dans leur grande majorité, se ramener à des combinaisons
d’un petit nombre de situations élémentaires pour lesquelles des
schémas de solutions sont connus.
● Les problèmes types peuvent être regroupés en trois classes:
1) Exclusion Mutuelle(première partie de ce chapitre)
Processus i
Début
Demander(imprimante); Demande d’entrée en section critique
<Utiliser l'imprimante > < section critique >
Restituer(imprimante); Sortie de la section critique;
Fin;
• L’imprimante a deux états libre ou occupé. - 18 -
● Solution avec les sémaphores
Soit slibre le sémaphore d’exclusion mutuelle protégeant cette
imprimante :
Sémaphore slibre init 1;
Processus i
Début
P(slibre);
<Utiliser l'imprimante ; >
V(slibre);
Fin;
- 19 -
b) m processus se partagent n imprimantes
Schéma général d’un processus i :
Processus i
Début
Demander(imprimante);
<Utiliser l'imprimante ; >
Restituer(imprimante);
Fin;
Il y a n imprimantes n processus sur m peuvent travailler
(imprimer) simultanément : C’est une ressource critique à n points
d’entrée.
Demander(imprimante) Restituer(imprimante)
Début Début
P(slibre); V(slibre);
Fin Fin
- 22 -
4) Deux Variables d’état
Les variables d’état représentent :
• Le nombre de ressources(imprimantes) demandées : nbd,
• Le nombre de ressources(imprimantes) occupées : nbo.
• Soit nbimp une variable ou constante système contenant le nombre
d’imprimantes.
Entier nbimp init n;
Entier nbo init 0 ; Entier nbd init 0 ;
Demander(imprimante) Restituer(imprimante)
Début Début
nbd = nbd + 1; nbo = nbo - 1;
si nbo = nbimp alors attendre; Si nbd > 0 alors
Sinon nbd = nbd - 1;
nbd = nbd - 1; nbo = nbo + 1;
nbo = nbo + 1; Réveiller un processus;
finsi finsi;
- 23 -
Solution à l’aide des sémaphores :
- 24 -
Entier nbimp init n; /* variable ou constante */
Entier nbo init 0; Entier nbd init 0;
Sémaphore s init 0;
Demander(imprimante) Restituer(imprimante)
Début Début
nbd = nbd + 1; nbo = nbo - 1;
Si nbo == nbimp alors Si nbd > 0 alors
nbd = nbd – 1;
nbo = nbo + 1;
/*Attendre */ /* Réveiller un processus */
P(s); V(s);
Sinon Finsi
nbd = nbd - 1;
nbo = nbo + 1;
Finsi
Fin Fin
P(s); V(s);
Sinon Finsi
nbd = nbd - 1;
nbo = nbo + 1;
V(mutex); V(mutex);
Finsi
Fin Fin - 26 -
6.2 Rendez-vous de processus
6.2.1 Rendez-vous de deux processus : P1 et P2
P1 P2
Début Début
… …
Signaler son arrivée à P2; Signaler son arrivée à P1;
Attendre P2; Attendre P1;
… …
Fin Fin
P1 P2 P3
Début Début Début
… … …
Signaler son arrivée Signaler son arrivée Signaler son arrivée
à P2 et P3; à P1 et P3; à P1 et P2;
Attendre P2 et P3; Attendre P1 et P3; Attendre P1 et P2;
… … …
Fin Fin Fin
- 29 -
1) Le dernier processus réveil les (n-1) processus précédents
Processus i (i=0 à n-1)
Début
P(mutex);
cpt=cpt +1;
Si cpt < n alors /* processus 0 à n-2 */
V(mutex); /* Sortir de la SC avant de se mettre en attente */
p(s); /* se mettre en attente */
Sinon /* dernier processus*/
cpt=0;
v(mutex); /* Sortir de la SC */
/* réveiller le (n-1) processus */
Pour j=1 à n-1 faire
v(s);
finpour
Finsi;
Fin
- 30 -
2) Réveil en ‘‘cascade ’’
Processus i (i=0 à n-1)
Début
P(mutex);
cpt=cpt +1;
Si cpt < n alors /* processus 0 à n-2 */
V(mutex); /* Sortir de la SC avant de se mettre en attente */
P(s); /* se mettre en attente */
V(s); /* Réveiller le processus suivant */
Sinon /* dernier processus*/
cpt=0;
V(mutex); /* Sortir de la SC */
V(s); /* réveiller le premier processus */
P(s); /* se mettre en attente */
/* le dernier processus est réveillé par l’avant dernier */
Finsi
Fin
- 31 -
6.3 Le modèle des lecteurs/rédacteurs
Considérons deux classes de processus appelés : Lecteurs et
Rédacteurs.
Ces processus se partagent un fichier f.
- 34 -
Sémaphore sf init 1;
Entier nl init 0;
Sémaphore mutex init 1;
Lecteurs Rédacteurs
Début Début
/* demande de lecture */ /* demande d'écriture */
p(mutex); p(sf);
nl=nl+1;
si nl=1 alors p(sf); < écrire >
v(mutex);
< lire > /* fin d'écriture */
/* fin de lecture */ v(sf);
p(mutex); Fin;
nl=nl-1;
si nl=0 alors v(sf);
Remarque : Risque de
v(mutex);
privation pour les rédacteurs.
Fin; - 35 -
6.2.2 Ordre d’accès au fichier f selon FIFO
Sémaphore sf init 1;
Sémaphore sfifo init 1; /*sémaphore imposant l’ordre d’accès FIFO */
Entier nl init(0);
Sémaphore mutex init 1;
Lecteurs Rédacteurs
Début Début
/* demande de lecture */ /* demande d'écriture */
P(sfifo); P(sfifo);
p(mutex); p(sf);
nl=nl+1; V(sfifo);
si nl=1 alors p(sf);
v(mutex); < écrire >
V(sfifo);
< lire > /* fin d'écriture */
/* fin de lecture */ v(sf);
p(mutex); Fin;
nl=nl-1;
si nl=0 alors v(sf);
v(mutex);
Fin; - 36 -
6.4 Communication par variables communes
6.4.1 Définitions
• Soit T un tampon(buffer) accessible à l’ensemble des processus
voulant communiquer.
• On distingue deux classes de processus :
1. Producteur : processus désirant déposer de l’information dans
un tampon T
2. Consommateur : un processus désirant retirer de l’information
d’un tampon T.
- 37 -
6.4.2 Propriétés de la communication
La communication par variable(s) commune(s) est :
Indirecte : le producteur et le consommateur ne s’adressent pas
l’un à l’autre.
- 38 -
Deux types de problèmes à traiter dans la communication par
variables communes :
1. La synchronisation des processus
· Un producteur ne peut déposer un message que s’il y a de la
place disponible dans le tampon(buffer).
· Un consommateur ne peut retirer un message que s’il y en a de
disponible.
· Les producteurs et les consommateurs ne peuvent accéder
simultanément au tampon que selon certaines règles assurant
l’intégrité de l’information.
2. La transmission
C'est le moyen par lequel l’information est communiquée :
Elle concerne la gestion du tampon T.
- 39 -
6.4.3 Schéma général du producteur-consommateur
· Le système de communication : il est composé
du tampon : T,
du mécanisme de synchronisation : Sémaphores ,
des primitives de communication :
Envoyer(message) et Recevoir(message).
· Soient
Un producteur désirant envoyer un message Mp dans un système
de communication et
Un consommateur désirant retirer un message Mc de ce même
système de communication.
- 40 -
Producteur Consommateur
Répéter Répéter
Produire(Mp); Recevoir(Mc);
Envoyer(Mp); Consommer(Mc);
Jusqu’à faux; Jusqu’à faux;
Fin; Fin;
· Décomposant les procédures Envoyer et Recevoir en séparant le
problème de synchronisation et de celui de la transmission :
Producteur Consommateur
Procédure Envoyer(Mp) Procédure Recevoir(Mc)
Demande de dépôt ; Demande de retrait;
Déposer(Mp); Retirer(Mc);
Signaler dépôt; Signaler retrait;
Fin; Fin;
· Synchronisation : Demande de dépôt, Signaler dépôt,
Demande de retrait, signaler retrait.
- 44 -
6.4.5 Producteur-Consommateur avec un tampon à n éléments
· Nombre fixe d’éléments du tampon égal à n.
· n est connu par le producteur et le consommateur.
· Un producteur ne peut déposer une information dans un élément
du tampon que si le consommateur a retiré la précédente.
· Les éléments du tampon sont consommés dans le même ordre que
leur production.
· Chaque élément du tampon à deux états : plein et vide.
· Producteur : Déposer s’il y a un élément vide dans le tampon.
· Consommateur : Retirer s’il y a un élément plein dans le
Tampon.
- 45 -
· Réalisation avec les sémaphores
a) Synchronisation
On associe deux sémaphores splein et svide au tampon T.
splein et svide initialisés respectivement à zéro et n.
Les procédures de synchronisation ne changent pas : elles sont les
mêmes , on ne change que l’initialisation du sémaphore svide.
Sémaphore splein init 0;
Sémaphore svide init n;
Producteur Consommateur
Début Début
Répéter Répéter
Produire(Mp) P(splein);
P(svide); Retirer(Mc)
Déposer(Mp) V(svide);
V(splein); Consommer(Mc);
Jusqu’à faux; Jusqu’à faux; - 46 -
b) Gestion du tampon à n éléments
● Allocation statique du tampon.
● Le tampon sera géré de manière circulaire: On l'appelle tampon
circulaire ou buffer circulaire.
● Les éléments du tampon sont numérotés de 0 à n-1.
● Dans un tampon circulaire, on considère l'élément 0 comme le
successeur de l'élément n-1.
- 49 -
6.4.6 Plusieurs producteurs(P) et plusieurs consommateurs(C)
Ce cas pose un problème d'exclusion mutuelle au niveau de la gestion
du tampon (ou dans les procédures Déposer et Retirer):
- 50 -
Pour parcourir le tampon, chaque classe de processus (producteurs ou
consommateurs) aura son propre pointeur:
● In : pointeur (ou index) utilisé par les producteurs, c’est une
variable commune aux producteurs : ils doivent l'utiliser en
exclusion mutuelle.
● Out : pointeur (ou index) utilisé par les consommateurs. C’est une
variable commune aux consommateurs : ils doivent l'utiliser en
exclusion mutuelle.
● Les deux variables sont initialisées à 0(zéro).
● Pour protéger les variables communes in et out, on aura besoin de
deux sémaphores d'exclusion mutuelle sin et sout.
● sin et sout sont initialisés à 1.
- 51 -
Sémaphore sin init (1); Sémaphore sout init (1);
Déposer(Mp) Retirer(Mc)
p(sin); p(sout);
T[in]:= Mp; Mc := T[out];
in :=(in +1) modulo n; out:=(out +1) modulo n;
v(sin); v(sout);
Fin; Fin;
- 52 -
T: tableau[0..n-1] de tampon;
Sémaphore splein init 0;
Sémaphore svide init n;
Producteurs Consommateurs
Entier in init 0; Entier out init 0;
Sémaphore sin init 1; Sémaphore sout init 1;
Producteur i Consommateur i
Début Début
Répéter Répéter
Produire(Mp) P(splein);
P(svide); P(sout);
P(sin); Mc := T[out];
T[in]:= Mp; out:=(out +1) modulo n;
in :=(in +1) modulo n; V(sout);
V(sin); V(svide);
V(splein); Consommer(Mc);
Jusqu’à faux; Jusqu’à faux; - 53 -
6.4.7 Producteur-Consommateur avec tampon à éléments alloués
· Les éléments du tampon sont alloués dynamiquement en faisant appel
à une fonction système(ou à un allocateur de mémoire).
· Le nombre d’éléments du tampon est variable il n’est pas connu à
l’avance.
· Dans ce cas, une partie du problème de synchronisation se trouve
reporter au niveau de "l'allocateur de la mémoire".
· L’allocateur de la mémoire a pour rôle :
d'allouer aux producteurs qui lui demandent un élément de tampon,
de libérer les éléments restitués par les consommateurs.
Allocateur
Procédure allouer( élément);
Procédure restituer(élément);
Fin; - 54 -
Réalisation des procédures au moyen des sémaphores
● Considérons deux primitives allouer(élément) et
restituer(élément) permettant respectivement l'allocation et la
libération d'un élément du tampon.
● On utilise un seul sémaphore splein initialisé à zéro.
● Ce sémaphore permet d'une part, au producteur de signaler le
dépôt de messages et d'autre part, il permet au consommateur de
vérifier la présence de message dans le tampon.
Tampon *T; /* le tampon est une liste */
splein: sémaphore init 0;
Procédure Demande_de_dépôt Procédure Demande_de_retrait
Allouer(élément); P(splein);
Fin; Fin;
- 56 -