Vous êtes sur la page 1sur 2

File: /home/netrafuser/exercice_semaphore.

txt Page 1 of 2

Le problme de l'allocation de m imprimantes n processus (n>m):


----------------------------------------------------------------
chaque processus peut demander une imprimante, pour ensuite l'utiliser, et finalement la restituer. Si
aucune imprimante n'est libre au moment d'une demande mise par un des processus, le processus doit
tre mis en attente. Il sera rveill ds qu'un autre processus restitue l'inmprimante qui lui a t
alloue. Ce problme se rsout facilement avec l'outil smaphore.

Un smaphore est une variable de type:

type semaphore = article {


n: entier;
en_attente: liste de processus
}

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 V(var s:semaphore)


debut
s.n := s.n + 1;
si s.n >= 0 alors
dbloquer le processus en tte de la liste "s.en_attente"
finsi
fin
---------------------------
programme imprimante;

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 */

mutex: semaphore init 1; /* smaphore d'exlusion mutuelle */


nb_imprimantes: semaphore init m; /* smaphore permettant d'attendre une 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

processus pi() /* programme principal */


var n_imp;
debut
n_imp := allouer();
imprimer(n_imp,"fichier_i"); /* imprime le fichier "fichier_i" sur l'imprimante n_imp */
File: /home/netrafuser/exercice_semaphore.txt Page 2 of 2

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).