Devoir Libre
Directives :
Les réponses doivent être écrites à la main par stylo bleu ou noir.
Les feuilles de réponses sont ensuite scannées et envoyées sous format PDF à l’adresse
« madiafi.med@gmail.com ».
Le dernier délai de remise du devoir est le 10 juin 2018.
Exercice n°1 :
On considère l'ensemble des processus suivants :
Processus Date d'arrivée Temps CPU Priorité
A 60 100 1
B 10 200 2
C 130 100 3
D 40 100 4
Exercice n°2 :
On considère une architecture monoprocesseur sur laquelle on désire exécuter un
ensemble de 3 programmes dont le comportement est défini comme suit :
On considère que l'on dispose d'un seul canal simple pour gérer un disque, et que l'ordre
de services des requêtes pour ce disque se fait selon une politique FCFS.
On considère que l'ordonnancement sur le processeur se fait selon une stratégie SRT.
1. Remplir les diagrammes de Gantt relatifs à l'ordonnancement des trois processus.
2. Calculer le nombre de commutations de contexte.
3. Calculer les :
a) Temps d'attente du processeur pour chaque programme.
b) Temps de rotation de chaque programme.
Exercice n°3 :
1. Donner l'arborescence de processus créés lors de l'exécution du programme
suivant :
int main( ){
pid_t p1=fork( ), p2, p3;
if(p1==0) printf("P1(père, pid, fils) = (%d, %d, -)\n", getppid( ), getpid( ) );
else if (p1>0){
printf("P2(père, pid, fils) = (%d, %d, %d)\n", getppid( ), getpid( ), p1);
p2=fork( );
if(p2==0) printf("P3(père, pid, fils) = (%d, %d, -)\n", getppid( ), getpid( ) );
else if (p2>0){
printf("P4(père, pid, fils) = (%d, %d, %d)\n", getppid( ), getpid( ), p2);
p3=fork( );
if(p3==0) printf("P5(père, pid, fils) = (%d, %d, -)\n", getppid( ),
getpid( ) );
else if (p3>0)
printf("P6(père, pid, fils) = (%d, %d, %d)\n", getppid( ), getpid( ), p3);
else printf("Impossible de créer le processus\n");
}
else printf("Impossible de créer le processus\n");
}
else printf("Impossible de créer le processus\n");
return 0;
}
2. Quel est le processus père du processus exécutant ce programme ?
Exercice n°4 :
1. Quelle est l'arborescence créée par le programme suivant :
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(){
pid_t pid=fork();
if(pid>0){
pid=fork();
if(pid==0) pid=fork();
else if(pid>0) pid=fork();
else printf("Erreur de création du processus.\n");
}
else if(pid==-1) printf("Erreur de création du processus.\n");
while(wait()>0);
return 0;
}
2. Même question pour le programme suivant :
int main(){
pid_t pid, tmp=getpid();
int i=9;
while(i>=0){
i/=2;
i--;
pid=fork();
if(pid==0) printf("P%d(P%d, -)\n", getpid()-tmp, getppid()-tmp);
else if(pid>0){
if(getppid()-tmp>=0)
printf("P%d(P%d, P%d)\n", getpid()-tmp, getppid()-tmp, pid-tmp) ;
else printf("P%d(bash, P%d)\n", getpid()-tmp, pid-tmp);
}
else printf("Erreur de création du processus.\n");
}
while(wait()>0);
}
3. Écrire une fonction en C permettant de créer l'arborescence de processus
suivante :