<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Terminale/Processus et système</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Approfondissement de la gestion des processus par<br/>
un système d'exploitation : notion de processus,<br/>
états, ordonnancement, communication entre<br/>
processus, synchronisation par verrous, risque<br/>
d'interblocage et notion de signal.</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q01 : Notion de processus</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce qu'un <strong>processus</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Il faut bien distinguer la notion de<br/>
<strong>programme</strong> (un fichier exécutable<br/>
sur le disque) et celle de <strong>processus</strong><br/>
(une instance dynamique de ce programme<br/>
en cours d'exécution). Sous Linux, les<br/>
commandes <code>ps</code> ou <code>top</code> permettent<br/>
d'observer les processus actifs ; sous<br/>
Windows, on utilise le Gestionnaire des<br/>
tâches.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le fichier exécutable rangé sur le disque, tel qu'il existe avant son lancement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette description correspond plutôt<br/>
à un <strong>programme</strong> au sens du<br/>
fichier exécutable. Un processus<br/>
est, lui, dynamique : il représente<br/>
un programme <strong>en cours d'exécution</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un programme en cours d'exécution, avec sa mémoire et son contexte propres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est une abstraction centrale du<br/>
système d'exploitation. Un même<br/>
programme lancé deux fois donne<br/>
deux processus indépendants, qui<br/>
disposent chacun de leur propre<br/>
mémoire et de leur propre contexte<br/>
d'exécution.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une zone particulière de la mémoire vive réservée par le noyau</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un processus utilise de la mémoire<br/>
(sa zone de mémoire), mais il<br/>
n'est pas lui-même un type de<br/>
mémoire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une fonction particulière définie à l'intérieur d'un programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une fonction n'est qu'un fragment<br/>
de code à l'intérieur d'un<br/>
programme. Un processus est une<br/>
notion bien plus large, qui<br/>
englobe l'intégralité d'un<br/>
programme en exécution.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q02 : Fil d'exécution</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce qu'un <strong>fil d'exécution</strong><br/>
(parfois appelé <em>thread</em>) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une comparaison utile : un processus<br/>
est comparable à une maison<br/>
indépendante (sa mémoire est isolée),<br/>
tandis qu'un fil d'exécution est<br/>
comparable à une pièce dans cette<br/>
maison (la mémoire reste partagée<br/>
avec les autres pièces).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un processus secondaire disposant de sa propre mémoire isolée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur fréquente : c'est plutôt la<br/>
définition d'un processus. Les fils<br/>
d'un même processus <strong>partagent</strong> la<br/>
mémoire, ils ne sont pas isolés les<br/>
uns des autres.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une unité d'exécution légère interne à un processus, partageant sa mémoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Plusieurs fils d'exécution dans un<br/>
même processus permettent de<br/>
paralléliser des tâches tout en<br/>
partageant les données. Cette<br/>
approche est plus légère que de<br/>
créer plusieurs processus, mais<br/>
plus délicate à gérer en raison<br/>
des problèmes de synchronisation.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une copie complète du programme, exécutée en parallèle sur un autre cœur du processeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un fil n'est pas une copie du<br/>
programme. Plusieurs fils partagent<br/>
le même code et les mêmes données ;<br/>
ils peuvent tourner sur des cœurs<br/>
différents sans dupliquer le<br/>
programme.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une fonction lancée automatiquement au démarrage du programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un fil n'est pas une fonction. C'est<br/>
une unité d'exécution qui peut<br/>
parcourir plusieurs fonctions, et on<br/>
le lance explicitement : il ne<br/>
démarre pas tout seul.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q03 : Identifiant de processus</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que désigne le <strong>PID</strong> d'un processus ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Sur les systèmes Unix, la commande<br/>
<code>ps</code> affiche les PID en cours.<br/>
<code>kill &lt;PID&gt;</code> envoie le signal<br/>
<code>TERM</code> par défaut, et<br/>
<code>kill -9 &lt;PID&gt;</code> envoie le signal<br/>
<code>KILL</code>, qui est plus brutal et ne<br/>
peut pas être ignoré par le<br/>
processus visé.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un module interne du noyau spécialement chargé de créer et de gérer les processus</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette interprétation est<br/>
fantaisiste. Le sigle PID désigne<br/>
simplement un identifiant<br/>
numérique unique attribué par le<br/>
système.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un numéro unique attribué par le système à chaque processus pour l'identifier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le PID, pour <em>Process IDentifier</em>,<br/>
permet d'identifier les processus<br/>
de manière unique. On l'utilise<br/>
par exemple avec la commande<br/>
<code>kill &lt;PID&gt;</code>. Sur les systèmes<br/>
Unix, le numéro $1$ est<br/>
traditionnellement attribué au<br/>
processus de démarrage.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le descripteur des permissions et des droits d'accès d'un processus</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les permissions et le PID sont des<br/>
notions distinctes. Le PID<br/>
identifie un processus ; les<br/>
permissions définissent ce que ce<br/>
processus peut faire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un nom de domaine personnel réservé sur Internet</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucun rapport avec les domaines<br/>
Internet. Le PID est un numéro<br/>
interne au système d'exploitation.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q04 : États d'un processus</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quels sont les <strong>états principaux</strong> par<br/>
lesquels passe un processus au cours de<br/>
sa vie ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Sous Linux, la commande <code>ps -aux</code><br/>
affiche l'état de chaque processus :<br/>
<code>R</code> pour <em>running</em> (en exécution),<br/>
<code>S</code> pour <em>sleeping</em> (en sommeil),<br/>
<code>D</code> pour <em>disk wait</em> (en attente<br/>
d'entrée-sortie disque), <code>Z</code> pour<br/>
zombie.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Démarré, en exécution et terminé, sans état d'attente intermédiaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ces états ne suffisent pas à<br/>
décrire le cycle de vie d'un<br/>
processus : il manque l'état<br/>
<strong>bloqué</strong>, où le processus attend<br/>
une ressource ou une entrée-sortie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Compilé, chargé en mémoire, puis exécuté par le processeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce sont les étapes de fabrication<br/>
et de chargement d'un programme,<br/>
pas les états d'ordonnancement d'un<br/>
processus en cours de vie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Prêt, en exécution, bloqué en attente d'une ressource, puis terminé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est le modèle classique en<br/>
système d'exploitation.<br/>
L'ordonnanceur gère les<br/>
transitions entre l'état « prêt »<br/>
et l'état « en exécution ».<br/>
L'état « bloqué » correspond à<br/>
l'attente d'une ressource (un<br/>
fichier, le réseau, un verrou).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Ouvert, modifié, puis enregistré et fermé par l'utilisateur du logiciel</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce sont les états d'un <strong>fichier</strong><br/>
que l'on édite, pas ceux d'un<br/>
processus géré par l'ordonnanceur.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q05 : Ordonnanceur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel composant choisit <strong>quel processus</strong><br/>
reçoit le processeur à chaque instant ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Plusieurs stratégies d'ordonnancement<br/>
existent : le tour de rôle, la<br/>
priorité statique ou dynamique, ou<br/>
encore l'ordonnancement fondé sur la<br/>
latence. Pour les systèmes<br/>
d'exploitation à contraintes temps<br/>
réel, il faut des garanties strictes<br/>
sur les délais d'exécution.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'interpréteur de commandes, qui lance les programmes depuis le terminal</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'interpréteur de commandes sert<br/>
à lancer des programmes, mais ce<br/>
n'est pas lui qui décide à quel<br/>
moment chaque processus reçoit le<br/>
processeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le pilote du processeur, qui dialogue avec le matériel</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un pilote est un module qui<br/>
permet au système de communiquer<br/>
avec un périphérique matériel<br/>
(carte réseau, imprimante, etc.).<br/>
Ce n'est pas son rôle de choisir<br/>
quel processus s'exécute.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'utilisateur, qui fixe l'ordre d'exécution à chaque instant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'utilisateur peut influencer<br/>
indirectement l'ordonnancement<br/>
(en modifiant la priorité d'un<br/>
processus, par exemple), mais il<br/>
ne décide pas à chaque instant<br/>
quel processus reçoit le<br/>
processeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>L'ordonnanceur, un composant du noyau du système</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'ordonnanceur décide selon<br/>
plusieurs critères : la priorité<br/>
du processus, l'équité globale<br/>
entre les processus, la latence<br/>
attendue. Sous Linux,<br/>
l'ordonnanceur en place s'appelle<br/>
<em>Completely Fair Scheduler</em>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q06 : Parallélisme et concurrence</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la différence entre<br/>
<strong>parallélisme</strong> et <strong>concurrence</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Aujourd'hui, les processeurs<br/>
multi-cœurs offrent un véritable<br/>
parallélisme. En Python, le module<br/>
<code>multiprocessing</code> permet du<br/>
parallélisme effectif, alors que le<br/>
module <code>threading</code> n'offre que de<br/>
la concurrence dans l'implémentation<br/>
de référence du langage.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La concurrence alterne des tâches sur un cœur ; le parallélisme les exécute sur plusieurs cœurs à la fois</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Avec un seul cœur, on peut être<br/>
en concurrence (les tâches<br/>
alternent), mais pas en<br/>
parallélisme. Plusieurs cœurs<br/>
permettent un véritable<br/>
parallélisme.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les deux termes sont synonymes : ils désignent l'exécution simultanée de plusieurs tâches</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La distinction est au contraire<br/>
essentielle : la concurrence peut<br/>
exister sur un seul cœur (par<br/>
alternance), alors que le<br/>
parallélisme exige plusieurs cœurs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La concurrence concerne les processus alors que le parallélisme concerne uniquement les fils d'exécution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La distinction ne porte pas sur<br/>
processus contre fils : les deux<br/>
notions s'appliquent aussi bien aux<br/>
uns qu'aux autres. Elle porte sur<br/>
l'alternance contre la simultanéité<br/>
réelle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le parallélisme accélère toujours un programme, contrairement à la concurrence</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est trop<br/>
simpliste. Le parallélisme peut<br/>
accélérer un calcul, mais il<br/>
introduit un coût de<br/>
synchronisation et n'est pas<br/>
toujours bénéfique.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q07 : Mémoire partagée entre fils d'exécution</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi les fils d'exécution d'un même<br/>
processus <strong>partagent-ils</strong> leur mémoire ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est un compromis classique entre<br/>
performance et sécurité. Les fils<br/>
d'exécution communiquent rapidement,<br/>
mais leur partage de mémoire est<br/>
risqué. Les processus, à l'inverse,<br/>
sont fortement isolés, mais leur<br/>
communication est plus coûteuse.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Pour échanger rapidement des données via des variables communes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est l'avantage majeur des fils<br/>
d'exécution par rapport aux<br/>
processus. Cette communication<br/>
rapide est cependant source de<br/>
bugs subtils si l'on ne<br/>
synchronise pas correctement les<br/>
accès aux variables partagées.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour économiser des cœurs de processeur lors des calculs longs et intensifs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le partage de la mémoire ne<br/>
permet pas d'économiser des<br/>
cœurs. Son intérêt principal<br/>
tient à la rapidité de la<br/>
communication entre fils<br/>
d'exécution.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que le noyau interdit aux fils d'avoir une mémoire séparée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce n'est pas une interdiction du<br/>
noyau : le partage est un choix de<br/>
conception qui rend les fils légers<br/>
et rapides à faire communiquer.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour chiffrer automatiquement les données échangées entre eux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le partage de mémoire n'a aucun<br/>
rapport avec le chiffrement. Il<br/>
vise la rapidité de communication,<br/>
pas la protection des données.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q08 : Signal</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce qu'un <strong>signal</strong> sous Unix ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La commande <code>kill -&lt;signal&gt; &lt;PID&gt;</code><br/>
envoie un signal donné au processus<br/>
désigné. Par défaut, c'est<br/>
<code>SIGTERM</code> (numéro $15$) qui est<br/>
envoyé. Le signal <code>SIGKILL</code><br/>
(numéro $9$) est plus brutal : le<br/>
processus ne peut pas le bloquer ni<br/>
le retarder.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une notification asynchrone envoyée à un processus pour lui demander une action</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Quelques signaux courants :<br/>
<code>SIGTERM</code> (demande polie de<br/>
terminaison), <code>SIGKILL</code><br/>
(terminaison brutale, qui ne<br/>
peut pas être ignorée), <code>SIGINT</code><br/>
(interruption clavier, par<br/>
exemple Ctrl+C), <code>SIGHUP</code><br/>
(rechargement de la<br/>
configuration).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une instruction particulière appartenant au jeu d'instructions câblé du processeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les signaux sont une notion du<br/>
système d'exploitation, et non<br/>
du jeu d'instructions du<br/>
processeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un message texte échangé entre deux machines sur le réseau</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les signaux n'ont aucun rapport<br/>
avec les protocoles réseau ; ils<br/>
sont locaux à un système<br/>
d'exploitation.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une variable globale partagée entre tous les processus</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un signal n'est pas une donnée<br/>
partagée mais une notification : le<br/>
noyau interrompt le processus visé<br/>
pour lui transmettre une demande.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q09 : Lister les processus</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle commande Unix affiche la <strong>liste des processus</strong> en cours d'exécution ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Sous Windows, on peut utiliser le<br/>
Gestionnaire des tâches<br/>
(<code>taskmgr.exe</code>) ou la commande<br/>
PowerShell <code>Get-Process</code>. Quel<br/>
que soit le système d'exploitation,<br/>
la liste des processus est<br/>
maintenue par le noyau.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>ps</code>, ou <code>top</code> pour un suivi en temps réel</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>On utilise par exemple <code>ps aux</code><br/>
ou <code>ps -ef</code> pour obtenir la<br/>
liste complète des processus.<br/>
Pour un suivi interactif et<br/>
dynamique, on emploie plutôt<br/>
<code>top</code> ou <code>htop</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>ls</code>, qui liste le contenu d'un répertoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La commande <code>ls</code> sert à lister<br/>
le contenu d'un répertoire,<br/>
c'est-à-dire les fichiers, pas<br/>
les processus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>cat</code>, qui affiche le contenu d'un fichier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La commande <code>cat</code> sert à<br/>
afficher le contenu d'un<br/>
fichier, et n'a aucun rapport<br/>
avec la liste des processus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>grep</code>, qui recherche un motif dans un texte</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La commande <code>grep</code> sert à<br/>
rechercher un motif dans un<br/>
texte, mais pas à lister les<br/>
processus en cours.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q10 : Démon</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'appelle-t-on un <strong>démon</strong> sur un<br/>
système d'exploitation ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Sous Linux moderne, <code>systemd</code> est<br/>
le processus de démarrage (PID 1)<br/>
et gère tous les autres démons.<br/>
Sous macOS, ce rôle revient à<br/>
<code>launchd</code>. Sous Windows, on parle<br/>
de « services Windows ».</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une commande Unix lancée manuellement par l'utilisateur depuis le terminal</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un démon n'est pas une commande<br/>
mais un processus qui s'exécute<br/>
en arrière-plan, généralement<br/>
sans intervention de<br/>
l'utilisateur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un programme malveillant qui se cache dans le système</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le mot « démon » est ici un<br/>
terme technique sans connotation<br/>
négative. Il désigne un<br/>
processus particulier, et non<br/>
un logiciel malveillant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un processus d'arrière-plan, sans interface, qui rend un service au système</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les noms des démons se<br/>
terminent souvent par la lettre<br/>
« d » : <code>httpd</code>, <code>sshd</code>,<br/>
<code>cron</code>, <code>systemd</code>. Ils sont<br/>
visibles avec la commande <code>ps</code>,<br/>
mais aucun terminal ne leur est<br/>
associé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un fichier de configuration caché à la racine du système</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un démon est un processus, pas<br/>
un fichier. Le mot « caché »<br/>
renvoie ici à l'absence<br/>
d'interface utilisateur, pas à<br/>
un fichier sur le disque.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q11 : Course critique</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'appelle-t-on une <strong>course critique</strong><br/>
(parfois nommée <em>race condition</em>) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La solution consiste à mettre en<br/>
place une <strong>synchronisation</strong> des<br/>
accès, par exemple à l'aide de<br/>
verrous, de sémaphores, ou de<br/>
transactions atomiques. Une<br/>
alternative consiste à éviter<br/>
toute donnée partagée, par exemple<br/>
en utilisant un échange par files<br/>
de messages.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une optimisation appliquée par le compilateur au moment de la traduction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une course critique est un<br/>
défaut de programmation, pas<br/>
une optimisation. Elle survient<br/>
à l'exécution, pas à la<br/>
compilation.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un mécanisme de synchronisation chargé de protéger les données partagées entre fils</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est l'inverse : une course<br/>
critique est le <strong>problème</strong> que<br/>
la synchronisation (verrous,<br/>
sémaphores) cherche justement à<br/>
éviter.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un bug où l'ordre d'exécution de plusieurs fils rend le résultat imprévisible</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Exemple typique : deux fils<br/>
d'exécution incrémentent<br/>
simultanément la même variable.<br/>
Selon l'entrelacement des<br/>
opérations, le résultat varie.<br/>
Ces bugs sont particulièrement<br/>
difficiles à diagnostiquer car<br/>
ils sont souvent intermittents.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une erreur qui ne concerne que les programmes à un seul fil d'exécution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est précisément l'inverse : une<br/>
course critique suppose plusieurs<br/>
fils accédant en même temps à des<br/>
données partagées. Un programme<br/>
à un seul fil n'en produit pas.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q12 : Verrou d'exclusion mutuelle</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>À quoi sert un <strong>verrou d'exclusion mutuelle</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Plusieurs variantes existent : les<br/>
sémaphores (qui généralisent le<br/>
verrou avec un compteur), les<br/>
verrous lecture-écriture (plusieurs<br/>
lecteurs simultanés autorisés, mais<br/>
un seul écrivain à la fois), et<br/>
les moniteurs (par exemple en<br/>
Java).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À stocker les données partagées entre plusieurs fils d'exécution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un verrou ne stocke pas de<br/>
données, il contrôle l'accès à<br/>
des données stockées par<br/>
ailleurs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À ralentir volontairement le programme pour économiser le processeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un verrou peut effectivement<br/>
ralentir le programme, mais ce<br/>
n'est pas son objectif. Son<br/>
rôle premier est de garantir la<br/>
cohérence des données<br/>
partagées.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>À chiffrer les données partagées pour les protéger d'une lecture extérieure</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le chiffrement relève de la<br/>
cryptographie, pas de la<br/>
synchronisation des fils<br/>
d'exécution.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>À garantir qu'un seul fil à la fois accède à une ressource partagée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le motif classique est le<br/>
suivant : on acquiert le verrou,<br/>
on effectue les opérations<br/>
critiques, puis on libère le<br/>
verrou. En Python, la syntaxe<br/>
<code>with verrou:</code> garantit la<br/>
libération même en cas<br/>
d'exception, ce qui est plus<br/>
sûr.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q13 : Interblocage</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'appelle-t-on un <strong>interblocage</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Plusieurs stratégies de prévention<br/>
existent : ordonner systématiquement<br/>
les acquisitions de ressources<br/>
(toujours $A$ puis $B$),<br/>
utiliser des délais d'attente<br/>
(<em>timeouts</em>), détecter les<br/>
interblocages a posteriori (par<br/>
analyse des graphes d'attente), ou<br/>
les éviter avec des algorithmes<br/>
dédiés comme l'algorithme du<br/>
banquier de Dijkstra.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un arrêt brutal et immédiat de l'ensemble du programme, déclenché par le noyau</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un interblocage n'est pas un<br/>
arrêt brutal : les processus<br/>
impliqués restent actifs, mais<br/>
ils sont bloqués en attente<br/>
mutuelle. Aucun ne s'arrête de<br/>
lui-même.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un signal d'erreur particulier émis automatiquement par le système</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'interblocage n'émet pas de<br/>
signal particulier. Au<br/>
contraire, il se manifeste par<br/>
un blocage silencieux que le<br/>
programmeur doit détecter<br/>
lui-même.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un gel de l'affichage de l'écran le temps d'un calcul lourd</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le mot peut faire penser à un<br/>
gel de l'affichage, mais le<br/>
sens technique en informatique<br/>
est tout autre. Il s'agit d'un<br/>
blocage logique entre<br/>
processus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une situation où plusieurs processus s'attendent mutuellement sans fin</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Exemple : le fil $T_1$ détient<br/>
la ressource $A$ et attend $B$.<br/>
Le fil $T_2$ détient $B$ et<br/>
attend $A$. Aucun ne peut<br/>
progresser. Quatre conditions,<br/>
dites de Coffman, doivent être<br/>
réunies simultanément pour<br/>
qu'un interblocage se produise.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q14 : Communication entre processus</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment deux processus <strong>isolés</strong><br/>
peuvent-ils communiquer entre eux ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le choix du mécanisme dépend du<br/>
besoin : un tube convient pour un<br/>
simple flux ; une connexion<br/>
réseau, pour communiquer à<br/>
distance ; la mémoire partagée,<br/>
pour la performance ; une file de<br/>
messages, pour découpler le<br/>
producteur du consommateur.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Uniquement par des saisies successives au clavier de l'utilisateur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le clavier permet à un<br/>
utilisateur d'interagir avec<br/>
un programme, mais ce n'est<br/>
pas un mécanisme de<br/>
communication entre processus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Uniquement via Internet, en passant par un serveur distant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Internet permet bien la<br/>
communication entre processus<br/>
distants, mais ce n'est pas le<br/>
seul mécanisme. De nombreux<br/>
processus communiquent<br/>
localement, sans passer par<br/>
Internet.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Par des tubes, des sockets, des fichiers partagés ou des files de messages</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Tous ces mécanismes sont<br/>
fournis par le système<br/>
d'exploitation. Le tube Unix,<br/>
symbolisé par la barre<br/>
verticale <code>|</code> dans<br/>
l'interpréteur de commandes,<br/>
est l'un des plus simples<br/>
d'usage. Les sockets servent<br/>
aux communications réseau, et<br/>
la mémoire partagée privilégie<br/>
la performance.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>C'est impossible : deux processus isolés ne peuvent jamais communiquer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Plusieurs mécanismes<br/>
permettent au contraire à des<br/>
processus isolés de<br/>
communiquer (tubes, sockets,<br/>
fichiers, files de messages).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q15 : Création d'un processus</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Sur les systèmes Unix, l'appel système<br/>
<code>fork</code> permet de :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le motif classique sous Unix est<br/>
l'enchaînement <code>fork</code> puis <code>exec</code> :<br/>
on duplique le processus, puis on<br/>
remplace l'image mémoire de<br/>
l'enfant par un autre programme.<br/>
Le parent peut ensuite continuer<br/>
en parallèle ou attendre la fin<br/>
de l'enfant avec un appel à<br/>
<code>wait</code>.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Remplacer le programme courant par un nouveau programme à exécuter</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette opération correspond à<br/>
l'appel système <code>exec</code>, qui<br/>
est souvent combiné avec<br/>
<code>fork</code> pour lancer un nouveau<br/>
programme dans un nouveau<br/>
processus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Arrêter immédiatement le processus appelant et libérer sa mémoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La terminaison d'un processus<br/>
se fait avec un appel système<br/>
comme <code>exit</code>, et non avec<br/>
<code>fork</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Dupliquer le processus appelant en un parent et un enfant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Après l'appel à <code>fork</code>, on<br/>
distingue le parent et l'enfant<br/>
par la valeur renvoyée : la<br/>
fonction renvoie $0$ dans le<br/>
processus enfant, et le<br/>
numéro de l'enfant dans le<br/>
processus parent. Ce mécanisme<br/>
est fondamental sous Unix.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Créer un nouveau fichier vide sur le disque pour le processus</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La création d'un fichier<br/>
relève d'autres appels<br/>
système, comme <code>open</code> avec<br/>
l'option de création. L'appel<br/>
<code>fork</code> concerne les processus,<br/>
pas les fichiers.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q16 : Processus zombie</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'appelle-t-on un <strong>processus zombie</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour éviter l'apparition de<br/>
processus zombies, le parent doit<br/>
appeler <code>wait</code> ou <code>waitpid</code> après<br/>
la création d'un processus<br/>
enfant. Sans cela, le processus<br/>
enfant reste dans l'état zombie<br/>
jusqu'à ce que le parent le<br/>
récupère explicitement.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un processus terminé dont le parent n'a pas encore lu le code de retour</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cet état apparaît avec la<br/>
lettre <code>Z</code> dans la commande<br/>
<code>ps</code>. Il est normalement<br/>
éphémère. Une accumulation de<br/>
processus zombies traduit<br/>
souvent un bug : le parent ne<br/>
récupère pas le statut de ses<br/>
enfants. Si le parent meurt,<br/>
le processus de démarrage<br/>
(PID 1) « adopte » les<br/>
processus orphelins.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un processus dangereux qui menace la stabilité du système</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le mot « zombie » est ici un<br/>
terme technique sans<br/>
connotation négative. Il<br/>
désigne un état particulier<br/>
dans le cycle de vie d'un<br/>
processus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un signal système particulier envoyé à un processus mourant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le zombie n'est pas un signal<br/>
mais un état d'un processus :<br/>
celui d'un processus terminé en<br/>
attente de récupération.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un processus bloqué dans une boucle infinie qui sature en continu le processeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une boucle infinie correspond<br/>
à un processus qui consomme du<br/>
temps processeur sans<br/>
terminer. Le zombie est un<br/>
processus déjà terminé, dont<br/>
il reste seulement l'entrée<br/>
dans la table des processus.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q18 : Priorité d'un processus</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi un système d'exploitation<br/>
attribue-t-il des <strong>priorités</strong><br/>
différentes aux processus ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les systèmes d'exploitation à<br/>
contraintes temps réel offrent<br/>
des garanties strictes sur la<br/>
priorité. Les systèmes<br/>
généralistes adoptent une<br/>
politique « au mieux », tout en<br/>
cherchant à maintenir une équité<br/>
globale entre les processus.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Pour donner plus de temps processeur aux processus les plus importants</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une priorité élevée signifie<br/>
plus de temps processeur<br/>
alloué. Sous Linux, la<br/>
commande <code>nice</code> permet de<br/>
régler cette priorité (de<br/>
$-20$ à $19$ ; un nombre plus<br/>
grand signifie un processus<br/>
plus « gentil », c'est-à-dire<br/>
moins prioritaire).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour renforcer la sécurité en isolant les processus les uns des autres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La sécurité est gérée par les<br/>
permissions et les<br/>
mécanismes d'isolation, pas<br/>
par les priorités, qui<br/>
concernent l'allocation du<br/>
temps processeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour réserver une quantité de mémoire vive fixe à chaque processus</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La priorité ne fixe pas la<br/>
mémoire allouée : elle agit sur<br/>
le partage du temps processeur,<br/>
pas sur celui de la mémoire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour respecter l'ordre exact dans lequel les programmes ont été lancés</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'ordre de lancement ne<br/>
détermine pas la priorité : un<br/>
processus lancé tardivement peut<br/>
être plus prioritaire qu'un<br/>
autre lancé avant lui.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q19 : Lister les processus sous Windows</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment afficher les processus actifs<br/>
sur <strong>Windows</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Sur tous les systèmes<br/>
d'exploitation modernes, on peut<br/>
observer les processus, mesurer<br/>
leur consommation de ressources<br/>
et les terminer. Les outils<br/>
diffèrent, mais les fonctions<br/>
proposées sont équivalentes.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Avec le Gestionnaire des tâches, ou la commande PowerShell <code>Get-Process</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le Gestionnaire des tâches<br/>
(raccourci Ctrl + Maj + Échap)<br/>
offre une interface graphique<br/>
riche. En ligne de commande,<br/>
on dispose de <code>tasklist</code><br/>
(commande historique) ou de<br/>
<code>Get-Process</code> dans<br/>
PowerShell.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec la commande <code>ps</code>, comme sur les systèmes Unix</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La commande <code>ps</code> est propre<br/>
aux systèmes Unix. Elle n'est<br/>
pas disponible nativement<br/>
sous Windows.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>C'est impossible : Windows masque ses processus à l'utilisateur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Plusieurs outils permettent<br/>
au contraire d'observer les<br/>
processus (Gestionnaire des<br/>
tâches, <code>tasklist</code>,<br/>
<code>Get-Process</code>).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>En redémarrant complètement Windows pour afficher la liste au prochain démarrage</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Redémarrer le système ne permet<br/>
pas d'observer les processus en<br/>
cours : il faut au contraire un<br/>
outil de supervision sur un<br/>
système en fonctionnement.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q21 : Conditions nécessaires à un interblocage</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelles sont les <strong>quatre conditions nécessaires</strong> pour qu'un interblocage<br/>
puisse se produire (selon Coffman,<br/>
$1971$) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette théorie classique permet<br/>
d'analyser tout système<br/>
concurrent et constitue un<br/>
contenu classique des cours sur<br/>
les systèmes d'exploitation.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La mémoire, le processeur, le disque et le réseau</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ces éléments sont des types<br/>
de ressources, mais ils ne<br/>
constituent pas les<br/>
conditions de Coffman, qui<br/>
décrivent une situation<br/>
d'attente entre processus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La compilation, l'édition de liens, puis le chargement en mémoire et l'exécution finale du programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce sont les étapes de<br/>
fabrication d'un programme,<br/>
sans rapport avec les<br/>
conditions d'apparition d'un<br/>
interblocage entre processus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>L'exclusion mutuelle, la détention et l'attente, la non-préemption et l'attente circulaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Casser une seule de ces<br/>
conditions suffit à éliminer<br/>
le risque d'interblocage.<br/>
Plusieurs stratégies sont<br/>
possibles : autoriser la<br/>
préemption (ce qui casse la<br/>
troisième condition), ou<br/>
ordonner globalement<br/>
l'acquisition des ressources<br/>
(ce qui casse la quatrième).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La priorité, l'équité, la latence et le quantum de temps</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce sont des critères<br/>
d'ordonnancement, et non les<br/>
conditions de Coffman qui<br/>
caractérisent une situation<br/>
d'interblocage.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q25 : Synthèse</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi les affirmations suivantes sur<br/>
les processus et les fils d'exécution,<br/>
laquelle est <strong>fausse</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le programmeur reste<br/>
responsable de la correction de<br/>
son code concurrent. Le système<br/>
d'exploitation fournit les<br/>
outils, mais c'est à<br/>
l'application d'en faire un<br/>
usage rigoureux pour garantir la<br/>
cohérence des données<br/>
partagées.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Plusieurs fils d'exécution d'un même processus partagent la mémoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
correcte. C'est même la<br/>
caractéristique majeure des<br/>
fils d'exécution.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un interblocage requiert la conjonction simultanée des quatre conditions de Coffman</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
correcte. Casser l'une de<br/>
ces quatre conditions suffit<br/>
à éviter l'interblocage.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une course critique est résolue automatiquement par le système d'exploitation</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est fausse<br/>
(donc c'est la bonne<br/>
réponse). Le système<br/>
d'exploitation ne résout pas<br/>
les courses critiques. Il<br/>
revient au programmeur<br/>
d'utiliser des mécanismes de<br/>
synchronisation appropriés<br/>
(verrous, sémaphores, files<br/>
synchronisées) pour les<br/>
éviter.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un processus dispose de sa propre mémoire isolée des autres processus</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
correcte. L'isolation de la<br/>
mémoire est précisément ce<br/>
qui distingue les processus<br/>
des fils d'exécution.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q26 : Appel système</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'appelle-t-on un <strong>appel système</strong><br/>
(<em>system call</em>) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Sous Linux, on peut observer les<br/>
appels système d'un programme avec<br/>
<code>strace</code>. Les appels système sont<br/>
coûteux car ils provoquent un<br/>
changement de contexte. Les<br/>
bibliothèques standard les<br/>
regroupent souvent (par exemple,<br/>
bufferisation des écritures) pour<br/>
réduire leur nombre.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une fonction interne au programme utilisateur, exécutée sans quitter son espace</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un appel système n'est<br/>
pas une fonction interne au<br/>
programme. C'est précisément un<br/>
mécanisme par lequel le programme<br/>
sort de son espace propre pour<br/>
demander un service au noyau.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un appel téléphonique automatisé passé par le système d'exploitation</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce terme n'a aucun<br/>
rapport avec la téléphonie. Il<br/>
désigne un mécanisme interne du<br/>
système d'exploitation.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un protocole de communication réseau entre deux machines distantes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un appel système est<br/>
local au système d'exploitation<br/>
d'une machine. La communication<br/>
réseau peut <strong>passer par</strong> des<br/>
appels système (par exemple<br/>
<code>socket</code>), mais elle n'est pas<br/>
elle-même un appel système.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une demande de service adressée par un programme au noyau du système</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les appels<br/>
système sont l'interface entre le<br/>
mode utilisateur (où s'exécutent<br/>
les programmes ordinaires) et le<br/>
mode noyau (où s'exécutent les<br/>
opérations privilégiées). Un<br/>
appel système provoque un<br/>
changement de contexte vers le<br/>
noyau, qui exécute la requête<br/>
puis rend la main au programme.<br/>
Exemples : <code>open</code>, <code>read</code>,<br/>
<code>write</code>, <code>fork</code>, <code>exec</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q27 : Mémoire virtuelle</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi les systèmes d'exploitation<br/>
modernes utilisent-ils la <strong>mémoire virtuelle</strong> pour les processus ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Sans mémoire virtuelle, un processus<br/>
pourrait lire ou écrire dans la<br/>
mémoire d'un autre processus, ce<br/>
qui poserait des problèmes de<br/>
sécurité majeurs. Aussi, les<br/>
adresses utilisées dans le code<br/>
seraient liées à la position<br/>
effective en mémoire, ce qui<br/>
compliquerait fortement la<br/>
compilation et le chargement de<br/>
programmes.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour réduire la consommation électrique de la mémoire vive au repos</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la mémoire virtuelle<br/>
n'a pas pour objectif principal<br/>
la réduction de la consommation<br/>
électrique. Son rôle premier<br/>
est l'isolation et la flexibilité<br/>
de gestion mémoire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que la mémoire physique n'existe tout simplement plus dans les ordinateurs récents</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la mémoire physique<br/>
existe bel et bien dans tout<br/>
ordinateur ; c'est elle qui<br/>
stocke les données réellement.<br/>
La mémoire virtuelle est une<br/>
abstraction logicielle au-dessus<br/>
de la mémoire physique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Pour donner à chaque processus un espace privé et l'isoler des autres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la mémoire<br/>
virtuelle est l'un des piliers<br/>
des systèmes d'exploitation<br/>
modernes. Avantages : isolation<br/>
(un processus ne peut pas écrire<br/>
dans la mémoire d'un autre),<br/>
flexibilité (la mémoire physique<br/>
peut être fragmentée), illusion<br/>
d'abondance (le système peut<br/>
déborder sur le disque dur via<br/>
le swap). Inconvénient : un<br/>
léger surcoût lié à la<br/>
traduction d'adresses, mitigé<br/>
par des composants matériels<br/>
dédiés (TLB).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour rendre l'écriture des programmes plus rapide pour les développeurs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la mémoire virtuelle<br/>
n'a pas d'effet direct sur la<br/>
rapidité de développement.<br/>
Elle simplifie certains<br/>
aspects, mais ce n'est pas son<br/>
motif principal.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q22 : Reconnaître un interblocage</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Deux processus $P_1$ et $P_2$ utilisent deux<br/>
ressources $A$ et $B$ que le système d'exploitation<br/>
n'autorise qu'à un seul processus à la fois (ressources<br/>
non préemptibles). À un instant donné, $P_1$ détient<br/>
$A$ et attend $B$, pendant que $P_2$ détient $B$ et<br/>
attend $A$. Aucun des deux ne lâchera la ressource<br/>
qu'il détient. Quelle situation s'est produite ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'interblocage se résout en cassant au moins l'une des<br/>
quatre conditions de Coffman, par exemple en imposant<br/>
un ordre total d'acquisition des ressources (ce qui<br/>
casse la condition de cycle), ou en autorisant le<br/>
système à retirer une ressource d'un processus (ce<br/>
qui casse la non-préemption). Les bases de données et<br/>
les systèmes d'exploitation détectent activement ce<br/>
type de situation.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un interblocage, car les quatre conditions de Coffman sont toutes réunies</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : l'interblocage (en anglais<br/>
<em>deadlock</em>) se reconnaît à la coexistence des<br/>
quatre conditions de Coffman. Ici elles sont toutes<br/>
présentes : les ressources sont exclusives, chaque<br/>
processus tient une ressource tout en en demandant<br/>
une autre, le système ne peut pas retirer les<br/>
ressources de force, et la chaîne d'attente forme<br/>
un cycle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une famine, car l'un des deux processus n'obtient jamais sa ressource</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la famine concerne un processus qui<br/>
n'obtient jamais une ressource demandée parce que<br/>
d'autres lui passent systématiquement devant.<br/>
Dans le cas présent, les <strong>deux</strong> processus sont<br/>
bloqués mutuellement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une situation de compétition, car les deux processus s'exécutent en concurrence</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une situation de compétition désigne un<br/>
comportement dont le résultat dépend de l'ordre<br/>
d'exécution non maîtrisé entre processus. Ici, le<br/>
comportement est parfaitement reproductible et<br/>
déterministe : tout est figé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une file d'attente normale du système, sans problème particulier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : dans une file d'attente normale, les<br/>
processus progressent à tour de rôle. Ici, aucun<br/>
des deux n'avance et aucun n'avancera, c'est tout<br/>
sauf normal.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q23 : Comprendre l'état bloqué</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Sur un ordinateur en fonctionnement, un processus est<br/>
observé dans l'état « <strong>en attente</strong> » (ou « bloqué »)<br/>
depuis plusieurs secondes. Que peut-on en déduire de<br/>
plus probable ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un processus typique alterne plusieurs fois entre les<br/>
états « prêt », « élu » et « en attente » au cours de<br/>
sa vie. C'est ce qui rend la multiprogrammation<br/>
efficace : pendant qu'un processus attend une lecture<br/>
lente sur disque, l'ordonnanceur donne le processeur à<br/>
un autre qui a du travail à faire. La transition entre<br/>
états est entièrement gérée par le noyau.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il attend un événement extérieur ; l'ordonnanceur a donné le processeur à d'autres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : l'état « en attente » signale que le<br/>
processus ne peut pas progresser parce qu'il attend<br/>
un événement extérieur (saisie clavier, lecture<br/>
disque, réception réseau, libération d'une<br/>
ressource). L'ordonnanceur ne lui alloue pas le<br/>
processeur pendant ce temps : il attribue les<br/>
cycles à des processus qui sont, eux, à l'état<br/>
« prêt ».</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il utilise activement le processeur pour effectuer un calcul intensif</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un processus qui utilise le processeur est<br/>
dans l'état « élu » (ou « en exécution »), pas dans<br/>
l'état « en attente ».</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il consomme une grande quantité de mémoire vive sur la machine</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la consommation de mémoire n'a aucun<br/>
rapport avec l'état d'ordonnancement du processus.<br/>
Un processus en attente peut détenir beaucoup ou<br/>
peu de mémoire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il a planté et le système d'exploitation s'apprête à le supprimer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un processus planté passe à l'état<br/>
« terminé ». L'état « en attente » est, lui, un<br/>
état tout à fait normal dans le cycle de vie d'un<br/>
processus.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
