Académique Documents
Professionnel Documents
Culture Documents
: 2017/2018
Devoir Surveillé
Systèmes d’Exploitation & Programmation Concurrente
int main(void)
{
if ( fork() && fork() )
fork();
exit(EXIT_SUCCESS);
}
1) Donner l'arborescence des processus créés. En déduire le nombre total de processus (en
comptant le processus père) créés après Ie lancement de ce programme.
1/11
2) Quelle arborescence obtient-on si l’on remplace
if ( fork() && fork() ) par if (!fork() && !fork() )
Partie II
Écrire un programme qui crée N processus fils. Chacun d’entre eux devra afficher N fois d’affilé
son numéro d’ordre entre 0 et N-1 ainsi que son PID.
1) On considère les processus suivants, définis par leur date d’arrivée, leur durée (réelle ou
estimée en ms) et leur priorité (la plus petite valeur implique la plus haute priorité)
Date Temps
Processus Priorité
d’arrivée estimé
P1 0 10 3
P2 2 1 1
P3 3 2 3
P4 4 1 4
P5 6 5 2
2/11
Un nouveau processus arrivé est inséré, tout d’abord dans la queue la plus prioritaire. À chaque
changement de contexte, l’ordonnanceur examine chaque queue successivement par ordre de
priorité et donne la main au premier processus rencontré. Chaque fois qu’un processus épuise
son quantum il est rétrogradé vers la queue suivante de plus basse priorité.
Date Temps
Processus
d’arrivée estimé (ms)
P1 0 17
P2 12 25
P3 28 8
P4 36 32
P5 46 18
Supposons disposer d’un nombre fini, MAX_RES, d’exemplaires de ressources d’un seul type.
Les processus peuvent demander un certain nombre, count, d’exemplaires parmi les
ressources disponibles (count <=MAX RES) pour les utiliser en exclusivité ; et puis une fois
terminé, ils doivent les retourner. Si, lors d’une demande d’allocation, le nombre d'exemplaires
demandés n’est pas disponible, le processus doit attendre qu'un nombre suffisant d'exemplaires
aient été libérés.
3/11
L’extrait de code C suivant est utilisé afin de gérer l’allocation et la libération d’un nombre
donné d’exemplaires de ressource disponible.
#define MAX_RES 10
//the number of available resources
int available_res = MAX_RES;
available_res += count;
return 0;
1) Dire si ces fonctions peuvent être appelées par plusieurs processus concurrents? Identifier
la section critique et dire que peut-on risquer ?
2) Proposez une solution de synchronisation par variables conditionnelles (pthread) qui
réalise cela en modifiant les fonctions d’allocation (Alloc_Res) et de libération
(Free_Res). Peut-on réveiller tous les processus en attente dans la fonction Free_Res,?
Justifiez.
Indications : Déclarez clairement vos variables globales et précisez leurs initialisations.
3) Donnez le code qui doit être exécuté par les processus pour réaliser l'équivalent des
fonctions Alloc_Res et Free_Res. On introduira tous les sémaphores et variables nécessaires,
en précisant leur valeur initiale. Pourquoi ne peut-on pas pratiquer le réveil en cascade
avec des sémaphores ?
4) Peut-on risquer une famine pour la solution proposée en 2)? Justifiez ? Si oui, proposez une
solution textuelle (sans écrire de code) afin de l’éviter.
Bonne Réflexion
4/11
Proposition de correction
c) PCB 0,25 pt
Les moniteurs sont utilisés par les processus et l’exclusion mutuelle est offerte
implicitement par l’API ; alors les variables conditionnelles sont utilisées par les
int main(void)
{
if ( fork() && fork() )
5/11
fork();
exit(EXIT_SUCCESS);
}
A&&B est évaluée à 0 (FAUX) si A==0 Sinon si B est aussi évaluée à 1 alors
Partie II
Écrire un programme qui crée N processus fils. Chacun d’entre eux devra afficher N fois d’affilé
son numéro d’ordre entre 0 et N-1 ainsi que son PID. 2 pts
#define N 5
#include <unistd.h>
#include <stdlib.h>
int main() {
int i,j;
for (i=0; i<N; i++)
{ switch (fork()) {
-1: printf(“ erreur de creation dans fork ….\n’’) ;
exit(1) ;
0 : for (j=0 ; j<N-1 ;j++)
printf(‘’%d je suis de pid %d\n”,j,getpid());
exit(0) ; //Afin de ne pas boucler n !
default : wait() ;
}
6/11
}
exit(0) ;
}
0 3 4 5 6 10 11 16 18 19
FACPU P2 P2 P2 P5 P3 P4
P3 P5 P3 P4
P4 P3 P4
P4
Processus TT TA
P1 10 0
P2 9 8
(0,75)
P3 15 13
P4 15 14
P5 10 15
Moyenne 11,8
b) Priorité préemptive.
D. Gantt pour priorité préemptive (1-- 0,25 commutation 1 + 4*0,125 + 0,25 FA)
P1 P2 P1 P5 P3 P1 P4
0 2 3 4 6 11 13 18 19
FACPU P2 P1 P3 P5 P3 P1 P4
P3 P4 P3 P1 P4
7/11
P1 P4
P4
Processus TT TA
P1 18 8
P2 1 0
P3 10 8 (0,75)
P4 15 14
P5 5 0
Moyenne 9,8
2) Algorithme d’ordonnancement multi-niveaux MLFQ avec les trois files d’attente (ou
queues)
Q0 (Priorité 0)
Q1 (Priorité 1)
Q2 (Priorité 2)
P01 P11 P02 P 11 P12 P03 P04 P12 P05 P12 P14 P15 P22 P4
0 8 12 20 25 28 36 44 46 54 65 81 91 92 100
FAQ0 P2 P3 P4 P5
FAQ1 P1 P2 P2 P2 P2 ; P4 P4 ; P5
P4
FAQ2 P2 P2 ; P4
8/11
Processus TT TA
P1 25 8
P2 80 55
P3 8 0 (0,5)
P4 64 32
P5 45 27
Moyenne 44,4 (0,125)
L’extrait de code C suivant est utilisé afin de gérer l’allocation et la libération d’un nombre
donné d’exemplaires de ressource disponible.
#define MAX_RES 10
//the number of available resources
int available_res = MAX_RES;
available_res += count;
return 0;
9/11
1) Dire si ces fonctions peuvent être appelées par plusieurs processus concurrents? Identifier
la section critique et dire que peut-on risquer ?
available_res est une variable partagée accédée en ‘’write’’ (available_res++/
#define MAX_RES 10
//the number of available resources
int available_res = MAX_RES;
available_res -= count;
pthread_mutex_unlock (&mutex);
10/11
3) Donnez le code qui doit être exécuté par les processus pour réaliser l'équivalent des
fonctions Alloc_Res et Free_Res. On introduira tous les sémaphores et variables nécessaires,
en précisant leur valeur initiale. Pourquoi ne peut-on pas pratiquer le réveil en cascade
avec des sémaphores ?
#define MAX_RES 10
//the number of available resources
int available_res = MAX_RES;
Processus i {
int count = ……..; //à entrer/récupérer
//**************** 1 pt ********************
P(mutex);
while (available_res < count) {
V(mutex);
P(stop);
P(mutex);
}
available_res -= count;
V(mutex);
Utiliser Ressources
//**************** 1 pt ********************
P(mutex);
available_res += count;
V(mutex);
V(stop);
4) Peut-on risquer une famine pour la solution proposée en 2)? Justifiez ? Si oui, proposez une
solution textuelle (sans écrire de code) afin de l’éviter.
Risque de famine exp. Available_res =10 ; 1) P1(8) 2) P2(4) ; P3(5) ;P4(3). P1 actif
P5(7) ; …
11/11