: 2019/2020
Systèmes d’ExploitATIon& PrOGRAMMATIon Concurrente II2
TD (correction)
Correction
a) 4
b) 5
c) 6
d) >10
2
e) aucune des réponses ci-dessus.
3
Correction
2) 1)
2) P1 (ou P2) peut terminer son exécution avant que PP ne termine, et devenir en état
zombie. PP peut terminer son exécution avant que P3 ne termine, donc P3 devient
orphelin. Utiliser les options l a de ps pour la vérification.
3)
#include <unistd.h> while (fork() >=0 && <2){
#include <stdio.h> i=i+1;
wait();
int main ( ) { }
int i=0 ; printf(" Process %d termine avec i=%d \n", getpid(), i);
return 0;
}
Correction
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
int main()
{
int i;
for(i=0;i<4;i++)
if(fork())break;
printf("Mon nom est <%c>",'A'+i);
return(EXIT_SUCCESS);
}
Exercice 4.
1) Lancer le programme ci-dessous avec les arguments 10 20. Tapez ps -la dans un autre
terminal avant la fin du père, avant la fin du fils. Quels sont les ppid du père et du fils ?
5
Donnez une explication.
2) Lancer le programme ci-dessous avec les arguments 10 0. Tapez ps -la dans un autre
terminal avant la fin du père. Que constatez-vous?
/**************************************************************/
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char * argv[]) {
pid_t pid;
int attente_fils,attente_pere;
if(argc != 3)
perror("usage: ex1 n m\n");
attente_pere = atoi(argv[1]);
attente_fils = atoi(argv[2]);
switch(pid=fork()) {
case -1:
perror("fork error");
break;
case 0:
sleep(attente_fils);
printf("fils attente finie\n");
break;
default:
sleep(attente_pere);
printf("pere attente finie\n");
break;
}
return 0 ;
}
Correction
Écrire un programme modulaire qui va créer un deuxième processus. Le père va afficher les
majuscules à l'écran et le fils les minuscules. Ici, le travail effectué par les 2 processus est trop
court et il n'y a pas entrelacement des exécutions. Pensez à mettre un "\n" à la fin de chaque
écriture afin de vider le buffer !
Correction
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
6
#include <wait.h>
int main()
{
pid_t pid;
if (pid = fork()<0)
{
fprintf(stderr, "erreur fork");
exit(1) ;
}
if(pid > 0) /* père */
majuscules();
else /* fils */
minuscules();
wait(NULL);
return 0;
}
void * minuscules ()
{
char c;
for( c='a'; c<='z'; c++)
printf("%c \n", c);
exit(1);
}
void * majuscules()
{
char c ;
for( c='A'; c<='Z'; c++)
printf("%c \n", c);
exit(2);
}
Exercice 6.
Écrire un programme modulaire qui va créer un deuxième processus. Le père et le fils comptent
de 0 à 100000 et l'affiche à l'écran. Le père place un P devant son comptage et le fils un F.
Analysez le travail de l'ordonnanceur.
7
II. TP.Threads
Cette fonction est à écrire par le programmeur pour décrire le comportement du thread. Le
paramètre paramest un pointeurdont la valeur est celle passée en argument (le 4ème) de la
fonction pthread_create. Il permet de passer des données authread.
Si la fonction main se termine, le programme et tous les threads lancés se terminent aussi. Il faut
donc s'assurer avant determiner le programme que tous les threads ont fini leur travail. L'attente
de la terminaison d'un thread se fait comme ceci :
(void) pthread_join (th1, (void *)&ret) ;
Le paramètre retcontiendra la valeur retournée par la fonction pthread_exit (int val)à
exécuter avant de terminer un thread.
1. Écrire un programme qui lance 2 threads. L'un écrira les 26 minuscules à l'écran et l'autre
les 26 majuscules.
2. É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.
Correction
1)
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
8
void * minuscules ();
void * majuscules();
int main()
{
int ret1, ret2;
pthread_t t1, t2;
2)
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define NB_THREADS 2
int var_globale ;
int main()
{
pthread_t th[NB_THREADS] ;
9
int i, j;
int var_globale =0;
fprintf(stdout, "Donnez le nombre d’incrémentation de var_globale:");
scanf("%d", &i);
for(j = 0; j< NB_THREADS; j++){
if( pthread_create(&th[j] , NULL, incrementation, ( void*)&i ) != 0)
{
fprintf( stderr, " Erreur pthread_create\n ");
exit(EXIT_FAILURE) ;
}
}
for( j = 0; j< NB_THREADS;j++) {
pthread_join(th[j], NULL);
}
}
Void* incrementation(void* arg )
{
int borne_sup = *((int*)arg);
int i =0;
for(i =0; i<borne_sup; i++)
{
var_globale++;
}
printf("var_globale = %d\n", var_globale );
pthread_exit(NULL) ;
}
1
0