Académique Documents
Professionnel Documents
Culture Documents
Cours Semaphore
Cours Semaphore
Smaphore
Outil thorique daide la synchronisation des processus conus par Dijkstra 65 Un smaphore est un objet de type Smaphore. Sur un smaphore S 4 oprations existent Linitialisation du smaphore : Init(S,v) Proberen (en franais "Puis-je? ) : P(S) Verhogen, (en franais "Vas-y!"): V(S) destruction
En accs priv, un smaphore a une liste de processus en attente un compteur ayant une valeur entire
3
Opration Init
function Init(semaphore Sem, int val) { masquer_interruption; Sem.K = val; Sem.L = NULL; autoriser_interruption; } // Init : opration atomique ou indivisible // (qui ne peut tre interrompu) // Init: initialisation du smaphore. // Seule la valeur initial du compteur peut varier
4
Opration P(Sem)
function P(semaphore Sem) { masquer_interruption; if (Sem.K < 1) { L.ajouter(processus_appelant); processus_appelant.state = bloque; } Sem.K = Sem.K-1; autoriser_interruption; }
// P : opration atomique ou indivisible // (qui ne peut tre interrompue) // Opration P peut tre bloquante
5
Opration V(Sem)
function V(semaphore Sem) { masquer_interruption; Sem.K = Sem.K+1; if (sem.K > 0) { pr = L.enlever() pr.state = prt; } autoriser_interruption; }
Exemple
Proc1 Init(S,2) P(S) P(S) P(S) V(S) P(S) V(S) P(S) P(S) V(S)
7
Proc2
Proc3
Proc4
tat de S K= L=
temps
Opration V(Sem,val)
function V(semaphore Sem, entier val) { masquer_interruption; Sem.K = Sem.K+val; if (Sem.K > 0) { pr = L.enlever(dmd)
/* pr est un processus dans L dont la demande (valeur de dmd) est infrieure ou gale sem.K */
pr.state = prt; } autoriser_interruption; } // V : opration atomique ou indivisible // (qui ne peut tre interrompue)
9
Exemple
Proc1 Int(S,2) P(S,1) P(S,2) P(S,3) V(S,2) P(S,2) P(S,1) V(S,3) V(S,4) P(S,6) Proc2 Proc3 Proc4 tat de Sem
temps
10
java.util.concurrent.*
Implmentation doutils de haut niveau pour la synchronisation de processus Smaphore: Semaphore Loquet: CountdownLatch Point de rendez-vous pour changer des donnes : Exchanger barrire rutilisable: CyclicBarrier Implmentation des verrous : Lock
12
Classe Semaphore
Semaphore (int valeur) Semaphore (int valeur, boolean fairness) Si fairness == true alors la file dattente est gre daprs la politique FIFO - premier arriv premier servi -
13
14
16