Académique Documents
Professionnel Documents
Culture Documents
A
2
D
Semaphore f1 = 1, f2 = 1, f3 = 1, f4 = 1; Process A
LOOP
B
4
C
Process B
LOOP
Process C
LOOP
Process D
LOOP
Pense
f1.wait() f2.wait()
Pense
f2.wait() f3.wait()
Pense
f3.wait() f4.wait()
Pense
f4.wait() f1.wait()
Mange
f1.signal() f2.signal()
Mange
f2.signal() f3.signal()
Mange
f3.signal() f4.signal()
Mange
f4.signal() f1.signal()
Possibilit d'interblocage
Figure 1: Le problme des philosophes. La solution de la Figure 1 montre qu'un philosophe doit faire un wait() sur chacune des 2 fourchettes qui l'entourent avant de manger. Il peut manger seulement s'il russit avoir les 2 fourchettes. Quand il a fini de manger, il relche les 2 fourchettes avec un signal(). Cette solution simple s'assure qu'un philosophe doit avoir 2 fourchettes pour manger et respecte l'interdpendance entre les processus. Cependant, elle peut produire un interblocage des processus. Supposons que tous les philosophes ont obtenu leur fourchette de droite (premier wait() dans les processus). Alors, aucun philosophe ne peut obtenir la fourchette de gauche manquante. Les philosophes attendent
mutuellement un aprs l'autre. Le processus A attend aprs B, B aprs C, C aprs D et D aprs A. Il y a attente circulaire. Nous avons un interblocage. La Figure 2 prsente une solution sans interblocage. Elle consiste s'assurer qu'au plus 3 philosophes utilisent des fourchettes simultanment. On vite ainsi l'attente circulaire. Les 3 processus qui ont des fourchettes ne pourront pas former une suite circulaire de processus qui s'attendent mutuellement. Il s'agit d'un problme d'exclusion mutuelle avec la modification que 3 processus peuvent excuter le code "mange" en mme temps. On utilise un smaphore "c" qui est initialis 3. Tout au plus, 3 processus pourront faire le wait() sans bloquer.
PROBLME DES PHILOSOPHES
Process B
LOOP
Process C
LOOP
Process D
LOOP
Pense
c.wait() f1.wait() f2.wait()
Pense
c.wait() f2.wait() f3.wait()
Pense
c.wait() f3.wait() f4.wait()
Pense
c.wait() f4.wait() f1.wait()
Mange
f1.signal() f2.signal() c.signal()
Mange
f2.signal() f3.signal() c.signal()
Mange
f3.signal() f4.signal() c.signal()
Mange
f4.signal() f1.signal() c.signal()