Vous êtes sur la page 1sur 2

GIS 3 - T.P.

Systme : Smaphores

Sources : Michel Divay, Martin Quinson

Introduction
Dans ce TP nous allons utiliser plusieurs bibliothques. Chacune est fournie sous la forme dun chier .o et dun chier .h. Les fonctions de chaque bibliothque sont dcrites dans le .h (vous navez pas accs aux sources). Les bibliothques fournies sont : semaphore-tube : une implmentation des smaphores ; utils : quelques fonctions utilitaires ; ecrirebin : une bibliothque dachage binaire utilise pour lexercice sur les baigneurs. Prliminaire : Un rpertoire contenant les bibliothques, un Makefile, un exemple et un excutable utilitaire est disponible dans le rpertoire ~jforget/Public/Semaphores-dist Copiez ce rpertoire chez vous. La fonction fork permet un programme de crer dynamiquement un processus. Pour simplier, dans ce TP, chaque fois que lon veut dnir un nouveau processus on dnira une fonction selon le schma suivant :
void p r o c e s s u s 1 ( ) { i f ( f o r k ()==0) { . // code de ce p r o c e s s u s . . exit (0); } }

La cration de processus se fera ensuite dans le main par appel ces fonctions. An que le programme ne se termine qu la n de tous les processus, il est ncessaire de faire, la n du main, un appel wait(NULL); pour chaque processus cr.

Blocage
1. Compilez le programme blocage_1.c, excutez le et constatez quil y a blocage ; 2. Proposez une rsolution simple, sans changer lordre des Prend et Vasy.

Interblocage
Processus 1 Initialisation a = 1 b = 1 c = 1 P( a ) ; P( b ) ; V( b ) ; P( c ) ; V( c ) ; V( a ) ; Processus2 P( c ) ; P( b ) ; V( b ) ; V( c ) ; P( a ) ; V( a ) ; Processus3 P( c ) ; V( c ) ; P( b ) ; P( a ) ; V( a ) ; V( b ) ;

1. Programmez lexemple ci-dessus, compilez et excutez le ; 2. Listez (sur papier) les paires de smaphores que chaque processus cherche acqurir ; 3. Dduisez en un scnario pouvant mener un inter-blocage. Ajoutez une attente dans un processus pour raliser ce scnario (man 3 sleep) ; 1

4. Le problme peut tre rsolu en imposant que, lorsquun processus prend une paire de smaphores, il prend toujours les deux smaphores de cette paire dans le mme ordre. Eliminez linterblocage de cette faon.

Carrefour

On souhaite simuler le comportement de plusieurs voitures un carrefour routier. Une voiture ne doit sengager dans le carrefour que si aucune autre voiture ne sy trouve dj. La traverse du carrefour se fait donc en exclusion mutuelle. Le dplacement de chaque voiture se fait selon le schma suivant :
processus voiture a r r i v e au c a r r e f o u r t r a v e r s e du c a r r e f o u r en e x c l u s i o n m u t u e l l e d p a r t du c a r r e f o u r

La fonction void voiture(int num, int duree) dnit le processus simulant le dplacement dune voiture. num correspond au numro de la voiture et duree au temps dattente entre chaque phase du dplacement (arrive, traverse, dpart). 1. Dans un chier carrefour.c, dnissez la fonction voiture. Vous acherez ltat dune voiture chaque fois quelle change dtat, laide de la fonction message de la librairie utils ; 2. Ajoutez dans ce chier une fonction main qui cre plusieurs voitures ; 3. Tester en vriant quil nest pas possible davoir 2 voitures en mme temps dans le carrefour.

Baigneurs

On souhaite simuler le fonctionnement dune piscine. Les baigneurs partagent plusieurs ressources : les paniers, ncessaires pour rentrer dans lenceinte de la piscine ; les cabines, ncessaires pour se changer (shabiller ou se dshabiller). Chaque baigneur est reprsent par un processus dont le comportement est le suivant :
processus baigneur p r e n d r e un p a n i e r e n t r e r dans une c a b i n e se changer s o r t i r de l a c a b i n e se baigner e n t r e r dans une c a b i n e se changer s o r t i r de l a c a b i n e quitter la piscine

Les tats possibles sont : attente panier, attente cabine, se dshabille, se baigne, attente cabine, se rhabille, sen va. La fonction suivante reprsente le comportement dun baigneur :
void b a i g n e u r ( i n t i ) { i f ( f o r k ()==0) { . . . exit (0); } }

1. Dans un chier baigneur.c, dnissez la fonction baigneur. Vous acherez ltat dun baigneur chaque fois quil change dtat, laide de la fonction ecritEtat de la librairie ecrirebin ; 2. Ajoutez dans ce chier une fonction main qui cre plusieurs baigneur et initialise lachage (fonction ecritDebut de ecrirebin). Attendez la terminaison des processus crs la n de la fonction main ; 3. La bibliothque ecrirebin crit les informations en binaire sur la sortie standard, ce qui, comme vous pourrez le constater, nest pas trs lisible... On fournit un excutable affiche capable de lire sur lentre standard des informations binaires au format produit par la bibliothque ecrirebin et des les acher joliment sur la sortie standard. Achez joliment les informations produites par votre programme ; 4. Tester en vriant quil nest pas possible de dpasser les capacits prvues (en termes de paniers et de cabines).