Question 1 (5 pts ) : Généralités Répondez, en 5 lignes maximum, aux questions suivantes : a) Expliquez brièvement pourquoi les «threads» sont aussi appelés processus légers? Un threads est rattaché à un processus. Tous les threads d un processus partagent les ressources du processus. b) La solution de Perterson est elle satisfaisante pour résoudre le problème d exclusion mutuelle, expliquer brièvement? Non, car elle se base sur une attente active et sa généralisation à N processus est complexe. c) Si la liste (ou la table de bits) des blocs libres est complètement perdue suite à un «crash», est-il possible de la reconstruire dans le cas d UNIX standard? Oui, il suffit de parcourir les i-noeuds pour récupérer tous les blocs alloués. Les blocs restants sont libres. d) Expliquez comment convertir une adresse linéaire x d'un octet dans un fichier (offset) en numéro de bloc physique, dans le cas de la FAT16. Il faut d abord déterminer le numéro du bloc logique (x / taille du bloc), récupérer le numéro du 1er bloc du fichier (qui est un attribut du fichier) puis parcourir la liste de blocs alloués au fichier (cette liste se trouve dans la FAT). e) Sachant qu il est possible de récupérer des fichiers effacés dans le système de fichiers ext2 généralement utilisé par Linux, expliquer ce qui se passe dans ce système de fichier à la suite de la commande : $> rm monfichier.c L inoeud ainsi que les blocs alloués au fichier sont mis à libre mais ne sont pas effacés.
Question 2 (6 pts) : Synchronisation d une intersection La circulation dans une intersection de deux voies à sens unique est réglée par des signaux lumineux (feu vert/rouge). On suppose que les voitures traversent l intersection en ligne droite et que l intersection peut contenir au plus une voiture à la fois. Voie 2 Feu 2 Voie 1 Feu 1 On impose les conditions suivantes : o toute voiture se présentant à l intersection la franchit en un temps fini ; o les feux de chaque voie passent alternativement du vert au rouge, chaque couleur étant maintenue pendant un temps fini (Duree_du_feu) ; o les arrivées sur les deux voies sont réparties de façon quelconque. Le fonctionnement de ce système peut être modélisé par un ensemble de processus parallèles: o un processus P qui exécute la procédure Changement qui commande les feux; o un processus est associé à chaque voiture; la traversée du carrefour par une voiture qui circule sur la voie i (i = 1, 2) correspond à l'exécution d'une procédure Traverseei() par le processus associé à la voiture. a) Pour simuler un tel système, on vous demande, dans un premier temps, de compléter, en ajoutant les sémaphores et le code nécessaires, les procédures suivantes (attention : vous ne devez pas ajouter de variables d autres types) :
Semaphore Changement () Traversee1() Traversee2() int Feu = 1; while(1) sleep(duree_du_feu); circuler(); circuler(); if Feu == 1) else // Feu = 1 si le feux de la voie 1 est vert, Feu =2 si le feux de la voie 2 est vert //circuler simule la traversée de l intersection b) Dans une seconde étape, il vous est demandé de compléter le moniteur suivant, en ajoutant les variables de condition et le code nécessaires : Moniteur Intersection int Feu = 1, Nbw1=0 ; Nbw2=0; Changement () Traversee1() Traversee2() while(1) sleep(duree_du_feu); circuler(); circuler(); if Feu == 1) else // Feu = 1 si le feux de la voie 1 est vert, Feu =2 si le feux de la voie 2 est vert // Nbw1 est le nombre de voitures.. sur la voie 1 //Nbw2 est le nombre de voitures....sur la voie 2. Corrigé question 2: 1) Sémaphores utilisés : Semaphore SI1=1, SI2=1, SF1=1, SF2=0; Changement Traversee1 Traversee2 int Feu = 1; P(SI1); P(SI2); while(1) P(SF1); P(SF2); sleep(duree_du_feu); Traversee(); Traversee(); if Feu == 1) V(SF1); V(SF2); P(SF1); V(SF2); Feu = 2; V(SI1); V(SI2); else P(SF2); V(SF1); Feu = 1;
SI1 et SI2 sont introduits pour éviter que les voitures attendent sur SF1 et SF2 et bloquent de ce fait les changements de feu effectués par Changement. 2) Moniteurs Moniteur Intersection Boolc wtour1, wtour2, wfeu1, wfeu2; int Feu=1, nbw1=0 ; nbw2=0; Changement () Traversee1() while(1) if( nbw1!=0) sleep(duree_du_feu); nbw1++;wait(wtour1);nbw1--; if (Feu == 1) if(feu!=1) wait(wfeu1); Feu=2;signal(wfeu2); circuler(); if(nbw1!=0) signal(wtour1) ; else Feu=1; signal(wfeu1); Traversee2() if( nbw2!=0) nbw2++;wait(wtour2);nbw2--; if(feu!=2) wait(wfeu2); circuler(); if(nbw2!=0) signal(wtour2) ; Question 3 (2 pts) : Interblocage Soient trois processus concurrents qui utilisent en exclusion mutuelle 6 ressources différentes (de A à F). Ces trois processus exécutent respectivement les codes suivants : Processus_1() while(1) prendre (&D); prendre (&E); prendre (&C); // Utilisation des ressources; Processus_2() while(1) prendre (&C); prendre (&B); prendre (&F); // Utilisation des ressources; Processus_3() while(1) prendre(&a); prendre (&B); prendre (&E); // Utilisation des ressources;
liberer(&d); liberer(&e); liberer(&c); liberer(&f); liberer(&b); liberer(&c); liberer(&e); liberer(&b); liberer(&a); Ces processus concurrents peuvent-ils entrer en interblocage? Expliquez à l aide d un graphe. Si oui, peut-on l éviter? Justifiez brièvement. Corrigé 1 détient D, E attend C 2 détient C attend B 3 détient A, B attend E Oui, en utilisant l algorithme du banquier Question 4 (3 pts) : Ordonnancement L ordonnancement EDF (Earliest Deadline First) est un algorithme d ordonnancement temps réel de processus. A chaque fois qu un processus demande du temps CPU, il doit préciser une échéance (une date limite >0). Le processus doit avoir obtenu son temps CPU avant d atteindre la date limite. L ordonnanceur vise à satisfaire les demandes avant leurs échéances. Pour se faire, il gère une liste des processus prêts, classés par ordre croissant des échéances. L algorithme exécute le premier processus de la liste qui correspond à celui dont l échéance est la plus proche. Lorsqu un processus devient prêt ou arrive dans le système, le système vérifie si son échéance est antérieure (strictement inférieure) à celle du processus en cours d exécution. Si tel est le cas, le nouveau processus préempte le processus en cours. a) Considérez trois processus A,B et C suivants : A demande le CPU toutes les 30ms et requiert à chaque fois 10 ms de temps CPU. B demande du temps CPU toutes les 40ms et requiert à chaque fois 15 ms. C demande du temps CPU toutes les 50ms et a besoin à chaque fois 5 ms de temps CPU. Supposez qu au départ, les processus sont prêts et que l échéance de chaque demande est la date de la prochaine demande. Donnez le diagramme de Gantt pour les 100 premières ms. A B C A B C A B A 0 10 25 30 40 55 60 70 80 95 105 b) Peut-on avoir des cas de non respect d échéances? Justifiez votre réponse.
Oui. Exemple : Processus A (CPU 25, Échéance 30) Processus B (CPU 30, Échéance 40) Dans ce cas, il y a non respect d échéance pour B (25+30 > 40). Question 5 (4 pts) : Gestion de la mémoire Considérez un système de gestion de mémoire qui a les caractéristiques suivantes : Un adressage virtuel sur 32 bits Une taille de Page de 4Ko Une mémoire physique de 1 Mo a) Supposez que le système utilise la segmentation paginée et que l adresse virtuelle est de la forme : Quelles sont les données manquantes à ce problème pour traduire l adresse virtuelle de 32 bits suivante : 0xAE854C9C en adresse physique? Si vous aviez ces informations, identifiez brièvement les étapes à suivre pour effectuer cette translation. Il manque la table des segments qui va nous indiquer la table de pages associée au segment désiré. Cette table des pages nous permettra d obtenir le cadre associé à notre adresse. L adresse physique est obtenue en remplaçant les numéros de segment et de page par le numéro du cadre b) Supposez que le système utilise une pagination à deux niveaux, où les entrées des tables de pages sont sur 4 octets. La structure de l adresse virtuelle est illustrée par la figure suivante : b.1) Si un processus utilise tout l espace adressable qui lui est fourni, combien de pages seront-elles nécessaires pour contenir toutes les tables de pages de ce processus.
Il y a 2 10 tables de pages de second niveau et une table de pages de premier niveau. Chaque table de pages a 2 10 entrées. Elle occupe donc une page 2 10 x 4octects = 4096 octets. REP : 2 10 +1 pages seront nécessaires pour toutes les tables de pages. b.2) Un second processus nécessite 22Mo pour s exécuter entièrement (son code, ses données, pile ). La partie contenant son code est disposée dans sa mémoire virtuelle aux adresses suivantes [2Mo à 6Mo-1], les données sont quant à elles dans l intervalle [12Mo- 21Mo-1]. Si nous devons charger les tables de pages associées à ces deux parties, combien de pages de niveaux 2 seront chargées en mémoire centrale. REP : Chaque entrée de la table des pages de niveau 2 est associée à un cadre de 4Ko (2 12 ). Sachant qu une table de pages de niveau 2 contient 2 10 entrées, elle référence 2 10 * 2 12 o = 4Mo de la mémoire virtuelle. La première table de niveau 2 référence la mémoire virtuelle comprise entre [0, 4Mo-1], la seconde [4Mo, 8Mo-1] et ainsi de suite.. Donc : pour le code 2 tables de pages de niveaux 2 seront nécessaires (c-à-d 2 pages ) pour les données 3 tables de pages de niveaux 2 seront nécessaires (c-à-d 3 pages). c) Supposez maintenant que le système utilise une pagination pure et que les bits 12 à 31 correspondent à un numéro de page. Si nous utilisons une table inversée, combien d entrées la table de pages inversée contiendra-t-elle? Le nombre de cadres est : 2 20 / 2 12 = 2 8 1 entrée par cadre => 2 8 entrées