Corrigé interrogation– Systèmes d'exploitation
Exercice 1 : (5 pts)
On considère le programme ci-dessous écrit avec les primitives Fork/Join:
Déclaration :
Int c=0, d=0, e=0 ;
Int n1=X; n2 = Y
(1) begin
(2) fork etiq2
(3) T1
(4) Goto etiq 3
(5) etiq2 :
(6) T2
(7) etiq 3:
(8) join n1
(9) Fork etiq4
(10) Fork etiq5
(11) T3
(12) goto etiq6
(13) etiq4:
(14) T4
(15) goto etiq6
(16) etiq5:
(17) T5
(18) Etiq6:
(19) join n2
(20) T6
(21) end
Avec :
(T1): lire(a) (T4): d = a*b
(T2): lire(b) (T5): e = d*a
(T3): c = a*a (T6): e=c+d+e
0,5 pt 1- Déduire les valeurs de n1 et n2 n1= 2 n2= 3
2- Est-ce que ces scénarios sont possibles ? Si oui quelle est la valeur finale de e, sinon expliquez le problème.
Nous Supposons que a=3 et b=2
Scenario e= Explication si problème
1.5 pt (T1), (T2), (T4), (T3), (T5), (T6) 33
(T2), (T1), (T5), (T3), (T6), (T4) (T6) est en séquentiel avec les autres tâches, elle doit s’exécuter en dernier.
(T2), (T1), (T5), (T4), (T3), (T6) 15
3- Nous désirons avoir le même résultat quel que soit l’ordre d’exécution, modifiez le programme en ajoutant/
supprimant ou modifiant les lignes nécessaires. Puis dessinez le graphe de précédence correspondant
N° Ligne Type de modification Nouvelle instruction
10
1.5 pt
15
16
1/3
Graphe de précédence:
1.5 pt
Exercice 2 : (6 pts)
Considérons l’expression arithmétique suivante : x= 3.14 * (((a+b)/(c-d)) + e*f) - (d-c)*(a+b)
1. Proposer une décomposition optimisée de l’expression arithmétique en tâches.
X1 ➔ a + b X5 ➔ X3 + X4
X2 ➔ c - d X6 ➔ 3.14 * X5
2pts
X3 ➔ X1 / X2 X7 ➔ X1 * X2
X4 ➔ e * f X ➔ X6 + X7
2. Ecrire un programme en utilisant parbegin/parend permettant de calculer de façon parallèle l’expression arithmétique. Le
programme donné doit offrir un parallélisme maximal.
Begin
parbegin
X4 := e*f
begin
parbegin
X1 := a+b
4 pts X2 := c-d
parend ;
parbegin
X3 := X1 / X2
X7 := X1 * X 2
parend ;
end
parend ;
X5 := X4 + X3 ; X6 := 3.14 * X5 ; X := X6 + X7
end
Exercice 3 : (9 pts)
Soit une variante du modèle producteur consommateur où nous avons 2 producteurs P1 et P2 et un seul consommateur C.
Chaque producteur dispose de son propre tampon (T1 pour P1 et T2 pour T2) pour déposer ses messages (nous supposons
que les tableaux ont une taille de 10 cases).
Nous supposons que les messages du producteur P1 sont plus prioritaires que les messages du producteur P2.
Donner le pseudocode de DéposerP1(Message), DéposerP2(Message) et PréleverMessageC( ) correspondant respectivement
à l’exécution du producteur P1 pour le dépôt de son message dans T1, l’exécution du producteur P2 pour le dépôt de son
message dans T2 et la récupération des messages des deux producteurs pour le consommateur C.
Déclaration :
I(Plein,0) ; //gère le nombre total de messages dans T1 et T2 1.5 pt
I(Vide1,5); //gère le nombre de cases vides dans T1
I(Vide2,5); //gère le nombre de cases vides dans T2
I(Mutex,1); //gère l’accès à la variable partagée Nombre
Int IndP1, IndP2, ConsT1, ConsT2 = 0 ;
2/3
DéposerP1(Message) DéposerP2(Message)
{ {
P(Vide1) ; P(Vide2) ; 2 pts
2.5 pts
T1[IndP1]=M ; T2[IndP2]=M ;
Queue1=( IndP1+1)%10 ; Queue2=( IndP2+1)%10 ;
P(Mutex); V(Plein) ;
Nombre++; }
V(Mutex);
V(Plein);
}
PréleverMessageC( )
{
P(Plein) ; // est-ce qu’il existe un message à retirer ?
P(Mutex) ; 3 pts
// est-ce qu’il existe des messages prioritaires ?
if (Nombre >0) {
Nombre - - ;
V(Mutex)
M = T1[ConsT1] ;
ConsT1 = (ConsT1 + 1)%10 ;
V(Vide1) ;
}
else {
V(Mutex)
M = T2[ConsT2] ;
Tete2 = (ConsT2 + 1)%10 ;
V(Vide1) ;
}
return (M) ;
}
3/3