Info32B – Systèmes d’Exploitations – année 2015-2016
Partiel – 23 octobre 2017
N. Sabouret, F. Faissole, R. Pelle, T. Lavergne
Nom : Prénom : Signature :
— L’épreuve dure 1h30. Tous les documents sont autorisés.
— Le sujet comprend 4 exercices indépendants.
— Toutes vos réponses doivent être justifiées.
Exercice 1 – Question de cours (4 points)
1. Quelle est la différence entre une interruption et une exception ? (1 point)
Correction :Une exception est une interruption logicielle, c’est-à-dire qu’un processus demande à l’OS d’intervenir.
2. Donnez 3 exemples d’appel système vus en cours. (1 point)
Correction : wait, notify, fork, exec, open, read/write, malloc, . . . 3. Qu’est-ce qu’un déroutement ? (1 point)
Correction : Lorsqu’un défaut de page se produit, l’OS doit demander la page au péri- phérique de stockage externe puis la charger en mémoire. Pendant ce temps, le processus en exécution est mis en attente. C’est un déroutement.
4. Qu’est-ce qu’un Process Control Block ? (1 point)
Correction : C’est la structure de données qui permet à l’OS de stocker l’ensemble des informations utiles sur un processus (propriétaire, adresse du processus en mémoire, priorité, usage, état dans le cycle de vie, etc).
Exercice 2 – Mémoire (6 points)
On considère un système pouvant gérer jusqu’à 2048 processus pouvant adresser chacun 16 Gio de mémoire. Le système dispose de 8 Gio de mémoire physique.
1. Sur combien de bits sont codées l’adresse logique et l’adresse physique ? Justifiez votre réponse (1 point)
Correction :Adresse physique sur 33 bits (car 8 Gio) et adresse logique sur 34 bits (16 Gio).
2. Quelle est la quantité maximale de mémoire virtuelle pour le système ? (0,5 point) Correction : 2048×16Gio= 245o= 32T io
3. On suppose que l’allocation de mémoire est contiguë avec une stratégie Best Fit.
On considère l’éxécution des processus suivante :
Processus P1 P2 P3 P4
Arrivée 0 2 1 4
Mémoire 6,5 Gio 0,5 Gio 2 Gio 4,5 Gio
Durée 3 6 12 6
Décrivez précisément l’allocation mémoire à chaque pas de temps, en expliquant au fur et à mesure comment sont positionnés les processus. (1 point)
Correction :
— Au temps 0, P1 rentre.
— Au temps 1, P3 ne peut pas rentrer (car il ne reste que 1,5 Gio de libre).
— Au temps 2, P2 peut rentrer et il reste 1 Gio de libre.
— Au temps 3, P1 termine et P3 peut rentrer, laissant deux blocs libres (l’un de 4,5 Gio, l’autre de 1 Gio).
— Au temps 4, P4 peut rentrer en utilisant le bloc libre de 4,5 Gio.
— Au temps 8, P2 termine ;
— Au temps 10, P4 termine ;
— Au temps 15, P3 termine.
4. Donner le taux de fragmentation à t= 3 secondes pour l’exécution donnée à la question précédente. (0,5 point)
Correction :On a 2,5 Gio utilisés sur 8 Gio prévus (donc 5,5 de libre). Mais il ne faut pas compter le dernier Gio d’espace libre qui n’est pas de la "fragmentation" (un disque libre n’est pas 100 % fragmenté !). Le taux de fragmentation est de 4,5 / 8 ' 56 %.
5. On suppose maintenant quela mémoire est paginée(à un niveau de pagination), avec des cadres de pages de 128 Kio. Sur combien de bits sont codés le décalage, le numéro de page et le numéro de cadre ? Justifiez votre réponse. (1 point)
Correction : Les cadres de pages font 128 Kio = 217 o. Donc le décalage est codé sur 17 bits. Le numéro de page est codé sur (34 - 17) bits soit 17 bits. Le numéro de cadre est codé sur (33 - 17) bits soit 16 bits.
6. On considère la table de pages d’un processusP dont les 4 premières entrées sont données ci-dessous :
Node page Node cadre Bit de validité
0 0010 1
1 A1A3 0
2 FFFF 1
3 3000 1
Calculez l’adresse physique correspondant à l’adresse logique 00004B6A4. Vous devez expliquer les détails de votre calcul. Attention ! Prenez garde au nombre de bits de décalage et de numéro de page !(1 point)
Correction :Adresse logique 0 0004 B6A4 correspond à décalage = 0B6A4 (17 bits) et page = 2. La page est valide, donc on peut calculer l’adresse physique FFFF (16 bits) concaténé avec 0B6A4 (17 bits) ce qui donne 1 FFFE B6A4.
7. On s’intéresse à l’adresse physique 1 4346 0101. Est-ce que cette adresse appartient au processus P? Si oui, quelle est son adresse logique. Si non, expliquez. (1 point)
Correction : L’adresse physique s’écrit en binaire 1 0100 0011 0100 0110 0000 0001 0000 0001 ce qui correspond à A1A3 pour le cadre, 00101 pour le décalage. Le cadre est bien présent dans la table mais il n’appartient pas au processus.
Exercice 3 – Threads (5 points)
Partie 1 : Cycle de vie des threads
On propose le code Java suivant :
public class exercice extends Thread { public String name;
public exercice(String s){
this.name = s;
}
public void run(){
for(int i = 0 ; i < 8 ; i++){
System.out.println("bonjour de la part de " + name);
try {
Thread.sleep(1000);
if (name != "fifi" && i == 5){
break;
}
} catch (InterruptedException e) { break;
} }
System.out.println("aurevoir de " + name);
}
public static void main ( String[] args){
System.out.println("début");
exercice[] threads = { new exercice("riri"), new exercice("fifi"), new exercice("loulou") };
for(exercice ex : threads) ex.start();
try {Thread.sleep(2500);}
catch (Exception e){ e.printStackTrace();}
threads[2].interrupt();
try {
threads[1].join();
} catch (InterruptedException e) { e.printStackTrace();
}
System.out.println("adieu");
} }
1. Écrivez le contenu de la sortie standard quand on exécute ce programme Java. (2 points)
Correction : La sortie est la suivante.
début
bonjour de la part de fifi bonjour de la part de riri bonjour de la part de loulou bonjour de la part de fifi bonjour de la part de riri bonjour de la part de loulou bonjour de la part de fifi bonjour de la part de riri bonjour de la part de loulou aurevoir de loulou
bonjour de la part de fifi bonjour de la part de riri bonjour de la part de riri bonjour de la part de fifi bonjour de la part de riri bonjour de la part de fifi aurevoir de riri
bonjour de la part de fifi bonjour de la part de fifi aurevoir de fifi
adieu
Partie 2 : synchronisation
Nous considérons maintenant le code Java suivant : boolean[] section_critique = {false,false};
void entrer_sc(int id) {
section_critique[id] = true;
while(section_critique[1-id])
; }
void sortir_sc(int id){
section_critique[id] = false;
}
1. Expliquez pourquoi ce code ne protège pas des interblocage. (1 point)
Correction :Rien n’empêche deux processus de se marquer tous les deux en SC et donc de rentrer dans une boucle d’attente infinie. C’est l’exemple qui a été vu en cours. P0 appelle SC et effectue sc[0]=true, puis est interrompu, P1 fait de même, donc attend P0, qui reprend la main et attend P1, etc.
2. Réécrivez les deux fonctions pour empêcher l’interblocage (1 point)
Correction :On implémente un système de tour pour gérer le cas où les deux processus veulent entrer en section critique en même temps. C’est encore une question de cours...
class Mutex1 implements Mutex { boolean [] est SC = {false,false};
int tour = 0;
void commencerSectionCritique(int id) { tour=1-id;
est SC[id]=true;
while (est SC[1-id] && tour==1-id)
; }
void finirSectionCritique(int id) { est SC[id]=false;
} }
3. Proposez une méthode permettant de réduire l’attente active des processus (0,5 point) Correction : Il est possible d’utiliser les fonctions wait() et notify() pour réduire l’at- tente active des processus.
4. Peut-on généraliser cette méthode pour N processus, N>2 (0,5 point) Correction : Oui, c’est l’algorithme de Dekker vu en cours.
Exercice 4 – Ordonnancement (5 points)
On considère un système utilisant un ordonnancement par priorités dynamiques allant de 0 (la plus basse) à 4 (la plus haute). À chaque fois qu’un processus se voit attribué le processeur, sa priorité baisse de 1 sans jamais descendre en dessous de 0.
L’algorithme d’ordonnancement choisit le processus dont la priorité est la plus élevée et pour un niveau de priorité il utilise l’algorithme Round-Robin avec un quantum de 2.
Les processus peuvent faire des demandes d’E/S qui suspendent le processus pendant 5 unités de temps. Lorsqu’un processus repasse dans la file "Prêt" après une demande d’E/S, sa priorité est réinitialisée à sa valeur initiale mais il ne peut pas préempter le processus actuelle- ment en cours d’exécution.
On considère les processus suivants pour lesquels on indique la date d’arrivée, la durée estimée, la priorité et les temps où ils vont réaliser une demande d’E/S :
Proc. Arrivée Durée Priorité E/S
P1 0 10 4 3, 5, 9
P2 0 6 2
P3 1 5 3
P4 4 2 4 1
P5 8 5 2
P6 11 6 3
1. Dessinez le diagramme de Gantt représentant l’ordonnancement de ces processus dans le cas de l’algorithme plus court-d’abord en ignorant les priorités et les demandes d’E/S.
Vous indiquerez aussi le temps d’attente moyen. (1,5 points) Correction :
17 0
18 1
19 2
20 3
21 4
22 5
23 6
24 7
25 8
26 9
27 10
28 11
29 12
30 13
31 14
32 15
33 16
34 17
2 4 3 5
5 6 1
Attention, aux temps 1 et 4 des processus arrivent mais ne préemptent pas P2 car leur durée sont égales à la durée restante de P2 qui est donc prioritaire car déjà en cours d’exécution. À T=8, P3 et P5 sont à égalité mais P3 est arrivé en premier et donc à la priorité.
Temps moyen : (24 + 0 + 7 + 2 + 5 + 7)/6 = 45/6 = 7.5
2. Toujours en ignorant les priorités et demandes d’E/S, dessinez le diagramme de Gantt dans le cas de l’algorithme Round-Robin. Vous indiquerez aussi le temps d’attente moyen.
(1,5 points) Correction :
17 0
18 1
19 2
20 3
21 4
22 5
23 6
24 7
25 8
26 9
27 10
28 11
29 12
30 13
31 14
32 15
33 16
34 17
1 2 3 1 4 2 3 5 1
1 6 2 3 5 1 6 5 1 6
Temps moyen : (22 + 16 + 17 + 4 + 17 + 17)/6 = 93/6 = 15.5
3. Dessinez le diagramme de Gantt représentant l’ordonnancement des processus dans le cas du système complet avec priorité et demandes d’E/S. Vous indiquerez aussi le temps d’attente moyen. (2 points)
Correction :
17 0
18 1
19 2
20 3
21 4
22 5
23 6
24 7
25 8
26 9
27 10
28 11
29 12
30 13
31 14
32 15
33 16
34 17
1 3 4 1 2 3 4 1 6 5
6 1 1 2 3 5 1 6 2 5
Temps moyen : (4 + 27 + 20 + 0 + 21 + 14)/6 = 86/6 = 14.33