Ens.: MTB & AO
Facult´e des sciences de tunis - Dept. Informatique
Travaux pratiques en synchronisation Ann´ee : 2013-2014 TP N1 - Communication interprocessus (Processus l´eger et s´emaphores)
Ce second TP est d´edi´e `a l’introduction de la communication entre les processus. Un int´erˆet particulier sera apport´e `a l’utilisation des s´emaphores. Aussi, les processus l´egers (i.e. threads) seront utilis´es pour mettre en œuvre cette communication.
1. Introduction de la biblioth`eque ”semaphore.h” de POSIX
Le tableau1 ci-dessous pr´esente un r´esum´e du contenu de la biblioth`eque ”semaphore.h”. Toutes Nom du fichier ”semaphore.h”
Type de la donn´ee sem t
Initialisation int sem init(sem t *sem, int ppartage, unsigned valeur);
int sem destroy(sem t *sem);
Op´erations int sem wait(sem t *sem);
Semaphore int sem post(sem t *sem);
int sem trywait(sem t *sem);
Compilation cc nomFichier.c -o nomExec -lrt Table 1: R´esum´e du fichier ”semaphore.h”
les fonctions ci-dessus retournent ”-1” pour indiquer une erreur.
La fonction ”sem init” initialise le s´emaphore avec la valeur contenue dans le param`etre
”valeur”. Ce parapm`etre ne peut pas ˆetre n´egatif. Si la valeur du param`etre ”ppartage” n’est pas 0, le semaphore peut ˆetre partag´e par plusieurs processus (i.e. le processus qui l’initialise et ses fils). Sinon, il ne peut ˆetre utilis´e que par les processus l´eger associ´es au processus qui l’a initialis´e.
La fonction ”sem wait” v´erifie la valeur du s´emaphore. Si elle est ´egale `a 0, elle bloque le processus demandeur et d´ecr´emente la valeur.
”sem trywait” est similaire `a la fonction pr´ec´edente sauf qu’au lieu de bloquer le processus lorsqu’elle d´ecr´emente une valeur ´egale `a 0, elle retourne -1.
”sem post” permet d’incr´ementer le s´emaphore et de lib´erer un processus bloqu´e dans le cas o`u la valeur est positive.
Remarque :
La cr´eation d’un processus l´eger (i.e. thread) se fait par l’appel `a la fonction :
”int pthread create(pthread t *tid,
const prthread attr t *tattr, void*(*routine dem)(void*), void *arg)”
de la bibilioth`eque ”pthread.h”.
Le premier param`etre peremet de pr´eciser le nom du processus l´eger. Le second param`etre peremt de pr´eciser les attributs d’un thread, par exemple, sa priorit´e, la taille de sa pile, etc.
Le troisi`eme param`etre fixe le traitement associ´e au thread, c’est un pointeur de fonction. Le dernier param`etre est pass´e au pointeur de fonction comme premier argument.
TPs en synchronisation TP1 Ann´ee universitaire : 2012-2013 2. Utilisation des processus l´egers
Soit le programme du listing1 suivant :
Listing 1: processusLegers.c
1#include <s t d i o . h>
#include <s t d l i b . h>
3#include <p t h r e a d . h>
/∗ V a r i a b l e s g l o b a l e s ∗/
5 i n t x = 0 ;
/∗ F o n c t i o n a a s s o c i e r au t h r e a d∗/
7 void ∗m a f o n c t i o n (void ∗a r g ) {
9 p r i n t f ( ” Xthread = %d\n” , x ) ; }
11 i n t main ( ){ p t h r e a d t t h r e a d ;
13 i f ( p t h r e a d c r e a t e (& t h r e a d , NULL, m a f o n c t i o n , NULL) < 0 ) { p e r r o r ( ” E r r e u r : l e t h r e a d n ’ e s t pas c r e e e ” ) ;
15 e x i t ( 1 ) ; }
17 /∗ r e a l i s a t i o n d ’ un t r a i t e m e n t ∗/ x = 5 5 ;
19 p r i n t f ( ”Xmain = %d\n” , x ) ; return( 0 ) ;
21 }
(a) Compiler le programme et donner le r´esultat de son ex´ecution.
(b) Mettre l’instruction suivante `a la ligne 20 du listing1 :
”ptread join(thread,NULL);”.
Quel est le r´esultat de l’ex´ecution du programme ?
(c) Refaire la mˆeme chose que dans la question pr´ec´edente en mettant ”ptread join” `a ligne 17 du listing1. Quel est le r´esultat de l’ex´ecution du programme ?
(d) Interpr´eter le r´esultat des trois questions pr´ec´edentes et pr´eciser le rˆole de la fonction
”ptread join”.
3. Cr´eation de plusieurs processus l´egers Soit la fonction du listing2 suivant :
Listing 2: multiLeger.c
1 void ∗maFonction2 (void ∗ a r g ){
i n t i ;
3 f o r ( i = 0 ; i < 5 ; i ++) {
p r i n t f ( ” Thread %s : %d\n” , (char∗) arg , i ) ;
5 s l e e p ( 1 ) ; }
7 p t h r e a d e x i t ( 0 ) ; }
Page 2
TPs en synchronisation TP1 Ann´ee universitaire : 2012-2013 (a) Proposer un programme qui permet de retourner le r´esultat suivant :
Thread 1: 0 Thread 2: 0 Thread 1: 1 Thread 2: 1 Thread 1: 2 Thread 2: 2 Thread 1: 3 Thread 2: 3 Thread 1: 4 Thread 2: 4
4. Utilisation des s´emaphores Soit le code du listing3 suivant :
Listing 3: sem1.c
#include <s t d i o . h>
2#include <s t d l i b . h>
#include <p t h r e a d . h>
4#include <semaphore . h>
/∗ G l o b a l v a r i a b l e s ∗/
6 i n t x = 0 ; s e m t s y n c ;
8 /∗ F o n c t i o n a a s s o c i e r au t h r e a d∗/ void ∗m a f o n c t i o n (void ∗a r g )
10 {
p r i n t f ( ” Xthread = %d\n” , x ) ;
12 s e m p o s t (& s y n c ) ; }
14 i n t main ( ){ p t h r e a d t t h r e a d ;
16 /∗ C r e a t i o n du semaphore s y n c i n i t i a l i s e a 0 ∗/
i f ( s e m i n i t (& sync , 0 , 0 ) == −1) {
18 p e r r o r ( ”Ne p e u t pas i n i t i a l i s e r l e semaphore ” ) ; e x i t ( 2 ) ;
20 }
i f ( p t h r e a d c r e a t e (& t h r e a d , NULL, m a f o n c t i o n , NULL) < 0 ) {
22 p e r r o r ( ” E r r e u r : l e t h r e a d n ’ e s t pas c r e e e ” ) ; e x i t ( 1 ) ;
24 }
s e m w a i t (& s y n c ) ;
26 /∗ r e a l i s a t i o n d ’ un t r a i t e m e n t ∗/ x = 5 5 ;
28 p r i n t f ( ”Xmain = %d\n” , x ) ;
/∗ d e s t r u c t i o n du semaphore s y n c ∗/
30 s e m d e s t r o y (& s y n c ) ; return( 0 ) ;}
Page 3
TPs en synchronisation TP1 Ann´ee universitaire : 2012-2013 (a) Quel est le r´esultat de l’ex´ecution du code du listing3 ?
(b) Changer le code du listing3 pour que le programme principal r´ealise son traitement en premier lieu.
Page 4