TP2 Gestiondesprocess PDF
TP2 Gestiondesprocess PDF
TP2 Gestiondesprocess PDF
Que remarquez-vous ?
II. Programmation C :
• fork()
Cette fonction va créer un processus. La valeur de retour n de cette fonction
indique :
o n>0
On est dans le processus père
o n=0
On est dans le processus fils
o n = -1
fork a échoué, on n'a pas pu créer de processus
• getpid() :
Cette fonction retourne le numéro du processus courant.
• getppid() :
Cette fonction retourne le numéro du processus père.
Exercice 1:
Remarque:
• exit( i )
termine un processus, i est un octet (donc valeurs possibles : 0 à 255) renvoyé
dans une variable du type int au processus père.
• wait( &Etat )
met le processus en attente de la fin de l'un de ses processus fils.
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
/***********************************************************************/
Ecrire un programme qui lance dix fils qui effectuent une « course ». A la fin du
programme, l’ordre des fils est affiché (chaque fils effectuera, par exemple une boucle
vide de N tours et N est une valeur aléatoire).
III. Père et fils exécutent des programmes différents
V.1 Fonctions utilisées :
La fonction exec charge un fichier dans la zone de code du processus qui l'appelle,
remplaçant ainsi le code courant par ce fichier. Les primitives de exec sont :
arg : paramètre sous forme d’une liste d’argument, terminé par pointeur NULL
Ces primitives peuvent être suffixées par l’une des lettres suivantes :
2. int execle(const char *ref, const char *arg, …,const char *env[])
Commentaires :
• fic est le nom du fichier exécutable qui sera chargé dans la zone de code du processus
qui appelle execl.
Si ce fichier n'est pas dans le répertoire courant, il faut donner son nom complet
(chemin absolu).
• Les paramètres suivants sont des pointeurs sur des chaines de caractères contenant les
arguments passés à ce programme (cf. argv en C).
La convention UNIX impose que la première soit le nom du fichier lui-même et que le
dernier soit un pointeur nul.
Par exemple, si on veut charger le fichier appelé prog qui se trouve dans le répertoire
courant et qui n'utilise auncun argument passé sur la ligne de commande :
execl ("prog", "prog", (char *)0)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
if (argc != 2)
{printf(" Utilisation : %s fic. a executer ! \n", argv[0]);
exit(1);
}
case -1 :
printf (" Le fork n'a pas reussi ");
exit (3) ;
default :
/* le pere attend la fin du fils */
printf (" Pere numero %d attend\n ",(int) getpid());
Fils=wait (&Etat);
printf ( " Le fils etait : %d ", Fils);
printf (" ... son etat etait :%0x (hexa) \n",Etat);
exit(0);
}
return 0;
}
/***********************************************************************/
On pourra y faire exécuter par execl un fichier très simple, par exemple celui dont le source
est ci-dessous :
...........................................................................
...........................................................................
...........................................................................
...........................................................................
...........................................................................
...........................................................................
...........................................................................
...........................................................................
....
IV. Exercices :
D'après les exemples précédents, écrire un programme dont le fonctionnement est le suivant :
Récupérez un canevas du programme à écrire ainsi que des indications sur l'utilisation
de argc, argv et sur la création des N fils.
Compiler en utilisant l'option -Wall de gcc, il ne doit pas y avoir de warnings après la
compilation.
/* ----------------------------------------
* Dans main, on indique comment utiliser
* les parametres passes sur
* la ligne de commande
* ----------------------------------------
*/
int main (int argc, char *argv[])
{
int Nbre_de_Proc, i_fils, pid_fils;
/* ----------------------------------------
* creation des processus fils
* ----------------------------------------
*/
for ( i_fils =1; i_fils <= Nbre_de_Proc ; i_fils++ )
{
pid_fils = fork();
switch (pid_fils)
{
case 0 :
fils(i_fils); /* il faut ecrire la fonction fils ... */
break;
case -1 :
perror("Le fork n'a pas reussi ");
exit(33); /* si erreur -> fin du pere ! */
}
}
/* --------------------------------------------
* Dans la fonction pere, on utilisera le
* fait que wait renvoie la valeur -1 quand
* il n'y a plus de processus fils a attendre.
* --------------------------------------------
*/
pere(); /* il faut aussi ecrire la fonction pere ... */
return 0;
/***********************************************************************/
N processus sont en attente d’exécution sur un processeur. Les processus sont numérotés de 1
à N dans la file d'attente et une durée d'exécution est associée à chacun.
On veut simuler l'exécution des processus en attente en utilisant le principe de Round Robin
qui est le suivant : on fixe un quantum de temps élémentaire Q et on exécute chaque processus
dans l'ordre de la file d’attente pendant Q unités de temps. Lorsqu'un processus est terminé, il
quitte la file d'attente ; sinon sa durée d'exécution est diminuée de Q.
Exemple : si on dispose de 4 processus avec les durées indiquées dans la table ci-dessous et si
la valeur du quantum de temps est 2, l’ordre d’achèvement des processus est : P3, P1, P4 et
P2.
P1 P2 P3 P4
3 5 2 3
Ecrire un programme qui
- lit le nombre de processus et la durée d'exécution de chacun d'eux,
- affiche les numéros des processus au fur et à mesure de leur achèvement pour
différentes valeurs de Q fournies par l'utilisateur.
On représentera les processus en cours d'exécution par une liste chaînée circulaire (le suivant
du dernier élément de la liste est le premier élément de cette liste).
En quoi cette représentation est-elle bien adaptée au problème ?