Vous êtes sur la page 1sur 7

Systèmes d’exploitation

TD-TP - Gestion des processus Corrigé

Exercice 1
Soit le programme suivant :
int main(void)
{
fork() ; printf("fork 1 \n") ;
fork() ; printf("fork 2 \n") ;
fork() ; printf("fork 3 \n") ;
return(0) ;
}

Expliquez l’exécution de ce programme. Précisez en particulier le nombre de processus


engendrés par cette exécution. Combien d’occurrences de chaque type de message « fork i »
sont affichés ?

./tf avec 3 fork


pid=9246 ppid=9245 fork1
pid=9245 ppid=9155 fork1
pid=9247 ppid=9246 fork2
pid=9249 ppid=9247 fork3
pid=9248 ppid=9245 fork2
pid=9247 ppid=9246 fork3
pid=9246 ppid=9245 fork2
pid=9250 ppid=9248 fork3
pid=9251 ppid=9246 fork3
pid=9246 ppid=9245 fork3
pid=9245 ppid=9155 fork2
pid=9252 ppid=9245 fork3
pid=9245 ppid=9155 fork3
pid=9248 ppid=1 fork3

Réponse
Pour 3 fork, on obtient au total 8 processus, fork 1 est affichée 2 fois, fork3 est affiché 4 fois et fork3 8
fois.

Anissa OMRANE 1
Exercice 2

1. Soit la séquence de code suivante


int pid;
int i;
for(i=0;i<=2;i++)
{
pid=fork() ;
}
Combien de processus sont créés par le code du processus P? Dresser un schéma montrant
quels sont les processus créés pour chaque valeur de i.

Réponse
Pour cet exercice comme pour l’exercice 1, la boucle se traduit comme 3 fork, on obtient au total 8
processus.
Rouge : i=0
Vert :i =1
Bleu : i=2

2. Soit la séquence de code suivante constituant un premier processus p:


// Code du processus P // Code du processus P1
int pid; int pid;
int i; int i;
for(i=0;i<=2;i++) for(i=0;i<=2;i++)
{ {
pid=fork() ; pid=fork() ;
if(pid==-1) exit(-1); if(pid==-1) exit(-1);
else else
if(pid==0) if(pid==0)
printf(”Bonjour”); {
else printf(”Bonjour”);
printf(“Je suis i=0;
père”); }
else
} printf(“Je suis père”);
}
Anissa OMRANE 2
a. Combien de processus sont crées par le code du processus P ? dresser un schéma
montrant quels sont les processus créés pour chaque valeur de i.
b. Combien de fois sera affiché le message « bonjour » ?
c. Combien de fois sera affiché le message «Je suis père » ?
d. Que se passe t il si on transforme le code de P en celui de P1.

Exemple d’exécution du programme


./ex ./ex
i= 0 bonjour pid=31015 ppid=31014 i= 0 bonjour pid=32204 ppid=32203
i= 0 je suis le pere 31014 i= 1 bonjour pid=32205 ppid=32204
i= 1 bonjour pid=31016 ppid=31015 i= 2 bonjour pid=32206 ppid=32205
i= 2 bonjour pid=31017 ppid=31016 i= 2 je suis le pere 32205
i= 2 je suis le pere 31016 i= 1 je suis le pere 32204
i= 1 bonjour pid=31018 ppid=31014 i= 0 je suis le pere 32203
i= 1 je suis le pere 31015 i= 2 bonjour pid=32207 ppid=32204
i= 2 bonjour pid=31020 ppid=31015 i= 2 je suis le pere 32204
i= 2 je suis le pere 31015 i= 1 bonjour pid=32208 ppid=32203
i= 2 bonjour pid=31019 ppid=31018 i= 2 bonjour pid=32209 ppid=32208
i= 2 je suis le pere 31018 i= 2 je suis le pere 32208
i= 1 je suis le pere 31014 i= 1 je suis le pere 32203
i= 2 bonjour pid=31021 ppid=31014 i= 2 bonjour pid=32210 ppid=32203
i= 2 je suis le pere 31014 i= 2 je suis le pere 32203

Réponse
a) Le code de 1 génère un total de 8 processus
b) le message bonjour sera affiché 7 fois par les 7 fils.
c) Je suis père est affiché 7 fois aussi mais 3 fois par le processus père (main principal), 2 fois pas
le premier fils créé et une fois par les deux autres fils créés.
d) Lorsqu’on ajoute le i=0 dans le code il y a des fils qui meurent et d’autres naissent le processus
de création est infini

Exercice 3
1. Soit l’exécution suivante d’un programme c :
Je suis le processus fils 3501 mon papa est 3500
Je suis le processus fils 3502 mon papa est 3500
Je suis le processus pere 3500
Ecrire le programme C qui aurait permis la génération d’une telle arborescence.

Anissa OMRANE 3
Réponse
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
void main()
{
int i, p, p1;

printf("\nje suis pere %d\n",getpid());


p=fork();
if(p==0)
printf("\n je fils pid %d PPID=%d\n",getpid(), getppid());
else
{
p1=fork();
if(p1==0)
printf("\n je fils pid %d PPID=%d\n",getpid(), getppid());
else
wait(0);
}

wait(0);
}
}

2. On modifie le code de ce programme on obtient l’affichage suivant :


Je suis le processus fils 3548 mon papa est 3547
Je suis le processus fils 3549 mon papa est 3548
Je suis le processus fils 3550 mon papa est 3548
Je suis le processus pere 3548
Je suis le processus fils 3551 mon papa est 3547
Je suis le processus fils 3552 mon papa est 3551
Je suis le processus fils 3553 mon papa est 3551
Je suis le processus pere 3551
Je suis le processus pere 3547
Je suis le processus fils 3554 mon papa est 3547
Je suis le processus fils 3555 mon papa est 3547
Je suis le processus pere 3547

Anissa OMRANE 4
a) Décrire l’arborescecne des processus générée

b) Déduire les modifications apportées au code de la question 1, qui a pu généré cette


exécution.

Réponse
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
void main()
{
int i, p, p1;

printf("\nje suis pere %d\n",getpid());


for(i=0;i<2;i++)
{
p=fork();
if(p==0)
printf("\n je fils pid %d PPID=%d\n",getpid(), getppid());
else
{
p1=fork();
if(p1==0)
printf("\n je fils pid %d PPID=%d\n",getpid(), getppid());
else
wait(0);
}

wait(0);
}
}

Anissa OMRANE 5
Exercice 5
1. Ecrire un programme C qui permet de créer l’arborescence ci-dessous formée par les
processus Pa, Pb, Pc, Pd, Pe, Pf, Pg. Chaque processus affiche la lettre qui lui correspond
(exemple : le processus Pa, affiche « je suis le processus a »)

Pa

Pb Pc

Pd Pe Pf Pg

2. Que faut-il faire pour que le processus Pa, attende la terminaison de tous les autres
processus ?

Anissa OMRANE 6
#include <stdio.h>
#include <unistd.h>

void main()
{
int pida,pidb,pidc,pidd,pide,pidf,pidg;
int i;
// pida=getpid();
printf("je suis le processus a %d\n",getpid());

pidb = fork();
if(pidb==0)
{
printf("je suis le processus b %d et mon papa est a %d
\n",getpid(),getppid());
pidd = fork();
if(pidd==0)
{
printf("je suis le processus d %d et mon papa est b %d
\n",getpid(),getppid());

}
else
{
pide = fork();

if(pide==0)
{ printf("je suis le processus e %d et mon papa est b
%d\n",getpid(),getppid());
}
else
{
pidf = fork();

if(pidf==0)
{ printf("je suis le processus f %d et mon papa est b
%d\n",getpid(),getppid());
}
else
{ wait(); wait(); wait();}
}
}
}
else
{
pidc = fork();

if(pidc==0)
{ printf("je suis le processus c %d et mon papa a %d
\n",getpid(),getppid());
pidg = fork();

if(pidg==0)
{ printf("je suis le processus g %d et mon papa est c
%d\n",getpid(),getppid());}
else
wait();
}
else
{
wait();
}

}
}

Anissa OMRANE 7

Vous aimerez peut-être aussi