Problèmes et solutions de synchronisation
Problèmes et solutions de synchronisation
[Link]
20 mars 2025
1 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
2 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem
Sémaphore Dénitions
Problème classique de synchronisation
Les Moniteurs
Process Synchronization
Objectifs du chapitre
3 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem
Sémaphore Dénitions
Problème classique de synchronisation
Les Moniteurs
Process Synchronization
Dénitions
4 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem
Sémaphore Dénitions
Problème classique de synchronisation
Les Moniteurs
Process Synchronization
Exemple - Compte Bancaire-
5 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem
Sémaphore Dénitions
Problème classique de synchronisation
Les Moniteurs
Process Synchronization
Exemple - Compte Bancaire-
Deux opérations sur le même compte exécutées en concurrence : Concurrence avec problème
Compte .
6 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem Dénitions
Sémaphore Caractéristique
Problème classique de synchronisation Solutions Critical-section
Les Moniteurs
Ressource critique
Une ressource est dite ressource critique lorsque des accès concurrents
à cette ressources peuvent résulter dans un état incohérent.
7 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem Dénitions
Sémaphore Caractéristique
Problème classique de synchronisation Solutions Critical-section
Les Moniteurs
Ressource critique
Une ressource est dite ressource critique lorsque des accès concurrents
à cette ressources peuvent résulter dans un état incohérent.
Race condition
On parle aussi de situation de compétition(race condition) pour décrire
une situation dont l'issue dépend de l'ordre dans lequel les opérations
sont eectuées.
7 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem Dénitions
Sémaphore Caractéristique
Problème classique de synchronisation Solutions Critical-section
Les Moniteurs
Ressource critique
Une ressource est dite ressource critique lorsque des accès concurrents
à cette ressources peuvent résulter dans un état incohérent.
Race condition
On parle aussi de situation de compétition(race condition) pour décrire
une situation dont l'issue dépend de l'ordre dans lequel les opérations
sont eectuées.
Section atomique
Une section de programme est dite atomique lorsqu'elle ne peut pas être
interrompue par un autre process manipulant les mêmes ressources
critiques. C'est donc une atomicité relative à la ressource.
7 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem Dénitions
Sémaphore Caractéristique
Problème classique de synchronisation Solutions Critical-section
Les Moniteurs
Critical-section
Critical-section est une section de programme manipulant une ressource
critique.
8 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem Dénitions
Sémaphore Caractéristique
Problème classique de synchronisation Solutions Critical-section
Les Moniteurs
Critical-section
Critical-section est une section de programme manipulant une ressource
critique.
Mutual exclusion
Un mécanisme d'exclusion mutuelle sert à assurer l'atomicité des sections
critiques relatives à une ressource critique.
Une ressource est en exclusion mutuelle si seul un processus peut utiliser
la ressource à un instant donné.
8 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem Dénitions
Sémaphore Caractéristique
Problème classique de synchronisation Solutions Critical-section
Les Moniteurs
9 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem Dénitions
Sémaphore Caractéristique
Problème classique de synchronisation Solutions Critical-section
Les Moniteurs
10 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem Dénitions
Sémaphore Caractéristique
Problème classique de synchronisation Solutions Critical-section
Les Moniteurs
P1 P2
entry_Critical_section(. . ..) ; entry_Critical_section( . . ...) ;
/* début la section critique */ /* début la section critique */
int tmp = compte ; int tmp = compte ;
tmp = tmp + 1000 ; tmp = tmp -500 ;
compte = tmp ; compte = tmp ;
/* n de la section critique */ /* n de la section critique */
Exit_Critical_section(. . ...) Exit_Critical_section(. . ..) ;
??
Les codes de fonctions entry_Critical_section(. . ..) ; et
Exit_Critical_section(. . ...) ;
12 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem Dénitions
Sémaphore Caractéristique
Problème classique de synchronisation Solutions Critical-section
Les Moniteurs
Critical-section problem
Solutions
13 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem Dénitions
Sémaphore Caractéristique
Problème classique de synchronisation Solutions Critical-section
Les Moniteurs
Critical-section problem
Solutions
13 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem Dénitions
Sémaphore Caractéristique
Problème classique de synchronisation Solutions Critical-section
Les Moniteurs
Critical-section problem
Solutions
13 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem Dénitions
Sémaphore Caractéristique
Problème classique de synchronisation Solutions Critical-section
Les Moniteurs
14 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem Dénitions
Sémaphore Caractéristique
Problème classique de synchronisation Solutions Critical-section
Les Moniteurs
14 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem Dénitions
Sémaphore Caractéristique
Problème classique de synchronisation Solutions Critical-section
Les Moniteurs
Critical-section solution
Le verrou -attente active-
Verrou
Un mécanisme proposé pour permettre de résoudre les concurrences
d'accès à une ressource est le mécanisme de verrou.
On utilise un booléen partagé comme Verrou
Un verrou est un objet système à deux états
(libre(unlocked)/occupé(locked)) sur lequel deux opérations sont dénies.
Lock(v) permet au process d'acquérir le verrou v s'il est libre. S'il n'est
pas disponible, le process est bloqué en attente de la ressource.
Unlock (v) permet au process de libérer le verrou v qu'il possédait.
Si un ou plusieurs process étaient en attente de ce verrou, un seul de ces
process est réactivé et reçoit le verrou.
invoquer unlock() réveille un process suspendu (s'il y en a) attention :
ordre de réveil non spécié 15 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem Dénitions
Sémaphore Caractéristique
Problème classique de synchronisation Solutions Critical-section
Les Moniteurs
Critical-section solution
Verrou -attente active-
16 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem Dénitions
Sémaphore Caractéristique
Problème classique de synchronisation Solutions Critical-section
Les Moniteurs
Critical-section solution
API POSIX (Threads)
API POSIX : Mutex locks (Threads)
17 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem Dénitions
Sémaphore Caractéristique
Problème classique de synchronisation Solutions Critical-section
Les Moniteurs
Critical-section solution
attente active
18 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem Dénitions
Sémaphore Caractéristique
Problème classique de synchronisation Solutions Critical-section
Les Moniteurs
Process Synchronization
Résumé
Exclusion mutuelle
Notion de "race condition" :
- plusieurs accès concurrents à une même variable
- accès non atomique données incohérentes
Critical section
- morceau de code qu'on veut rendre atomique
- exécution nécessairement en exclusion mutuelle
Solution : utiliser un mutex lock
lock(V) ;
/* section critique */
unlock(V) ;
Résumé des problèmes
- Attentes actives à consommation du temps CPU.
Masquage des interruptions à dangereuse pour le système
innie. SLEEP et WAKEUP à mauvaise synchronisation des signaux
(rendez-vous manqués) à blocage.
19 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem
Sémaphore Dénition
Problème classique de synchronisation
Les Moniteurs
Process Synchronization
Sémaphore
20 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem
Sémaphore Dénition
Problème classique de synchronisation
Les Moniteurs
Process Synchronization
Sémaphore
20 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem
Sémaphore Dénition
Problème classique de synchronisation
Les Moniteurs
Process Synchronization
Sémaphore
20 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem
Sémaphore Dénition
Problème classique de synchronisation
Les Moniteurs
Process Synchronization
Sémaphore
20 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem
Sémaphore Dénition
Problème classique de synchronisation
Les Moniteurs
Sémaphore
Implémentation
21 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem
Sémaphore Dénition
Problème classique de synchronisation
Les Moniteurs
Sémaphore
Implémentation WAIT
wait, P(Dijkstra(Proberen, tester))(down(algol68), sleep)
wait(S) : demande d'autorisation, qui est utilisée pour modier la
valeur du sémaphore.
Si S>0, S- - (décrémenter) (en utilisant un wakeup stockée) et poursuit
son activité
Si S==0 ,le process est placé en sommeil(le d'attente) sans que down
ne se termine
Si F(S) vide, S++, Sinon, un des process en attente (choix aléatoire)
est libéré et passe à l'état Ready.
22 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem
Sémaphore Dénition
Problème classique de synchronisation
Les Moniteurs
Sémaphore
Implémentation SIGNAL
Signal, V(Dijkstra(Verhogen,incrémenter),(up(algol68), wakeup)
signal(S) : n d'utilisation (Libérer)
Si F(S) non vide Sinon, un des process en attente (choix aléatoire) est
libéré et passe à l'état Ready et S==0 sinon S++
Si S>0, S d'une unité et la fonction réussit.
Si s==0, le process est bloqué jusqu'à ce qu'un autre process le dé-
bloque en appelant la fonction post.
Quant un process doit attendre un sémaphore, il est ajouté à la le
de process. Une opération Signal supprime un process de la le des
process en attente et réveille ce process.
L'exécution d'une opération wait(s) ou signal(s) se fait sans interac-
tion possible (de façon atomique).
23 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem
Sémaphore Dénition
Problème classique de synchronisation
Les Moniteurs
Type de sémaphore
Sémaphore binaires
24 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem
Sémaphore Dénition
Problème classique de synchronisation
Les Moniteurs
Type de sémaphore
Sémaphore de comptage
25 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem
Sémaphore Dénition
Problème classique de synchronisation
Les Moniteurs
Sémaphore
Sémaphore (Utilisation)
Problème de la section critique
n processus partagent un sémaphore,
Les sémaphores binaires permettent d'assurer l'exclusion mutuelle :
Semaphore mutex = 1 ;
Principe :
Sémaphore mutex (à cause de mutual exclusion)initialisé a 1 ;
Primitive wait en début de la section critique ;
Primitive signal en n de la section critique ;
Implémentation de Mutual exclusion avec des semaphores.
repeat
wait(mutex) ;
critical section
signal mutex()
section restante
until false ; 26 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Sémaphore
Exemple
Process P1 | Process P2
Debut | Debut
S1 | S2
Fin | Fin
S2 s'execute après S1
Process P1 | Process P2
Debut | Debut
S1 ; | Wait(S) ;
Signal(S) | S2
Fin | Fin
Comme S est initialisé à 0, Process P2 executera S2 seulement une fois
que Process P1 aura appelé signal(S), qui est après S1.
Remarque : Un sémaphore peut être initialisé à n'importe quelle valeur entière, mais
28 / 54
Introduction
The Critical-section problem
Sémaphore Dénition
Problème classique de synchronisation
Les Moniteurs
Sémaphores
Sémaphores POSIX
29 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem
Sémaphore Dénition
Problème classique de synchronisation
Les Moniteurs
Sémaphores
Sémaphores POSIX
Initialisation :
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value) ;
Une fois l'objet créé, on peut l'initialiser :
sem 7→ pointeur vers le sémaphore à initialiser ;
pshared 7→ drapeau qui précise si le sémaphore est utilisé par des threads
(valeur 0pour local et non null pour partagé) ;
value 7→ valeur de départ(initiale) du sémaphore.
le code retour varie entre :
'0' si tout s'est bien passé
'1' si une erreur survient et errno est positionné
30 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem
Sémaphore Dénition
Problème classique de synchronisation
Les Moniteurs
Sémaphores
Sémaphores POSIX
Blocage
Une fois le sémaphore initialisé, on peut demander son blocage avec
#include <semaphore.h>
int sem_wait(sem_t *sem) ;
sem 7→ pointeur vers le sémaphore à bloquer ;
le code retour varie entre :
'0' si tout s'est bien passé
'-1' si une erreur survient et errno est positionné
int sem_wait(semaphore *s)
{
s−→val = s−→val-1 ;
if(s−→val<0)
{
// Place this thread in s−→queue ;
// This thread is blocked ;
}
31 / 54
} Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem
Sémaphore Dénition
Problème classique de synchronisation
Les Moniteurs
Sémaphores
Sémaphores POSIX
Relachement d'un sémaphore
Une fois la section critique passée, on peut relâcher le sémaphore :
#include <semaphore.h>
int sem_post(sem_t *semaphore) ;
semaphore−→ pointeur vers le sémaphore bloqué ;
le code retour varie entre :
'0' si tout s'est bien passé
'-1' si une erreur survient et errno est positionné
int sem_post(semaphore *s)
{
s−→val = s−→val+1 ;
if(s−→val<=0)
{
// Remove one thread(T) from s−→queue ;
// Mark Thread(T) as ready to run ;
}
32 / 54
} Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Sémaphores
Sémaphores POSIX
Destruction
int sem_destroy(sem_t *sem) ;
sem −→ pointeur vers le sémaphore à détruire ;
le code retour varie entre :
'0' si tout s'est bien passé
'-1' si une erreur survient et errno est positionné
Sémaphores
Sémaphores POSIX
34 / 54
Process Synchronization
Sémaphore avec le d'attente
35 / 54
Process Synchronization
Sémaphore (avec le d'attente)
Dénition 2
Un sémaphore S est un ensemble de deux variables :
une valeur entière value
une le d'attente F de process
Implémentation
décrire un sémaphore comme un enregistrement
type semaphore =record
value : integer ;
L :list of process ;
end ;
36 / 54
Process Synchronization
Sémaphore (avec le d'attente)
38 / 54
Problème classique de synchronisation
Le problème des lecteurs et rédacteurs
Ce problème traite de l'accès concurrent en lecture et en écriture à
une ressource : une base de donnée. exple :réservation de billets d'avion
39 / 54
Problème classique de synchronisation
Le problème des lecteurs et rédacteurs
Ce problème traite de l'accès concurrent en lecture et en écriture à
une ressource : une base de donnée. exple :réservation de billets d'avion
Plusieurs processus légers (thread) peuvent lire en même temps la
ressource (lecteurs), aucun eet défavorable (puisqu'une lecture ne
modie pas le contenu d'une ressource) ;
Problème classique de synchronisation
Le problème des lecteurs et rédacteurs
Ce problème traite de l'accès concurrent en lecture et en écriture à
une ressource : une base de donnée. exple :réservation de billets d'avion
Plusieurs processus légers (thread) peuvent lire en même temps la
ressource (lecteurs), aucun eet défavorable (puisqu'une lecture ne
modie pas le contenu d'une ressource) ;
Si on veut actualiser (lire et écrire)-rédacteur- : si un rédacteur et
d'autres process( lecteurs où rédacteurs) accèdent simultanément à
la ressource, le chaos peut s'ensuivre. les lecteurs ne doivent pas lire
une information en cours de modication ;
Problème classique de synchronisation
Le problème des lecteurs et rédacteurs
Ce problème traite de l'accès concurrent en lecture et en écriture à
une ressource : une base de donnée. exple :réservation de billets d'avion
Plusieurs processus légers (thread) peuvent lire en même temps la
ressource (lecteurs), aucun eet défavorable (puisqu'une lecture ne
modie pas le contenu d'une ressource) ;
Si on veut actualiser (lire et écrire)-rédacteur- : si un rédacteur et
d'autres process( lecteurs où rédacteurs) accèdent simultanément à
la ressource, le chaos peut s'ensuivre. les lecteurs ne doivent pas lire
une information en cours de modication ;
Les rédacteurs demandent des accès en écriture à la ressource ;
39 / 54
Problème classique de synchronisation
Le problème des lecteurs et rédacteurs
Ce problème traite de l'accès concurrent en lecture et en écriture à
une ressource : une base de donnée. exple :réservation de billets d'avion
Plusieurs processus légers (thread) peuvent lire en même temps la
ressource (lecteurs), aucun eet défavorable (puisqu'une lecture ne
modie pas le contenu d'une ressource) ;
Si on veut actualiser (lire et écrire)-rédacteur- : si un rédacteur et
d'autres process( lecteurs où rédacteurs) accèdent simultanément à
la ressource, le chaos peut s'ensuivre. les lecteurs ne doivent pas lire
une information en cours de modication ;
Les rédacteurs demandent des accès en écriture à la ressource ;
Les lecteurs demandent des accès en lecture à la ressource.
Introduction
The Critical-section problem
Sémaphore Conclusion
Problème classique de synchronisation
Les Moniteurs
Le rédacteur (écrivain)
Un écrivain exclut les autres écrivains et les lecteurs : un écrivain
accède donc toujours seul à la ressource, autrement dit il eectue des
accès en mutual exclusion des autres écrivains et des lecteurs (un accès
exclusif).
- Le schéma du mutual exclusion (rédacteur) se fait à l'aide d'un
sémaphore redact initialisé à 1.
40 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem
Sémaphore Conclusion
Problème classique de synchronisation
Les Moniteurs
Le lecteur Un lecteur exclut les écrivains mais pas les autres lecteurs. Il
faut donc :
Le premier lecteur doit s'assurer qu'il n'y a pas d'accès en écriture
en cours ;
Le dernier lecteur doit réveiller un éventuel écrivain ;
On doit compter le nombre de lecteurs qui accèdent à la ressource.
On utilise pour cela une variable NbL, initialisée à 0. Cette variable
NbL va être accédée en concurrence par tous les lecteurs qui vont
soit incrémenter cette variable (un lecteur de plus), soit la
décrémenter (un lecteur de moins). Pour que le contenu de la
variable reste cohérent, il faut que NbL soit accédée en exclusion
mutuelle. L'accès à la variable sera donc gardé par un sémaphore
MUTEX initialisé à 1.
41 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Problème classique de synchronisation
Le problème des lecteurs et rédacteurs
42 / 54
Introduction
The Critical-section problem
Sémaphore Conclusion
Problème classique de synchronisation
Les Moniteurs
43 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem
Sémaphore Conclusion
Problème classique de synchronisation
Les Moniteurs
TD_Sémaphores_Fiche3
44 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Problème classique de synchronisation
Le problème Producteur/consommateur
45 / 54
Problème classique de synchronisation
Le problème Producteur/consommateur
45 / 54
Problème classique de synchronisation
Le problème Producteur/consommateur
46 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Problème classique de synchronisation
Le problème Producteur/consommateur
TD_Sémaphores_Fiche3
47 / 54
Introduction
The Critical-section problem
Sémaphore Conclusion
Problème classique de synchronisation
Les Moniteurs
48 / 54
Belarbi SI2 V1.0 Janvier 2025 (2024-2025)
Introduction
The Critical-section problem
Sémaphore
Problème classique de synchronisation
Les Moniteurs
Les Moniteurs
51 / 54
Les Moniteurs
Dénition formelle
52 / 54
Les Moniteurs
Mise en oeuvre en Java
class Queue{
private ... ; // queue data
Moniteur Compte
{ int solde = 0 ;
void Deposer (int montant) // section critique pour le dépôt
{ solde = solde + montant ;
}
void retirer (int montant) //section critique pour le retrait
{ if (solde >= montant)
solde = solde montant ;
}
}