M1 Miage 2023-204 - Systèmes d'exploitation et programmation concurrente
Debriefing des interrogations de contrôle continu
Vous trouverez ci-dessous une synthèse des notions qui ont été sources de difficultés/malentendus dans les questions des examens de contrôle continu.
La synthèse est organisée par thème (plutôt que par examen ou question spécifique).
Emplacement des variables locales : dans la pile du thread qui effectue l'appel de fonction (et non pas dans le tas !)
Les shells sont des programmes utilisateurs.
Attention aux confusions entre super utilisateur (root) et mode superviseur.
Types de noyaux (monolithiques versus micro-noyaux):
- De quel type est le noyau Linux ?
- Même les noyaux monolithiques sont extensibles (possibilités d'ajouter dynamiquement de nouveaux modules au sein du système, par exemple de nouveaux pilotes de périphériques) mais les conséquences/permissions accordées à un modules ne sont pas les mêmes que dans le cas d'un micro-noyau.
- Revoir les différents composants qui font (ou non) partie du noyau dans le cas d'un système d'exploitation tel que Linux.
- De manière générale, une interaction avec un pérpihérique matériel nécessite un changement de mode (utilisateur --> superviseur, puis dans d'autre sens).
Mémoire virtuelle :
- De quel types sont les adresses de mémoire manipulées par du code applicatif ? addresses virtuelles ou physiques ?
- Isolation entre processus : par défaut, deux processus sont complètement isolés (espaces de mémoire complètement distincts et protégés l'un de l'autre). Cependant, afin d'optimiser la gestion de la mémoire physique, le noyau peut éventuellement partager certains emplacements de mémoire physique qui sont identiques pour plusieurs processus (par exemple des morceaux de code de bibliothèques).
- Où se trouvent le code et les données du noyau ? Sont-ils accessibles dans chaque espace de mémoire virtuelle ?
- Pour des raisons de sécurité, le code utilisateur ne doit avoir aucun accès à la mémoire du noyau (même en lecture).
Ordonnancement :
Attention aux ordres de grandeur pour la durée typique d'un intervalle de temps ("quantum de temps") CPU alloué à une tâche. Plus généralement, attention aux échelles de temps des différentes sources de mesure du temps dans un ordinateur (horloge interne du CPU, timer).
Un changement de contexte nécessite nécessite du temps car il faut sauvegarder (en mémoire) tous les registres (CPU) du flot d'exécution "sortant" et rétablir ceux du flot "entrant". Cependant, il n'est pas nécessaire de sauvegarder (ailleurs en mémoire physique ou bien sur le disque) le contenu de l'ensemble de la mémoire virtuelle d'un flot "sortant" lors de chaque changement de contexte (celui-ci reste simplement au même endroit en mémoire physique, tant qu'il reste de la place en mémoire) - sinon cela serait extrêmement long.
La terminaison d'un processus (ou d'un thread de type noyau) nécessite l'intervention du noyau (pour attribuer à une autre tâche le CPU qui vient d'être libéré).
Threads Java :
- Un appel à la méthode join (sur une instance d'objet de la classe Thread) n'est pas toujours bloquant (si le thread à attendre s'est déjà terminé).
- Attention aux confusions concernant le rôle de la méthode run (de la classe Thread) - déjà expliqué plusieurs fois en TP.
- Revoir où sont définies les méthodes wait, notify et notifyAll.
- Revoir et bien comprendre les différentes étapes qui ont lieu au sein d'un appel à la méthode wait.
- Revoir et bien comprendre dans quelle(s) situation(s) le verrou synchronized est libéré ou non.
- Revoir et bien comprendre le lien entre la notion de verrou et de variable de condition.
- Revoir la définition de "reveil intempestif" ("spurious wake-up" en anglais).
- Dans l'environnement de TP (PC Linux), quel est le lien entre les threads utilisés par la machine virtuelle Java et les threads gérés par le système d'exploitation sous-jacent (Linux) ?
Certaines personnes ne maîtrisent toujours pas la notion de Classpath en Java (le concept et/ou l'utilisation pratique). Reportez vous à la documentation fournie en début de semestre.
Bien réviser les définitions concernant les différents modèles de threads. Et notamment dans quel cas un thread T1 peut (ou non) préempter un autre thread T2 (étant dans le même processus ou dans un autre processus).