Vous êtes sur la page 1sur 7

FACULTE DES SCIENCES UNIVERSITE DE DOUALA

DEPATEMENT DE MATHEMATIQUES-INFORMATIQUE

INF326-SE : SYSTEMES D’EXPLOITATION


TRAVAUX DIRIGES ET PRATIQUES – FICHE 1

EXERCICE 1

1.1 Quelles sont les deux fonctions principales d’un système d’exploitation ?
1.2 Qu’est-ce que la multiprogrammation ?
1.3 Qu’est-ce que le spoulage ? Pensez-vous que les ordinateurs personnels intégreront le spoulage
de manière systématique à l’avenir.
1.4 Sur les premiers ordinateurs, chaque octet de données lu ou écrit géré par la CPU (c’est-à-dire qu’il
n’y avait pas de DMA). Quelles conséquences cela a-t-il sur la multiprogrammation ?
1.5 Pourquoi le temps partagé n’était-il pas très répandu sur les machines de seconde génération ?
1.6 L’idée de famille d’ordinateurs a été introduite dans les années 1960 avec les mainframes IBM/360.
Cette idée a-t-elle été abandonnée définitivement ou est-elle encore d’actualité ?
1.7 L’une des raisons pour lesquelles les IHM ont mis longtemps à s’imposer était le coût du matériel
nécessaire pour les supporter. Combien de RAM vidéo faut-il pour gérer un terminal texte de 25
lignes et 80 colonnes ? Combien pour un écran graphique de 1024x768 pixels, avec une bitmap de
couleurs sur 24 bits ? Combien cela coûtait-il en 1980 (prix de la RAM : 5 dollars le Ko) ? Combien
cela coûte-t-il maintenant ?
1.8 Parmi ces instructions, lesquelles ne devraient être autorisées qu’en mode noyau ?
a. Désarmer toutes les interruptions ;
b. Lire l’horloge donnant la date ;
c. Ecrire l’horloge donnant la date ;
d. Changer la carte de l’espace d’adressage.
1.9 Enoncez quelques différences entre un système d’exploitation pour ordinateurs personnels et
pour mainframes.
1.10 Un ordinateur possède un pipeline à quatre niveaux. Chaque niveau met le même temps (1 ns)
à s’exécuter. Combien d’instructions par seconde cette machine peut-elle exécuter ?
1.11 Un relecteur remarque une faute d’orthographe répétée dans un manuscrit d’ouvrage sur les
systèmes d’exploitation prêt à être mis sous presse. Le livre fait à peu près 700 pages, contenant
chacune 50 lignes de 80 caractères. Combien de temps prendra la vérification électronique du livre
entier, si on suppose que la totalité du texte se trouve dans la mémoire principale ou sur disque
(on suppose que le temps d’accès typique à la mémoire est de 10 ns et de 10 ms pour le disque).
On considérera pour les méthodes de stockage internes que le temps d’accès est donné par
caractère ; pour le disque, on le supposera donné par bocs de 1024 caractères.
1.12 Quelle différence majeure y a-t-il entre un déroutement et une interruption ?
1.13 Pourquoi une table de processus est-elle nécessaire dans un système à temps partagé ? Est-
elle également requise dans un système personnel où un seul processus existe, avec accès à toute
la machine durant son exécution ?
1.14 Y a-t-il une raison pour laquelle on pourrait souhaiter monter un système de fichiers sur un
répertoire non vide ? Si oui, laquelle ?
1.15 L’instruction cpt = write(df, buffer, nbOctets) ; peut-elle retourner une valeur différente de
nbOctets dans cpt ? Si oui, pourquoi ?
1.16 Un fichier de descripteur df contient la séquence d’octets 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5. Les appels
système suivants sont exécutés :
lseek(df, 3, SEEK_SET) ;
read(df, buffer, 4);
Que contient buffer après le read?
1.17 Quelle est la différence fondamentale entre un fichier spécial en mode bloc et un autre en
mode caractère ?
1.18 Le modèle client-serveur est très répandu dans les systèmes distribués. Peut-il également être
utilisé dans un système mono-machine ?
1.19 Pour un programmeur, un appel système ressemble à n’importe quel appel à une procédure.
Est-ce important pour lui de savoir quelles procédures déclenchent effectivement un appel
système ? Dans quels cas et pourquoi ?
1.20 La Memory Management Unit (MMU).
Adresse
Registres quand
0xFFFFFFFFF le programme 2
s’exécute

Programme et Registres quand Limite-2


Données
données utilisateur le programme 1
utilisateur-2
s’exécute Base-2

Limite Limite-2
Programme et Base-2 Données
utilisateur-1
données utilisateur Limite-1
Limite-1 Programme
utilisateur
Base Base-1 Base-1

Système Système
d’exploitation d’exploitation
0
(a) (b)

Figure 1.1- (a) Utilisation d’une paire base-limite. Le programme peut accéder à la mémoire entre
ces deux valeurs. (b) Utilisation de deux paires base-limite. Le code est entre les valeurs de la
première paire, les données entre celle de la seconde.

Il est souvent souhaitable de laisser plusieurs programmes en mémoire simultanément. Si un


programme est bloqué dans l’attente du résultat d’une lecture disque, un autre programme peut
utiliser la CPU, ce qui optimise le taux d’utilisation de celle-ci. Cela dit, dans un tel cas, deux problèmes
doivent être résolus :

2
TD-TP : INF326-SE
(1) Comment protéger les programmes les uns des autres (et le noyau de ceux-ci) ?
(2) Comment prendre en charge le relogeage ?

Plusieurs solutions existent, mais toutes supposent de joindre à la mémoire du matériel dédié.

Le premier problème se résout simplement, mais le second est plus délicat. Quand un programme est
compilé et lié, le compilateur et l’éditeur de liens ne savent pas où dans la mémoire physique le
programme sera chargé lors de son exécution. C’est pourquoi ils supposent en général une adresse
initiale de chargement correspondant à l’adresse 0 et y placent la première instruction. Supposons que
la première instruction aille chercher un mot mémoire situé à l’adresse 10 000. Supposons également
que le programme et ses données soient en fait chargés dans une plage d’adresses débutant à 50 000.
La première instruction se soldera par un échec, le mot réellement cherché se trouvant à l’adresse
60 000 et non 10 000. Pour résoudre ce problème, il faut soit reloger le programme au moment du
chargement, en modifiant toutes les adresses qu’il contient (faisable, mais coûteux), soit faire du
relogeage en ligne, pendant l’exécution.

La première solution est illustrée à la figure 1.1 (a). Nous y voyons un ordinateur équipé de deux
registres spéciaux, le registre de base et le registre limite. Notons au passage que nous suivons la
convention du langage C, qui considère qu’un nombre commençant par 0x est hexadécimal, et qu’un
nombre commençant par 0 est octal. Quand un programme s’exécute, le registre de base est mis à
jour avec l’adresse de démarrage du code du programme et le registre limite avec la taille combinée
du code et des données. Quand une instruction doit être extraite, le matériel vérifie que le compteur
ordinal est inférieur à la valeur du registre limite et, le cas échéant, l’ajoute au registre de base avant
d’envoyer la somme au système de mémoire. De même, quand le programme doit retrouver un mot
mémoire de données (par exemple à l’adresse 10 000), le matériel ajoute automatiquement le contenu
du registre de base à cette adresse avant la requête mémoire effective. Le registre de base rend
impossible une consultation de la mémoire à une adresse inférieure à sa propre valeur. En outre, le
registre limite rend impossible toute référence mémoire au-delà de sa propre valeur. Cette tactique
résout donc les deux problèmes (protection et relogeage) au prix de deux registres supplémentaires
et d’une légère augmentation du temps de cycle (pour effectuer la vérification par rapport à la limite
et l’addition).

La vérification et la translation ont pour effet de transformer une adresse générée par le programme,
appelée adresse virtuelle, en une adresse utilisée par le système de mémoire, appelée adresse
physique. Le matériel qui effectue la vérification et la translation s’appelle la MMU (unité de gestion
de la mémoire). Cette unité se trouve sur le processeur lui-même ou très près mais, logiquement, elle
est placée entre la CPU et la mémoire.

Une MMU plus sophistiquée est décrite à la figure 1.1(b). Nous y voyons deux paires de registres base
et limite, une pour le code et une pour les données. Le compteur d’instruction et toutes les autres
références au code utilisent la première paire, les références aux données utilisent la seconde.
Plusieurs utilisateurs peuvent alors partager la même copie de la mémoire du programme, ce qui
n’était pas possible avec la première approche. Quand le programme prog1 s’exécute, les quatre
registres sont positionnés comme indiqué par les flèches du côté gauche de la figure. Quand prog2
s’exécute, ils sont placés comme indiqué par les flèches du côté droit. La gestion de la MMU est une
tâche sensible qui relève du système d’exploitation car les utilisateurs ne sont pas suffisamment
fiables.

3
TD-TP : INF326-SE
Deux aspects du système de mémoire ont un impact important sur les performances. Premièrement,
les caches masquent la lenteur relative de la mémoire. Quand un programme s’exécute depuis un
certain temps, le cache est plein de lignes relatives à ce programme. Il s’exécute donc avec de bonnes
performances. Cependant, quand le système bascule sur un autre programme, le cache reste plein de
références datant du premier programme. Celles liées au second programme doivent donc être
chargées une à la fois dans le cache depuis la mémoire. Ce qui peut constituer un handicap sérieux à
de bonnes performances si une telle opération est renouvelée trop souvent.

Deuxièmement, lors du basculement d’un programme sur un autre, les registres MMU doivent être
modifiés. A la figure 1.1(b), seuls 4 registres doivent être mis à jour, ce qui n’est pas réellement un
problème, mais dans les véritables MMU le nombre de registres à recharger (explicitement ou
dynamiquement selon le cas) est bien plus important. En effet, cela prend du temps. En somme, le
basculement d’un programme sur un autre ou encore changement de contexte (context switch) est
une opération coûteuse.

Questions

1) Dans la figure 1.1, la MMU compare l’adresse (virtuelle) d’entrée au registre limite,
déclenchant un défaut si elle est trop grande. Une autre solution pouvait être d’ajouter
d’abord l’adresse d’entrée à la base, puis de comparer le résultat à l’adresse physique dans le
registre limite. Les deux méthodes sont-elles logiquement équivalentes ? Le sont-elles au
niveau des performances ?
2) Un ordinateur utilise le schéma de relogeage de la figure 1.1(a). Un programme de 10 000
octets est chargé à l’adresse 40 000. Quelles valeurs auront les registres de base et de limite
d’après la description de ce schéma ?

EXERCICE 2

2.1 En cours, nous avons étudié trois états d’un processus. Théoriquement, avec trois états, on pourrait
avoir six transitions, deux en sortie de chaque état. Cependant, on ne voit que quatre transitions.
Existe-t-il des circonstances dans lesquelles l’une ou l’autre des transitions manquantes pourraient se
produire ?

2.2 Supposons que vous deviez concevoir une architecture informatique avancée qui effectuerait la
commutation entre processus au niveau matériel au lieu d’employer les interruptions. De quelles
informations le processeur aurait-il besoin ? Décrivez comment cela pourrait fonctionner.

2.3 Sur tous les ordinateurs actuels, au moins une partie des handlers d’interruption est écrite en
langage d’assemblage. Pourquoi ?

2.4 Lorsqu’une interruption ou un appel système transfèrent le contrôle au système d’exploitation, on


utilise généralement une zone de pile du noyau distincte de la pile du processus interrompu.
Pourquoi ?

2.5 Qu’est-ce qu’une condition de concurrence (race condition) ?

2.6 Lorsque l’on développe un ordinateur, on commence généralement par le simuler au moyen d’un
programme exécutant une instruction à la fois. Même les multiprocesseurs sont simulés de cette façon

4
TD-TP : INF326-SE
strictement séquentielle. Est-il possible qu’une condition de concurrence se produise en l’absence
d’événements simultanés ?

2.7 La solution de l’attente active faisant appel à la variable turn (tour) fonctionne-t-elle lorsque les
deux processus s’exécutent sur un multiprocesseur en mémoire partagé, où deux processeurs
partagent une mémoire commune ?

2.8 La solution de Peterson au problème de l’exclusion mutuelle fonctionne-t-elle lorsque


l’ordonnancement des processus est préemptif ? Non préemptif ?

2.9 Prenons l’exemple d’un ordinateur dépourvu d’instruction TSL, mais incluant une instruction qui
lui permet d’échanger le contenu d’un registre et d’un mot de mémoire à l’occasion d’une action
unique et indivisible. Peut-on écrire une routine entrer_region comme celle relative à l’instruction TSL.

2.10 Résumez la manière dont un système d’exploitation capable de désactiver les interruptions peut
implémenter des sémaphores.

2.11 Montrer comment les sémaphores de décompte (qui peuvent détenir une valeur arbitraire)
peuvent être implémentés en utilisant uniquement des sémaphores binaires et des instructions
machine ordinaires.

2.12 Dans l’étude des primitives sleep et wakeup, nous avons décrit une situation dans laquelle
intervenaient un processus de priorité élevée, H, et un processus de priorité inférieure, B. Cette
situation conduisait H à entrer dans une boucle sans fin. Le même problème peut-il se produire avec
un ordonnancement selon l’algorithme de type tourniquet au lieu d’un ordonnancement par
priorités ? Donnez des arguments.

2.13 Avec les moniteurs, la synchronisation utilise des variables conditionnelles et deux opérations
spéciales, wait et signal. Une forme de synchronisation plus générale consisterait en une primitive
unique, waituntil, avec un paramètre booléen arbitraire comme prédicat. On pourrait ainsi dire que
waituntil x  0 ou y  z  n

La primitive signal ne serait plus nécessaire. S’il est évident que ce schéma est plus général que celui
de Hoare ou Brinch Hansen, personne ne l’utilise. Expliquez pourquoi. Indication : pensez à
l’implémentation.

2.14 Un fast food possède quatre types d’employés : (1) les preneurs d’ordres, qui enregistrent les
commandes des clients ; (2) les cuisiniers, qui préparent les repas ; (3) les conditionneurs, qui placent
les aliments dans des sachets ; et (4) les caissiers, qui remettent les sachets aux clients et encaissent
l’argent. Chacun des employés peut être considérés comme étant un processus séquentiel
communiquant. Quelle forme de communication interprocessus vont-ils utiliser ? Reliez ce modèle au
comportement des processus sous Unix.

2.15 Prenons l’exemple d’un système d’échange de messages au moyen de boîtes aux lettres. Lorsque
l’on envoie un message vers une boîte aux lettres pleine ou que l’on essaie d’en recevoir un depuis
une boîte de lettres vide, il n’y a pas de processus pour bloquer et un code d’erreur est retourné. Le
processus répond au code d’erreur en réessayant inlassablement jusqu’à ce que l’opération réussisse.
Un tel schéma conduit-il à des conditions de concurrence ?

5
TD-TP : INF326-SE
2.16 Les calculateurs CDC 6600 étaient capables de prendre en charge jusqu’à 10 processus
simultanément en exploitant une forme intéressante d’ordonnancement de type tourniquet appelée
partage du processeur. Un changement de processus avait lieu après chaque instruction, ce qui fait
que l’instruction 1 provenait du processus 1, l’instruction 2 du processus 2, et ainsi de suite. Le
changement de processus était assuré par un matériel spécial, et la surcharge était nulle. Si un
processus avait besoin de T secondes pour se terminer en l’absence de concurrence, combien de temps
était nécessaire en cas de partage du processeur par n processus ?

2.17 Généralement, les ordonnanceurs de type tourniquet maintiennent une liste de tous les
processus exécutables, chaque processus apparaissant exactement une fois dans la liste. Que se passe-
t-il si un processus revenait deux fois dans la liste ? Pouvez-vous évoquer une raison valable pour qu’il
en soit ainsi ?

2.18 Est-il possible d’évaluer si un processus est dépendant du processeur ou des E/S en analysant son
code source ? Comment peut-on procéder à une telle évaluation en cours d’exécution ?

2.19 Les mesures prélevées sur un système donné ont montré que la durée moyenne d’exécution d’un
processus était de T avant que ne se produise un blocage sur les E/S. Un changement de processus a
besoin d’un délai S que l’on peut considérer comme une perte de temps. Pour un algorithme
d’ordonnancement de type tourniquet avec un quantum Q, donnez une formule pour exprimer
l’efficacité du processeur pour chacun des cas suivants :

a. Q=8;
b. Q>T;
c. S<Q<T;
d. Q=S;
e. Q proche de 0.

2.20 Cinq jobs sont en attente d’exécution. Leurs délais d’exécution sont respectivement de 9, 6, 3, 5
et X minutes. Dans quel ordre faut-il les exécuter pour réduire le temps de réponse moyen ? Votre
réponse dépendra de X.

2.21 Cinq jobs de traitement par lots, de A à E, arrivent dans un centre informatique pratiquement au
même instant. Leurs délais d’exécution respectifs sont de 10, 6, 2, 4 et 8 minutes. Leurs priorités
respectives (déterminées extérieurement) sont de 3, 5, 2, 1 et 4 (5 étant la priorité la plus élevée).

Pour chacun des algorithmes d’ordonnancement suivants, déterminez le délai de rotation moyen des
processus. Ignorez la surcharge engendrée par les changements de processus.

a. Round-robin ;
b. Ordonnancement par priorités ;
c. Premier arrivé, premier servi (ordre : 10, 6, 2, 4, 8) ;
d. Job le plus court d’abord.

Pour (a), partez du principe que le système est multiprogrammé et que chaque job récupère une partie
équitable de temps processeur. Pour (b) à (d), supposez qu’un seul job est exécuté à la fois, jusqu’à ce
qu’il se termine. Tous les jobs sont entièrement dépendants du processeur.

6
TD-TP : INF326-SE
2.22 Un processus s’exécutant sur CTSS a besoin de 30 quanta pour s’achever. Combien de fois doit-il
être échangé, en comptant la toute première fois (avant sa première exécution) ?

2.23 L’algorithme de vieillissement (avec a = 1/2) est utilisé pour estimer des délais d’exécution. Les
quatre premières exécutions, de la plus ancienne à la plus récente, ont été de 40, 20, 40 et 15 ms.
Quelle va être l’estimation du prochain délai d’exécution ?

2.24 Un système temps réel avec tolérance a quatre événements périodiques, avec des périodes de
50, 100, 200 et 250 ms chacun. Supposons que les quatre événements aient besoin respectivement de
35, 20, 10 et x ms de temps processeur. Quelle est la valeur de x la plus importante pour laquelle il est
possible d’ordonnancer le système ?

2.25 Expliquez pourquoi on exploite souvent l’ordonnancement à deux niveaux.

2.26 Ecrire un script shell pour produire un fichier de nombres séquentiels qui lit le dernier nombre du
fichier, y ajoute 1, puis l’ajoute au fichier. Exécutez une instance du script à l’arrière-plan et une au
premier plan, chacune accédant au même fichier. Combien de temps faudra-t-il pour qu’une condition
de concurrence se manifeste ? Quelle est la section critique ? Modifier le script pour empêcher la
concurrence (indication : utiliser ln file file.lock pour verrouiller le fichier de données).

2.27 Nous sommes en présence d’un système d’exploitation qui prend en charge les sémaphores.
Implémenter un système de messages. Ecrire la procédure pour envoyer et recevoir les messages.

2.28 Réécrire le programme du schéma de l’alternance (pour l’exclusion mutuelle) afin de prendre en
charge plus de deux processus.

2.29 Des travaux de rénovation doivent être faits dans les douches des garçons d’une université. En
attendant, ceux-ci devront utiliser les douches des filles. Pour éviter tout problème, on décide que
lorsqu’une fille est dans les douches, une autre fille peut y entrer, mais pas un garçon, et vice versa.
Une glissière place sur la porte des douches indique ses trois « états » possibles :

- Vide ;
- Occupée par les filles ;
- Occupée par les garçons.

Utiliser votre langage de programmation favori pour développer les procédures suivantes :
fille_veut_entrer, garçon_veut_entrer, fille_quitte, garçon_quitte. Vous avez le choix des compteurs et
des techniques de synchronisation.

7
TD-TP : INF326-SE

Vous aimerez peut-être aussi