<?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="100" format="html">
    <text><![CDATA[<p>Un programme en cours d'exécution, accompagné de sa mémoire, de ses ressources et de son contexte (registres, pile d'appels)</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>Un type particulier de mémoire</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>Un fichier exécutable stocké sur le disque</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<br/>
d'exécution</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une fonction définie dans un programme Python</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 protocole utilisé sur Internet</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un fil d'exécution est une notion<br/>
interne au système d'exploitation,<br/>
sans rapport avec les protocoles<br/>
réseau.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une unité d'exécution légère au sein d'un processus, qui partage la mémoire avec les autres fils du même processus</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>Un fichier de configuration du système</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette description ne correspond pas<br/>
à la notion de fil d'exécution,<br/>
qui désigne une unité d'exécution<br/>
au sein d'un programme.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un type de fichier sur le disque</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un fil d'exécution n'a aucune<br/>
existence sur le disque. C'est une<br/>
notion d'exécution qui n'apparaît<br/>
qu'à l'instant où un programme<br/>
tourne.</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 pilote interne pour 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 d'exploitation à chaque processus pour pouvoir 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>Un descripteur de permissions</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 domaine personnel 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é et terminé, uniquement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ces deux états ne suffisent pas à<br/>
décrire le cycle de vie d'un<br/>
processus. Un processus peut être<br/>
prêt à s'exécuter, en train de<br/>
s'exécuter, ou bloqué en attente<br/>
d'une ressource.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Sain et malade</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette description fantaisiste n'a<br/>
aucun rapport avec la gestion des<br/>
processus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Prêt, en exécution, bloqué (en attente d'une ressource ou d'une entrée-sortie), 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>Visible et caché</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La visibilité d'un processus pour<br/>
l'utilisateur n'a pas grand<br/>
rapport avec son cycle de vie<br/>
interne au système.</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 (ou <em>shell</em>)</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</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="100" format="html">
    <text><![CDATA[<p>L'ordonnanceur, qui est un composant du noyau du système d'exploitation</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>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'utilisateur, à 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>
</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 désigne plusieurs tâches en cours logiquement (qui se partagent un même processeur en alternant). Le parallélisme désigne plusieurs tâches s'exécutant réellement en même temps sur des cœurs différents</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>La concurrence n'existe pas en informatique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La concurrence est au contraire<br/>
un concept fondamental, présent<br/>
dans la plupart des systèmes<br/>
d'exploitation modernes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune différence, ce sont deux mots pour la même chose</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La distinction entre les deux<br/>
notions est importante en<br/>
informatique, comme expliqué dans<br/>
la bonne réponse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le parallélisme est toujours plus rapide</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 permettre une communication rapide entre fils d'exécution (lire et écrire des variables communes), au prix d'une nécessaire gestion de la synchronisation</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>Par défaut, ils ne partagent rien</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le partage de la mémoire est<br/>
précisément la caractéristique<br/>
qui distingue les fils<br/>
d'exécution des processus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour économiser des cœurs de processeur</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>Aucune raison particulière</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le partage de la mémoire entre<br/>
fils d'exécution répond à un<br/>
besoin précis, comme expliqué<br/>
dans la bonne réponse.</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="0" format="html">
    <text><![CDATA[<p>Un message textuel envoyé sur un réseau social</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette interprétation littérale du<br/>
mot « signal » est sans rapport<br/>
avec sa signification en<br/>
informatique système, où il<br/>
désigne un mécanisme du système<br/>
d'exploitation.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une instruction 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="100" format="html">
    <text><![CDATA[<p>Une notification asynchrone envoyée à un processus pour lui demander une action (terminaison, suspension, reprise…)</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>Un protocole utilisé sur Internet</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>
</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<br/>
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></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></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></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 particulière</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.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un programme malveillant</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 qui s'exécute en arrière-plan, sans interface utilisateur, généralement lancé au démarrage du système et fournissant un service comme un serveur web, une base de données ou un service de journalisation</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 caché 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 utilisée par le compilateur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une course critique est un<br/>
défaut de programmation, pas<br/>
une optimisation.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une compétition sportive informatisée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette interprétation littérale<br/>
est sans rapport avec le sens<br/>
technique de l'expression.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un phénomène sans rapport avec les fils d'exécution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La course critique est<br/>
précisément un phénomène lié à<br/>
l'exécution concurrente de<br/>
plusieurs fils accédant à des<br/>
données partagées.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un bug qui survient lorsque l'ordre d'exécution de plusieurs fils d'exécution accédant à une même ressource partagée influence le résultat de manière 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>
</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<br/>
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 des données partagées</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 intentionnellement le programme</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 pour les protéger</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 d'exécution à la fois accède à une ressource partagée, ce qui évite les courses critiques</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 du programme</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 émis 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 blocage de l'écran</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 dans laquelle plusieurs fils d'exécution ou processus s'attendent mutuellement sans fin, chacun détenant une ressource demandée par un autre</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 le clavier</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</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>À l'aide de tubes de communication, de connexions réseau (sockets), de fichiers partagés, d'une mémoire partagée explicite, ou de 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>Il leur est impossible de communiquer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Plusieurs mécanismes<br/>
permettent au contraire à des<br/>
processus isolés de<br/>
communiquer, comme expliqué<br/>
dans la bonne réponse.</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>Exécuter un nouveau programme depuis le processus courant</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>Terminer immédiatement le processus appelant</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 : on obtient un processus parent et un processus enfant, qui partagent au départ le même code et la même mémoire</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 sur le disque</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 code de retour n'a pas encore été récupéré par son parent. Il occupe encore une entrée dans la table des processus</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 pour le 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</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le zombie n'est pas un signal<br/>
mais un état d'un processus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un processus pris dans une boucle infinie</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 — Q17 : Le verrou global de l'interpréteur Python</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce que le <strong>verrou global de<br/>
l'interpréteur</strong> dans l'implémentation<br/>
principale de Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Ce verrou fait l'objet de débats<br/>
depuis longtemps. Python 3.13<br/>
introduit, en option, la<br/>
possibilité de l'enlever. Pour<br/>
les opérations d'entrées-sorties<br/>
(réseau, fichiers), les fils<br/>
d'exécution restent utiles, car<br/>
ils libèrent le verrou pendant<br/>
les attentes.</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 standard de la bibliothèque Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le verrou global de<br/>
l'interpréteur n'est pas un<br/>
module Python, mais un<br/>
mécanisme interne de<br/>
l'interpréteur lui-même.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une fonction de la bibliothèque standard</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le verrou global est un<br/>
mécanisme interne de<br/>
l'interpréteur, pas une<br/>
fonction accessible au<br/>
programmeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un verrou interne à l'interpréteur qui garantit qu'un seul fil d'exécution Python à la fois exécute du bytecode, ce qui simplifie l'implémentation de l'interpréteur mais limite le parallélisme effectif sur le processeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une conséquence pratique : pour<br/>
du calcul intensif sur le<br/>
processeur, mieux vaut<br/>
utiliser le module<br/>
<code>multiprocessing</code> (qui crée de<br/>
vrais processus séparés)<br/>
plutôt que <code>threading</code>, à<br/>
moins que le verrou ne soit<br/>
libéré pendant les attentes<br/>
(entrées-sorties, par<br/>
exemple).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un éditeur de texte particulier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le verrou global est une<br/>
notion interne au système<br/>
d'exécution de Python, sans<br/>
rapport avec les éditeurs de<br/>
texte.</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="0" format="html">
    <text><![CDATA[<p>Aucune raison particulière</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La priorité joue un rôle<br/>
essentiel dans l'allocation<br/>
du temps processeur, comme<br/>
détaillé dans la bonne<br/>
réponse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Pour s'assurer que les processus importants (interactifs, système) reçoivent davantage de temps processeur que les processus moins prioritaires (calculs en arrière-plan)</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 des raisons de sécurité</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 faire plaisir aux développeurs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les priorités obéissent à des<br/>
considérations techniques, pas<br/>
à des préférences<br/>
subjectives.</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 (raccourci Ctrl + Maj + Échap), ou avec la commande PowerShell <code>Get-Process</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le Gestionnaire des tâches<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></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>Il est impossible d'observer les processus sous Windows</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Plusieurs outils permettent<br/>
au contraire d'observer les<br/>
processus, comme expliqué<br/>
dans la bonne réponse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>En éteignant et en rallumant Windows</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette plaisanterie n'a pas<br/>
lieu d'être : éteindre le<br/>
système ne permet<br/>
évidemment pas d'observer<br/>
ses processus en cours.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q20 : Tracer les appels système</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle commande Linux permet de tracer<br/>
les <strong>appels système</strong> effectués par un<br/>
programme ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Plusieurs variantes existent :<br/>
<code>ltrace</code> pour tracer les<br/>
appels aux bibliothèques, <code>perf</code><br/>
pour le profilage de<br/>
performances, ou encore<br/>
<code>dtrace</code> sur les systèmes BSD<br/>
et macOS. Tous ces outils<br/>
permettent de mieux comprendre<br/>
le comportement effectif d'un<br/>
programme.</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><code>ls</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La commande <code>ls</code> liste le<br/>
contenu d'un répertoire ;<br/>
elle n'a rien à voir avec<br/>
le traçage des appels<br/>
système.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>grep</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La commande <code>grep</code> sert à<br/>
rechercher un motif dans un<br/>
texte ; elle n'a aucun<br/>
rapport avec le traçage des<br/>
appels système.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>top</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La commande <code>top</code> montre<br/>
l'utilisation des ressources<br/>
(processeur, mémoire) par les<br/>
processus, mais elle ne<br/>
permet pas de tracer les<br/>
appels système d'un<br/>
programme particulier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>strace</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La commande <code>strace<br/>
./mon_programme</code> affiche<br/>
chaque appel système effectué<br/>
par le programme (<code>open</code>,<br/>
<code>read</code>, <code>write</code>, etc.). C'est<br/>
un outil très utile pour<br/>
comprendre ce qu'un programme<br/>
fait au niveau du système.</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<br/>
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>Trois conditions seulement suffisent</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Il s'agit bien de quatre<br/>
conditions, qui doivent toutes<br/>
être réunies pour qu'un<br/>
interblocage se produise.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune condition particulière</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un interblocage requiert au<br/>
contraire la conjonction de<br/>
plusieurs conditions<br/>
précises, comme expliqué<br/>
dans la bonne réponse.</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>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q22 : Réservoir de fils d'exécution</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi utiliser un <strong>réservoir de<br/>
fils d'exécution</strong> plutôt que créer un<br/>
nouveau fil pour chaque tâche ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une bonne pratique consiste à<br/>
dimensionner la taille du<br/>
réservoir en fonction du nombre<br/>
de cœurs disponibles si la<br/>
charge est principalement<br/>
processeur, ou plus largement si<br/>
la charge est dominée par les<br/>
entrées-sorties (cas où les<br/>
fils sont souvent en attente).</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 économiser sur l'achat du clavier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette interprétation littérale<br/>
n'a aucun rapport avec la<br/>
notion technique de<br/>
réservoir de fils<br/>
d'exécution.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La création d'un fil d'exécution a un coût (allocation de mémoire, mise en place d'un contexte). Un réservoir réutilise un nombre fixe de fils pour de nombreuses tâches, ce qui réduit ce coût et limite le degré de concurrence</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce motif de conception est<br/>
courant dans les serveurs<br/>
web et dans le calcul<br/>
parallèle. En Python,<br/>
<code>concurrent.futures.ThreadPoolExecutor</code><br/>
fournit un tel réservoir.<br/>
En Java, on dispose de<br/>
<code>Executors.newFixedThreadPool(n)</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il n'y a aucun avantage à utiliser un réservoir</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le réservoir apporte des<br/>
gains importants en<br/>
performance et en stabilité,<br/>
comme expliqué dans la<br/>
bonne réponse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour avoir un nombre illimité de fils d'exécution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le réservoir vise au<br/>
contraire à <strong>limiter</strong> le<br/>
nombre de fils d'exécution<br/>
actifs, afin d'éviter la<br/>
surcharge du système.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q23 : Producteurs et consommateurs</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>En quoi consiste le motif des<br/>
<strong>producteurs et consommateurs</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Plusieurs patrons classiques de<br/>
concurrence existent :<br/>
producteurs-consommateurs,<br/>
lecteurs-écrivains, le<br/>
problème des cinq philosophes,<br/>
la barrière de synchronisation.</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 de la mémoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le motif des producteurs et<br/>
consommateurs concerne la<br/>
synchronisation et le<br/>
découplage entre tâches, et<br/>
non l'optimisation de la<br/>
mémoire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il s'agit d'un patron dans lequel des producteurs déposent des éléments dans une file partagée (avec verrou) et des consommateurs retirent ces éléments pour les traiter. Cela permet de découpler la production de la consommation</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est un patron de conception<br/>
fondamental. En Python, la<br/>
classe <code>queue.Queue</code> fournit<br/>
une file synchronisée.<br/>
Lorsque la file est pleine,<br/>
le producteur attend ;<br/>
lorsqu'elle est vide, le<br/>
consommateur attend.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un patron sans intérêt pratique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce motif est au contraire<br/>
omniprésent en programmation<br/>
concurrente, comme expliqué<br/>
dans la bonne réponse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>C'est un motif d'achat-vente</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce motif est un patron de<br/>
conception en programmation<br/>
concurrente, sans rapport<br/>
avec le commerce.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Processus et système — Q24 : Choisir entre multiprocessing et fils d'exécution</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour du <strong>calcul intensif</strong> en Python,<br/>
faut-il préférer les fils d'exécution<br/>
ou les processus ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Compromis : les fils d'exécution<br/>
sont légers et partagent la<br/>
mémoire, mais sont limités par<br/>
le verrou global. Les processus<br/>
offrent un véritable<br/>
parallélisme, mais leur<br/>
création et leur communication<br/>
ont un coût plus élevé.</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>Les processus, par exemple avec le module <code>multiprocessing</code> ou avec <code>concurrent.futures.ProcessPoolExecutor</code>, qui contournent le verrou global en utilisant de vrais processus séparés</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pour des tâches dominées par<br/>
les entrées-sorties (réseau,<br/>
fichiers), les fils<br/>
d'exécution restent<br/>
adaptés. Pour du calcul<br/>
intensif sur le processeur,<br/>
mieux vaut passer par<br/>
plusieurs processus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Uniquement le module asyncio</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le module <code>asyncio</code> est<br/>
conçu pour la concurrence<br/>
dominée par les<br/>
entrées-sorties, et non pour<br/>
le calcul intensif sur le<br/>
processeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune des deux solutions ne convient</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les deux approches sont<br/>
utiles, chacune dans son<br/>
domaine, comme expliqué<br/>
dans la bonne réponse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Toujours les fils d'exécution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>En raison du verrou global<br/>
de l'interpréteur dans<br/>
l'implémentation principale<br/>
de Python, les fils<br/>
d'exécution ne parallélisent<br/>
pas le calcul effectif sur<br/>
le processeur. Mieux vaut<br/>
utiliser des processus.</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 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</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<br/>
utilisateur</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é</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<br/>
réseau</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<br/>
par un programme au noyau du<br/>
système d'exploitation, par<br/>
exemple pour ouvrir un fichier,<br/>
allouer de la mémoire, créer un<br/>
processus ou communiquer sur le<br/>
réseau</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<br/>
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 économiser de l'électricité</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<br/>
n'existe plus dans les<br/>
ordinateurs modernes</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<br/>
l'illusion d'un espace mémoire<br/>
contigu et privé, en mappant les<br/>
adresses virtuelles utilisées par<br/>
le processus sur des adresses<br/>
physiques réelles ; cela permet<br/>
aussi l'isolation entre processus<br/>
et la possibilité de gérer plus<br/>
de mémoire que la mémoire physique<br/>
disponible (via le swap)</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 les programmes plus<br/>
rapides à coder</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>

</quiz>
