Exam 18 19 Correction
Exam 18 19 Correction
Exam 18 19 Correction
Partie 1.
Des développeurs désirent réaliser une application de gestion de salle de révision dans un institut.
Dans cette partie, nous supposerons qu’il existe une seule salle de révision, qui peut être utilisée
par un seul groupe d’étudiants à la fois. Un groupe d’étudiants a besoin de réserver une salle pour
pouvoir réviser. Le groupe peut être composé de 2 à 5 personnes, au maximum, car la capacité de
la salle est de 5. Le premier étudiant d’un groupe qui demande à réserver la salle peut le faire si
elle est libre, sinon il attend que le groupe qui l’utilise la libère. Les autres membres du groupe
utilisent la salle directement, si l’un de leurs camarades l’a déjà réservée.
Initialisation
semaphore salle = 5;
Processus Etudiant
reserver_salle(){
down (salle);
utiliser_salle();
up (salle);
}
1. Quelles sont les conditions de bonne synchronisation des processus qui ne sont pas
respectées dans ce code ? Donner un scénario d’exécution montrant comment cette (ou ces)
condition(s) ne sont pas respectées. (1)
1
Code (réservé à l’admin)
Nom & Prénom : …………………………………………………..
La condition non respectée est : L’exclusion mutuelle. Car un étudiant d’un groupe peut utiliser la
salle en même temps qu’un étudiant d’un groupe différent : accès non autorisé à la section critique.
Initialisation
semaphore salle = 1; //protège la salle pour qu’elle soit accédée par un seul groupe
semaphore mutex[n] = {1 ;1 ;… ;1} ; //mutex[i] protège la variable groupe[i]
int groupe[n]={0 ;0… ;0} //groupe[i] = nb étudiants d’un groupe i arrivés
Processus Etudiant
reserver_salle(groupe_id){
down(mutex[groupe_id]) ;
groupe[groupe_id] ++ ;
if (groupe[groupe_id] == 1){
down(salle) ;
}
up(mutex[groupe_id]) ;
utiliser_salle();
down(mutex[groupe_id]);
groupe[groupe_id] -- ;
if (groupe[groupe_id] == 0){
up(salle) ;
}
up(mutex[groupe_id])
}
Partie 2.
Nous supposerons maintenant que le nombre de salles est supérieur à 1 (par exemple 10), toutes
les autres conditions sont maintenues. Nous supposerons que le premier étudiant d’un groupe doit
d’abord chercher une salle libre parmi les salles disponibles. S’il en trouve une, il la réserve, et les
membres de son groupe peuvent y accéder directement sans attendre. Sinon, il devra attendre l’une
des salles au hasard. Dès qu’elle est libérée par le groupe qui l’occupe, il pourra y accéder, lui et
tout autre membre de son groupe qui attendent avec lui. Si d’autres membres arrivent plus tard, ils
pourront accéder directement à la salle.
2
Code (réservé à l’admin)
Nom & Prénom : …………………………………………………..
3. Écrire le code de la fonction reserver_salle. Prenez soin d’initialiser les sémaphores utilisés,
et de mettre des commentaires pour expliquer leur utilité. (2)
Initialisation
semaphore salle = 10; //représente le nombre de salles libres
semaphore mutex[n] = {1 ;1 ;… ;1} ; //mutex[i] protège la variable groupe[i]
int groupe[n]={0 ;0… ;0} //groupe[i] = nb étudiants d’un groupe i arrivés
Processus Etudiant
reserver_salle(groupe_id){
down(mutex[groupe_id]) ;
groupe[groupe_id] ++ ;
if (groupe[groupe_id] == 1){
down(salle) ;
}
up(mutex[groupe_id]) ;
utiliser_salle();
down(mutex[groupe_id]);
groupe[groupe_id] -- ;
if (groupe[groupe_id] == 0){
up(salle) ;
}
up(mutex[groupe_id])
}
3
Code (réservé à l’admin)
Nom & Prénom : …………………………………………………..
D 40 8 25 (11/7019), (20/143)
A(5/19015) signifie que, 5 unités de temps après son démarrage, le processus A a besoin
d’exécuter l’instruction à l’adresse logique 19015.
Il est important de noter que, pour que le processus puisse démarrer, il a besoin de charger sa
première page en mémoire.
L’objectif final est de représenter les états de la mémoire physique aux différents moments.
4
Code (réservé à l’admin)
Nom & Prénom : …………………………………………………..
Donner l’état (contenu) des tables de pages à l’instant 38. Une table de page contient une
référence vers le cadre au niveau de la mémoire centrale + un bit de présence.
B11
B21 B31
B12
F1 : F2 : B22 F3 : B32
B13
B23 B33
B14
B24 B34
B15
B25 B35
B16
B17
5
Code (réservé à l’admin)
Nom & Prénom : …………………………………………………..
Les blocs de ces trois fichiers sont répartis sur le disque comme suit1 :
0 3 6 9 12 15 18 21 24 27
B23 B22 B14 B12 B16 R1 B17
1 4 7 10 13 16 19 22 25 28
F3 B11 B21 R2 B32 B13 B24 B35 F1
2 5 8 11 14 17 20 23 26 29
B33 B34 B15 B25 B31 F2
Ces trois fichiers sont sauvegardés selon l’arborescence suivante (R1 et R2 étant des répertoires):
R1
|_ F1
|_ F2
|_ R2
|_ F3
Le système de fichiers utilise les iNodes pour gérer ses blocs logiques. On supposera qu’un iNode
contient 2 pointeurs directs, un bloc d’indirection simple et un bloc d’indirection double
uniquement. Les iNodes principaux des structures R1, R2, F1, F2 et F3 sont respectivement les
blocs physiques 21, 10, 25, 26, 1.
Nous précisons que l’iNode d’un répertoire pointe directement sur les iNodes des répertoires et
fichiers qu’il contient.
Nous supposerons que :
• Les blocs de données sont de taille = 32 octets
• Les blocs d’index (blocs contenant des adresses) sont de taille = 16 octets
• La taille du disque = 2 Ko
• La taille d’une adresse = 4 octets
• La taille des métadonnées d’un fichier est négligeable
1
le nombre de blocs total du disque représentés dans la figure n’est pas significatif
6
Code (réservé à l’admin)
Nom & Prénom : …………………………………………………..
2
Comme dans le cas d’allocation chaînée, il n’existe pas de blocs d’indexe, on considère que les blocs ont
une taille identique de 32 octets.