Académique Documents
Professionnel Documents
Culture Documents
Systèmes D Exploitation II - 2 Ème Année Licence Travaux Dirigés II ESEN - Université de La Manouba Amine DHRAIEF
Systèmes D Exploitation II - 2 Ème Année Licence Travaux Dirigés II ESEN - Université de La Manouba Amine DHRAIEF
Travaux Dirigés II
ESEN - Université de la Manouba
Amine DHRAIEF
Partie théorique
1. Qu’est ce qu’un multithreading ? et quelle est la différence avec la multiprogrammation ?
Solution: Un processus est une unité de structuration, défini techniq. par un seg.
Code, un seg. Data et un seg. Pile d’exécution et un contexte alors qu’un thread (ou
encore processus léger) est une unité d’exécution qui partage avec tous les autres
threads d’un même processus l’espace d’adressage mémoire mais il ne contient que
sa pile d’exécution, son CO,... On privilégie les threads par rapport aux processus
afin de gagner en performance en particulier la commutation est moins coûteuse.
3. Décrire ce qu’est un TCB (Thread Control Bloc) en vous inspirant du contenu d’un PCB
(Process Control Bloc ou encore un Descripteur de Processus).
4. Considérez les deux morceaux de code suivants. Deux threads exécutent respectivement
les fonctions writer_thread() et reader_thread(), et partagent la variable pointer.
int *pointer = NULL;
void * writer_thread() {
while (1) {
if (pointer == NULL) {
pointer = malloc(sizeof(int));
*pointer = rand();
//fonction dans stdlib.h pour recevoir une valeur aléatoire
}
}
}
void *reader_thread() {
while (1) {
if (pointer != NULL) {
printf("pointer = %d", *pointer);
free(pointer);
pointer = NULL;
}
}
}
(a) En exécutant le programme qui crée deux threads ayant les fonctions précédentes,
une erreur "Erreur de segmentation" apparaît au bout d’un certain temps. D’où
provient cette erreur ? Expliquer.
Solution: Le lecteur peut effectuer l’appel à free() pendant que l’écrivain est
bloqué dans random().
Partie pratique
5. La création et le lancement du thread se fait par :
pthread_t th1 ;
int ret ;
pthread_create (&th1, NULL, runDuThread, "1");
if (th1 == NULL) {
fprintf (stderr, "pthread_create error 1") ; exit(0) ;}
Page 2
#i n c l u d e <pt hr ea d . h>
#i n c l u d e <s t d i o . h>
#i n c l u d e < s t d l i b . h>
#i n c l u d e <s t d i o . h>
#i n c l u d e < s t r i n g . h>
#i n c l u d e <u n i s t d . h>
void ∗ affiche_min ( )
{
cha r c ;
f o r ( c =’a ’ ; c<=’z ’ ; c++)
p r i n t f ("%c " , c ) ;
pt hr ea d_ exit (NULL ) ;
void ∗ affiche_maj ( )
{
cha r c ;
f o r ( c =’A ’ ; c<=’Z ’ ; c++)
p r i n t f ("%c " , c ) ;
pt hr ea d_ exit (NULL ) ;
}
i n t main ( v o i d )
{
int i ;
i nt ret1 , ret2 ;
/∗ v o i d ∗ r e t o u r 1 ;
void ∗ retour2 ;∗/
pthread_t thread1 , t h r e a d 2 ;
i f ( ( r e t 1 = p t h r e a d _ c r e a t e (& thread1 , NULL, a f f iche_ min , NULL) ) !=
{
f p r i n t f ( s t d e r r , "%s \n " , s t r e r r o r ( r e t 1 ) ) ;
exit (1);
}
Page 3
pt hr ea d_ j o in ( t h r e a d 1 , NULL ) ;
pt hr ea d_ j o in ( t h r e a d 2 , NULL ) ;
return ( 0 ) ;
}
(b) Écrire un programme qui initialise une variable globale à 0 et crée 2 threads. Chacun
des threads va incrémenter la variable N fois. Afficher la valeur de la variable à la
fin de l’exécution de chacun des threads.
#i n c l u d e <pt hr ea d . h>
#i n c l u d e <s t d i o . h>
#i n c l u d e < s t d l i b . h>
#i n c l u d e <u n i s t d . h>
#d e f i n e NB_THREADS 2
i n t var_globale ;
i n t main ( v o i d )
{
pthread_t t h r [NB_THREADS ] ;
int i , j ;
i n t v a r _ g l o b a l e =0;
cha r c h a i n e [ 1 2 8 ] ;
Page 4
}
La suite de Fibonacci
6. La suite de Fibonacci est une suite d’entiers dans laquelle chaque terme est la somme
des deux termes qui le précèdent : 0, 1, 1, 2, 3, 5, 8. Formellement, on exprime cette
suite comme suit :
fib[0]=0
fib[1]=1
fib[n]=fib[n-1]+fib[n-2]
v o i d ∗ fn_thread ( v o i d ∗ ind )
{
int i , fib , fib1 , fib2 ;
Page 5
i n t ∗ tab ;
int indice ;
i n d i c e =∗(( i n t ∗ ) ind ) ;
tab=c a l l o c (MAX_ELEMENT, s i z e o f ( i n t ) ) ;
i f ( i n d i c e ==0){tab [ 0 ] = 0 ; }
e l s e i f ( i n d i c e ==1){tab [ 0 ] = 0 ; tab [ 1 ] = 1 ; }
else {
f i b 1 =0;
f i b 2 =1;
f i b =0;
tab [ 0 ] = 0 ;
tab [ 1 ] = 1 ;
p r i n t f ( " tab [ 0 ] == %d\n " , tab [ 0 ] ) ;
p r i n t f ( " tab [ 1 ] == %d\n " , tab [ 1 ] ) ;
f o r ( i =2; i<=i n d i c e ; i ++)
{
f i b=f i b 1+f i b 2 ;
f i b 1=f i b 2 ;
f i b 2=f i b ;
tab [ i ]= f i b ;
p r i n t f ( " tab[%d ] == %d\n " , i , tab [ i ] ) ;
}
}
i n t main ( v o i d )
{
int indice , i ;
void ∗ retour ;
int ∗ tab ;
pthread_t t h r e a d ;
cha r c h a i n e [ 1 2 8 ] ;
Page 6
else
break ;
pt hr ea d_ j o in ( t h r e a d , &r e t o u r ) ;
tab=( i n t ∗ ) r e t o u r ;
f o r ( i =0; i<=i n d i c e ; i ++)
{
p r i n t f ( " tab [%d]==%d\n " , i , tab [ i ] ) ;
}
f r e e ( tab ) ;
return 0;
}
Page 7