Gestion de Processus

Systèmes d’exploitation, Programmation Concurrente · lab

Ecole Nationale des Sciences de l’Informatique A. U. : 2014/2015

Systèmes d’exploitation & Programmation Concurrente II2

TP 1 - Gestion de Processus

=======================================================

Exercice 1:

En utilisant le programme ci-dessous, identifiez les valeurs du pid aux lignes A, B, C, et D. (On assume que les pids du parent et du fils sont 2600 et 2603, respectivement.)

/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/

#include <sys/types.h>

#include <stdio.h>

#include <unistd.h>

int main()

{

pid\_t pid, pid1;

/\ fork a child process \/

pid = fork ();

if (pid < 0) {/\ error occurred\/

fprintf( stderr, "Fork Failed");

return 1;

}

else if (pid==0) {/\ Child Process\/

Publicité

pid1=getpid();

printf("child: pid = %d",pid); /\ A \/

printf("child: pid1 = %d",pid1); /\ B \/

}

else { /\ parent process \/

pid1 = getpid() ;

printf("parent: pid = %d",pid); /\ C \/

printf("parent: pid1 = %d" ,pid1); /\ D \/

wait(NULL);

}

return 0;

}

/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/

Exercice 2

La suite de Fibonacci est une série de nombres 0, 1, 1, 2, 3, 5, 8, .... Elle est obtenue comme suit:

fib0 = 0

fib1 = 1

fibn = fibn-l + fibn-2

Ecrire un programme C qui utilise l’appel système fork() et qui permet de générer la suite de Fibonacci sequence dans le processus fils. Le nombre de la suite sera fourni dans la ligne de commande. Exemple : si le nombre 5 est fourni, les 5 premiers nombres de la suite de Fibonacci seront donnés en output par le processus fils. Vu que les processus parent et fils ont leurs propres copies des données, le processus fils donnera la suite de nombres en output. Dans le programme, le processus parent doit invoquer l’appel wait () pour attendre la terminaison du processus fils avant de quiiter (exit) le programme. Faites le contrôle d’erreur nécessaire pour assurer que le nombre passé en ligne de commande est non-négatif.

Exercice 3

Publicité

Déterminez combien de processus engendre l’exécution du programme C suivant et en donnez l’arborescence.

include < unistd .h>

int main ( void )

{

fork () && ( fork () || fork () );

sleep (2);

return 0; }

Exercice 4

Soit le programme suivant :

#include <unistd.h>

#include <stdio.h>

int main ( ) {

int i=0 ;

while (fork() !=0 && i<2)

i=i+1;

printf(" Processus %d termine avec i=%d \n", getpid(), i);

return 0;

}

Supposez que les appels à la fonction fork ne retournent pas d’erreur.

1. Donnez l’arborescence des processus engendrés par ce programme.

Publicité

2. Donnez la valeur de i affichée par chacun des processus.

3. Peut-on risquer d’engendrer un/des processus orphelin(s) et/ou zombie(s) ? si oui justifiez vos réponses et dire comment peut-on le vérifier ?

4. Modifiez le code de la fonction main de manière à

  • éviter la présence éventuelle d’orphelins et zombies, et
  • créer la nouvelle arborescence suivante, où PP est le processus principal :

![](data:image/png;base64...)

Exercice 5

Partie I. Soit le programme C ci-dessous. (On suppose que toutes les fonctions retournent normalement, sans erreurs. On suppose également que tous les appels de printf() sont immédiatement flushed vers stdout).

![](data:image/x-emf;base64...)

Question: Pour chacune des combinaisons suivantes, Encerclez la bonne réponse (Oui) ou (Non) pour indiquer s’il est possible d’obtenir la combinaison comme output du programme ou pas. (2 pts each)

A. 513242 Oui Non

B. 324251 Oui Non

C. 534212 Oui Non

D. 531422 Oui Non

E. 523142 Oui Non

Partie II. Soit le programme C ci-dessous. (On suppose que toutes les fonctions retournent normalement, sans erreurs. On suppose également que tous les appels de printf() sont immédiatement flushed vers stdout.).

![](data:image/x-emf;base64...)

Question: Enumérez tous les outputs possibles de ce programme.