TP n°4 : Operations sur les processus (2)
Exercice 1 : Exécutez les programmes 1 et 2 en ajoutant (stdio.h et unistd.h). Expliquez leurs résultats
/*programme 1*/ /*programme 2*/
int main () { int main () {
int p; int p;
p=fork(); p=fork();
if (p==-1) { printf("ERREUR \n");} if (p==-1) { printf("ERREUR \n");}
else if (p>0) { printf(" Je suis else if (p>0) { printf(" je suis le
le père mon pid %d et j'ai créé le pere mon pid %d et j’ai créé le fils
fils %d\n",getpid(),p);} %d\n",getpid(),p);}
else if (p==0) { printf("Je suis else if (p==0) { printf("je suis le
le fils mon PID = %d et je vais fils mon PID = %d et je vais
exécuter le code suivant exécuter le code suivant
\n",getpid()); \n",getpid());
char *const arg[] = {"ls", char *envp[] = {"HOME=
"-l","/",NULL}; /home/user",NULL};
execv("/bin/ls",arg);} char *argv[] = {"ls","-l",NULL};
return 0; } execve("/bin/ls",argv,envp);}
return 0; }
Modifiez le programme 1 en utilisant les appels systèmes execlp et execvp
Modifiez le programme 2 en utilisant l’appel système execle
Exercice 2 : Exécutez les programmes suivant en ajoutant (stdio.h, unistd.h, stdlib.h, sys/types.h et signal.h).
Expliquez leurs résultats
/*programme 1 */ /*programme 2 */
int main() { int main() {
void erreur () { void fin_attente() {
printf("erreur division par zero printf("signal reçu arret de la
\n");exit(1) ;} pause");}
signal(SIGFPE,erreur); signal(SIGINT,fin_attente);
int p; pause();
int z=0; printf("je vais faire mon travail
printf("Chiffre \n"); \n");
scanf("%d",&p); return 0;}
p=p/z;return 0;}
/*programme 4 */ /*programme 3 */
int k; void alarme_handler() {
void segv(){printf("Signal SIGSEGV printf("10 secondes
%d Reçu, %d a provoqué la violation écoulées\n"); }
de mémoire\n",SIGSEGV,k); int main() {
exit(EXIT_FAILURE);} signal(SIGALRM,
int main() { alarme_handler);
signal(SIGSEGV,segv); alarm(10);
char pause();
*buffer[2]={"Hello1","Hello2"}; return 0;}
for (k=0;;k++) {printf("%s num
%d\n",buffer[k],k);}return 0;}
1
Remarque : Les numéros des signaux peuvent être obtenues avec la commande kill -l
/*Programme 5*/
int main() {
int p =fork();
if (p==-1) {printf("erreur \n");}
else if (p==0) { printf("i am %d \n" ,getpid());
while(1) {printf("hello \n");}}
else if (p>0) {
sleep(1);
printf("Le processus %d est stopé par le signal %d \n",p,SIGSTOP);
kill(p,SIGSTOP);
sleep(1);
printf(“le processus %d peut reprendre après le signal %d \n",p,SIGCONT) ;
kill(p,SIGCONT);
sleep(1);
printf("Le processus %d est tué par le signal %d \n",p,SIGKILL);
kill(p,SIGKILL);}
return 0;}
Modifier le programme 2 de tel sorte à ce que l’action par défaut sera attaché au signal SIGINT avec SIG_DFL
ensuite appliqué SIG_IGN pour que le signal soit ignoré.
Exercice 3 : Ordonnanceur des processus (TD)
Soit un système monoprocesseur ordonnance l’exécution des processus des deux tableaux suivant ou chaque processus est
caractérisé par son numéro, son temps d'arrivée (TA), et son temps d'exécution (TE)
Processus TA TE 1. Donnez le diagramme de Gantt pour chaqu’un des algorithmes suivants : FIFO,
P1 0 3 SJF, SRTF, Round Robin (quantum = 5 unités de temps)
P2 2 6 2. Calculez le temps de résidence, le temps d’attente et le temps de réponse (pour
P3 4 4 chaque processus)
P4 6 5 3. Calculez le temps de séjour moyen/le temps d’attente moyen.
4. Calculez le temps moyen de réponse pour l’algorithme SRTF
P5 8 2
Processus TA TE Priorité 5. Donnez le diagramme de Gantt pour l’algorithme de priorité avec
P1 0 5 4 réquisition, sachant que la priorité la plus élevé est celle qui est la plus
P2 2 4 2 grande (exemple : P3)
P3 2 2 6 6. Calculez le temps de résidence, le temps d’attente et le temps de
P4 4 4 3 réponse (pour chaque processus)
7. Calculez le temps de séjour moyen/le temps d’attente moyen.
Exercice 4 :
5 processus arrivent pratiquement en même instant t=0 leur temps d’exécution respectif est estimé à 10, 6, 2, 4
et 8 unités de temps leur priorités respectives sont 3, 5, 2, 1 et 4 respectivement, la valeur 1 correspond à une
priorité la plus élevé (selon Linux), en utilisant l’algorithme d’ordonnancement avec priorité (files multi-
niveaux) et réquisition, les quantums sont les suivant Q1=6 unités, Q2 = 4 unités, Q3=Q4=Q5 = 5 unités
1. Donnez le schéma d’exécution des processus (Diagramme de Gantt)
2. Déterminez le temps moyen d’exécution des processus et le temps de moyen d’attente