Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

TD 1 (2020)

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 4

Ecole Nationale des sciences de l’informatique

Niveau : II-2-A Module : Systèmes d’exploitation et


A.U : 2020-2021 programmation concurrente

TD/TP
Gestion des Processus sous Unix

Exercice 1 :

Afin de vous familiariser avec les différentes commandes du shell Unix n’hésitez pas à
utiliser le man.
1) Quel est le processus de pid 1 ? justifier

2) Quelle est la différence entre les commandes pset top?

3) Que fait la commande pstree?

4) Que fait la commande stracels (resp. processus)?

5) Comment utiliser la commande ps pour obtenir la liste des processus en première


colonne et leur état en 2ème colonne ? Quels sont les états possibles ?

6) Ecrire un programme C qui engendre 6 processus liés à leurs ancêtres de la manière


suivante:

En affichez l’identité de chaque processus ainsi que celle du parent.

Exercice 2 :

Supposons l’entier n initialisé à 0, le nombre de processus créés par l’instruction, ci-


dessous, est:

while (pid=fork()) if (n >= 5) break ; else n=n+1;

a) 4
b) 5
c) 6
d) >10
e) aucune des réponses ci-dessus.

En dessinez le graphe des processus.

Exercice 3:

1) Soit le programme suivant :

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


1) Donnez l’arborescence des processus engendrés par ce programme.
2) 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 ?
3) Modifiez le code de la fonction main de manière à
a) éviter la présence éventuelle d’orphelins et zombies, et
b) créer la nouvelle arborescence suivante, où PP est le processus principal :

PP

P1 P2 P3

P4 P5 P6

P7

Exercice 4 :
Combien de processus engendre l’exécution du programme C suivant et en donner
l’arborescence.
# include <unistd .h>
int main ( void )
{
fork () && ( fork () || fork () );
sleep (2);
return 0;
}

Exercice 5:

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 ? 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<unistd.h> /* necessaire pour les fonctions exec */
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(intargc, char * argv[]) {
pid_tpid;
intattente_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 ;
}

/**************************************************************/
Exercice 6 :

É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 !

Exercice 7 :

É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.

Vous aimerez peut-être aussi