Académique Documents
Professionnel Documents
Culture Documents
txt Page 1 of 2
Un smaphore ne peut tre manipul que grce deux primitives P et V dfinis ainsi:
procedure P(var s:semaphore)
debut
s.n := s.n - 1;
si s.n < 0 alors
bloquer le processus en queue de la liste "s.en_attente"
finsi
fin
procedure rendre(no_imprimante:entier);
fonction allouer():entier;
const
m = 8; /* nombre d'imprimantes */
var
occupe: tableau 1..m de boolen; /* indique le statut de chaque imprimante */
fonction allouer()
var no_imprimante;
debut
P(nb_imprimantes);
/* lorsqu'un processus arrive ici, au moins une imprimante est libre;
il s'agit maintenant de dterminer laquelle */
P(mutex);
no_imprimante := 1;
tantque occupe[no_imprimante] faire
no_imprimante := no_imprimante + 1;
finfaire
occupe[no_imprimante] := true;
V(mutex);
retourner no_imprimante;
fin
procedure rendre(no_imprimante:entier)
debut
occupe[no_imprimante] := false;
V(nb_imprimantes);
fin
rendre(n_imp);
fin
----------------------------
Le smaphore mutex permet d'implmenter un section critique (la ressource critique est le tableau
occupe[], qui permet de savoir si une imprimante est libre ou non); le smaphore nb_imprimantes permet
de bloquer un processus dans la fonction allouer lorsque plus aucune imprimante n'est libre. Tout
naturellement ce dernier smaphore est initialis m (le nombre d'imprimantes), car les m premiers
appels de P(nb_imprimantes) ne doivent pas tre bloquants, alors que tout appel suivant doit tre
bloquant (pour autant bien sr qu'aucun appel de V(nb_imprimantes) ne vienne s'intercaler).