Exercice 1 — Métropole 2021 (4 points)
Cet exercice porte sur les systèmes d’exploitation : gestion des processus et des ressources.
Les parties A et B peuvent être traitées indépendamment.
Partie A
Dans un bureau d’architectes, on dispose de certaines ressources qui ne peuvent être utilisées simultanément par plus d’un processus, comme l’imprimante, la table traçante, le modem.
Chaque programme, lorsqu’il s’exécute, demande l’allocation des ressources qui lui sont nécessaires. Lorsqu’il a fini de s’exécuter, il libère ses ressources.
Programme 1 :
demander (table traçante)
demander (modem)
exécution
libérer (modem)
libérer (table traçante)
Programme 2 :
demander (modem)
demander (imprimante)
exécution
libérer (imprimante)
libérer (modem)
Programme 3 :
demander (imprimante)
demander (table traçante)
exécution
libérer (table traçante)
libérer (imprimante)
On appelle p1, p2 et p3 les processus associés respectivement aux programmes 1, 2 et 3.
- Les processus s’exécutent de manière concurrente. Justifier qu’une situation d’interblocage peut se produire.
- Modifier l’ordre des instructions du programme 3 pour qu’une telle situation ne puisse pas se produire. Aucune justification n’est attendue.
- Supposons que le processus p1 demande la table traçante alors qu’elle est en cours d’utilisation par le processus p3. Parmi les états suivants, quel sera l’état du processus p1 tant que la table traçante n’est pas disponible :
- a) élu ;
- b) bloqué ;
- c) prêt ;
- d) terminé.
Partie B
Avec une ligne de commande dans un terminal sous Linux, on obtient l’affichage suivant :
UID PID PPID C STIME TTY TIME CMD
...
pi 6211 831 8 09:07 ? 00:01:16 /usr/lib/chromium-browser/chromium-browser-v7 ...
pi 6252 6211 0 09:07 ? 00:00:00 /usr/lib/chromium-browser/chromium-browser-v7 --type=zygote ...
pi 6254 6252 0 09:07 ? 00:00:00 /usr/lib/chromium-browser/chromium-browser-v7 --type=zygote ...
pi 6294 6211 4 09:07 ? 00:00:40 /usr/lib/chromium-browser/chromium-browser-v7 --type=gpu-process ...
pi 6300 6211 1 09:07 ? 00:00:16 /usr/lib/chromium-browser/chromium-browser-v7 --type=utility ...
pi 6467 6254 1 09:07 ? 00:00:11 /usr/lib/chromium-browser/chromium-browser-v7 --type=renderer ...
pi 12835 836 0 09:13 ? 00:00:00 /usr/lib/libreoffice/program/oosplash ...
pi 12073 12835 2 09:13 ? 00:00:15 /usr/lib/libreoffice/program/soffice.bin ...
pi 12253 831 1 09:13 ? 00:00:07 /usr/bin/python3 /usr/bin/sense_emu_gui
pi 20029 6254 56 09:21 ? 00:00:28 /usr/lib/chromium-browser/chromium-browser-v7 --type=renderer ...
pi 20519 676 0 09:22 pts/0 00:00:00 ps -ef
La documentation Linux donne la signification des différents champs :
- UID : identifiant utilisateur effectif ;
- PID : identifiant de processus ;
- PPID : PID du processus parent ;
- C : partie entière du pourcentage d’utilisation du processeur ;
- STIME : l’heure de lancement du processus ;
- TTY : terminal de contrôle ;
- TIME : temps d’exécution ;
- CMD : nom de la commande du processus.
Parmi les quatre commandes suivantes, laquelle a permis cet affichage ?
- a)
ls -l - b)
ps -ef - c)
cd .. - d)
chmod 741 processus.txt
- a)
Quel est l’identifiant du processus parent à l’origine de tous les processus concernant le navigateur Web (chromium-browser) ?
Quel est l’identifiant du processus dont le temps d’exécution est le plus long ?
Solution
Partie A
1. Montrons qu’un interblocage peut se produire. Supposons le scénario suivant :
- p1 s’exécute en premier et obtient la table traçante ;
- l’ordonnanceur interrompt p1 et élit p2 ;
- p2 obtient le modem ;
- l’ordonnanceur interrompt p2 et élit p3 ;
- p3 obtient l’imprimante.
À ce stade, chaque processus détient une ressource et en demande une autre :
- p1 possède la table traçante et demande le modem (détenu par p2) → p1 est bloqué ;
- p2 possède le modem et demande l’imprimante (détenue par p3) → p2 est bloqué ;
- p3 possède l’imprimante et demande la table traçante (détenue par p1) → p3 est bloqué.
Il y a un cycle d’attente : p1 → p2 → p3 → p1. Les quatre conditions de Coffman sont réunies (exclusion mutuelle, détention et attente, non-préemption, attente circulaire) : c’est un interblocage.
2. On modifie le programme 3 pour supprimer l’attente circulaire :
demander (table traçante)
demander (imprimante)
exécution
libérer (imprimante)
libérer (table traçante)
En imposant que les ressources soient demandées dans un ordre global fixe (par exemple : table traçante avant modem avant imprimante), aucun cycle ne peut se former.
3. La réponse est b) bloqué. Lorsqu’un processus demande une ressource qui n’est pas disponible, il passe dans l’état bloqué et attend que la ressource se libère. Il ne peut pas être « élu » (il n’utilise pas le processeur), ni « prêt » (il ne peut pas s’exécuter tant que la ressource n’est pas libérée), ni « terminé » (il n’a pas fini son exécution).
Partie B
1. La réponse est b) ps -ef. C’est la commande qui affiche la liste de tous les processus en cours avec leurs identifiants (PID, PPID), leur propriétaire (UID) et la commande associée (CMD). On peut d’ailleurs vérifier que la dernière ligne de l’affichage est ps -ef elle-même.
2. Le processus parent à l’origine de tous les processus chromium-browser a le PID 6211. On le vérifie en observant que la plupart des processus chromium ont un PPID de 6211. Le processus 6211 est lui-même le premier lancé (son PPID est 831, qui n’est pas un processus chromium).
3. Le processus dont le temps d’exécution (colonne TIME) est le plus long est celui de PID 6211, avec un temps de 00:01:16. C’est le processus principal de chromium-browser.
Exercice 2 — Amérique du Nord 2022 (4 points)
Cet exercice porte sur les systèmes d’exploitation et la gestion des processus par un système d’exploitation.
Cet exercice pourra utiliser des commandes de systèmes d’exploitation de type UNIX telles que cd, ls, mkdir, rm, rmdir, mv, cat.
1. Dans un système d’exploitation de type UNIX, on considère l’arborescence suivante (les noms de dossiers sont en italique et ceux des fichiers sont en gras) :
/
├── bin
├── etc
├── home
│ └── morgane
│ ├── lycee
│ │ ├── francais
│ │ └── NSI
│ │ ├── info.txt
│ │ └── image1.jpg
│ └── perso
└── tmp
On suppose qu’on se trouve actuellement à l’emplacement /home/morgane.
a) Parmi les quatre propositions suivantes, donner celle correspondant à l’affichage obtenu lors de l’utilisation de la commande ls :
- Proposition 1 :
lycee francais NSI info.txt image1.jpg perso - Proposition 2 :
lycee perso - Proposition 3 :
morgane - Proposition 4 :
bin etc home tmp
b) Écrire la commande qui permet, à partir de cet emplacement, d’atteindre le répertoire lycee.
On suppose maintenant qu’on se trouve dans le répertoire /home/morgane/lycee/NSI.
c) Écrire la commande qui permet de créer à cet emplacement un répertoire nommé algorithmique.
d) Écrire la commande qui permet, à partir de cet emplacement, de supprimer le fichier image1.jpg.
2. On rappelle qu’un processus est une instance d’application. On a exécuté la commande ps (avec quelques options). Un extrait du résultat est présenté ci-dessous :
UID PID PPID C STIME TTY TIME CMD
test 900 739 0 10:51 ? 00:00:00 /usr/lib/gvfs/gvfs-udisks2-vol
test 907 838 0 10:51 ? 00:00:00 /usr/lib/gvfs/gvfsd-trash --sp
test 913 739 0 10:51 ? 00:00:00 /usr/lib/gvfs/gvfsd-metadata
test 923 1 0 10:51 ? 00:00:02 xfce4-terminal
test 927 923 0 10:51 pts/0 00:00:00 bash
test 1036 1 0 11:18 ? 00:00:02 mousepad /home/test/Documents/
test 1058 923 0 11:22 pts/1 00:00:00 bash
test 1153 927 0 11:44 pts/0 00:00:00 vi
test 1154 927 0 11:44 pts/0 00:00:00 python3 prog.py
test 1155 1058 0 11:44 pts/1 00:00:00 ps -aef
On rappelle que :
- l’UID est l’identifiant de l’utilisateur propriétaire du processus ;
- le PID est l’identifiant du processus ;
- le PPID est l’identifiant du processus parent ;
- C indique l’utilisation processeur ;
- STIME est l’heure de démarrage du processus ;
- TTY est le nom du terminal de commande auquel le processus est attaché ;
- TIME est la durée d’utilisation du processeur par le processus ;
- CMD le nom de la commande utilisée pour démarrer le processus.
a) Donner le PID du parent du processus démarré par la commande vi.
b) Donner le PID d’un processus enfant du processus démarré par la commande xfce4-terminal.
c) Citer le PID de deux processus qui ont le même parent.
d) Parmi tous les processus affichés, citer le PID des deux qui ont consommé le plus de temps du processeur.
3. On considère les trois processus P1, P2 et P3, tous soumis à l’instant 0 dans l’ordre 1, 2, 3 :
| Nom du processus | Durée d’exécution (en unités de temps) | Ordre de soumission |
|---|---|---|
| P1 | 3 | 1 |
| P2 | 1 | 2 |
| P3 | 4 | 3 |
a) On considère que les processus sont exécutés de manière concurrente selon la politique du tourniquet (Round Robin) : le temps est découpé en quantums de temps. Le quantum correspond à une unité de temps. Reproduire le tableau ci-dessous et indiquer dans chacune des cases le processus exécuté par le processeur entre deux unités de temps.
| 0–1 | 1–2 | 2–3 | 3–4 | 4–5 | 5–6 | 6–7 | 7–8 | |
|---|---|---|---|---|---|---|---|---|
| Processus | P1 |
b) On considère que les processus sont exécutés en appliquant la politique du « plus court d’abord » (SJF) : les processus sont exécutés complètement dans l’ordre croissant de leurs temps d’exécution, le plus court étant exécuté en premier. Reproduire et compléter le même tableau.
4. On considère trois ressources R1, R2 et R3 et trois processus P1, P2 et P3 dont les files d’exécution des instructions élémentaires sont indiquées ci-dessous :
| Processus P1 | Processus P2 | Processus P3 |
|---|---|---|
| Demande R1 | Demande R2 | Demande R3 |
| Demande R2 | Demande R3 | Demande R1 |
| Libère R1 | Libère R2 | Libère R3 |
| Libère R2 | Libère R3 | Libère R1 |
a) Rappeler les différents états d’un processus et expliquer pourquoi il y a ici risque d’interblocage, en proposant un ordre d’exécution des instructions élémentaires le provoquant.
b) Proposer un ordre d’exécution des instructions élémentaires sans interblocage.
Solution
1. Commandes Linux
a) La réponse est la proposition 2 : lycee perso. La commande ls (sans argument) affiche le contenu du répertoire courant. Le répertoire /home/morgane contient deux sous-répertoires : lycee et perso.
b) cd lycee (ou cd ./lycee, ou encore cd /home/morgane/lycee en chemin absolu).
c) mkdir algorithmique
d) rm image1.jpg
2. Lecture de la table des processus
a) Le processus vi a le PID 1153. Son PPID est 927 (le processus bash du terminal pts/0).
b) Le processus xfce4-terminal a le PID 923. Ses enfants (processus dont le PPID est 923) sont : 927 (bash), 1058 (bash). On peut citer par exemple le PID 927.
c) Les processus 1153 (vi) et 1154 (python3 prog.py) ont tous deux le PPID 927. On peut aussi citer 927 et 1058 qui ont tous deux le PPID 923.
d) Les deux processus ayant consommé le plus de temps processeur (colonne TIME) sont les PID 923 (xfce4-terminal, TIME = 00:00:02) et 1036 (mousepad, TIME = 00:00:02).
3. Ordonnancement
a) Round Robin (quantum = 1) : tous les processus arrivent à t=0 dans l’ordre P1, P2, P3.
| 0–1 | 1–2 | 2–3 | 3–4 | 4–5 | 5–6 | 6–7 | 7–8 |
| P1 | P2 ✓ | P3 | P1 | P3 | P1 ✓ | P3 | P3 ✓ |
P2, qui n’a besoin que d’un cycle, termine dès son premier passage (t=1–2). P1 et P3 se relaient ensuite.
b) SJF : on exécute intégralement les processus dans l’ordre croissant de durée : P2 (durée 1), P1 (durée 3), P3 (durée 4).
| 0–1 | 1–2 | 2–3 | 3–4 | 4–5 | 5–6 | 6–7 | 7–8 |
| P2 ✓ | P1 | P1 | P1 ✓ | P3 | P3 | P3 | P3 ✓ |
4. Interblocage
a) Les différents états d’un processus sont : nouveau (vient d’être créé), prêt (attend le processeur), élu (en cours d’exécution), bloqué (en attente d’une ressource), terminé (exécution achevée).
Voici un scénario menant à un interblocage :
- P1 est élu et exécute « Demande R1 » → P1 obtient R1.
- P2 est élu et exécute « Demande R2 » → P2 obtient R2.
- P3 est élu et exécute « Demande R3 » → P3 obtient R3.
- P1 est élu et exécute « Demande R2 » → R2 est détenue par P2 → P1 est bloqué.
- P2 est élu et exécute « Demande R3 » → R3 est détenue par P3 → P2 est bloqué.
- P3 est élu et exécute « Demande R1 » → R1 est détenue par P1 → P3 est bloqué.
Il y a un cycle d’attente : P1 attend R2 (de P2), P2 attend R3 (de P3), P3 attend R1 (de P1). C’est un interblocage.
b) Voici un ordre d’exécution sans interblocage :
- P1 : Demande R1 → obtient R1.
- P1 : Demande R2 → obtient R2.
- P1 : Libère R1. P1 : Libère R2. → P1 terminé.
- P2 : Demande R2 → obtient R2.
- P2 : Demande R3 → obtient R3.
- P2 : Libère R2. P2 : Libère R3. → P2 terminé.
- P3 : Demande R3 → obtient R3.
- P3 : Demande R1 → obtient R1.
- P3 : Libère R3. P3 : Libère R1. → P3 terminé.
En laissant chaque processus s’exécuter intégralement avant de passer au suivant, on évite tout interblocage.
Exercice 3 — Amérique du Sud 2022 (4 points)
Cet exercice porte sur la gestion des processus et des ressources par un système d’exploitation.
Les parties A et B peuvent être traitées indépendamment.
A. Ordonnancement des processus
Dans le laboratoire d’analyse médicale d’un hôpital, plusieurs processus peuvent demander l’allocation du processeur simultanément.
Le tableau ci-dessous donne les demandes d’exécution de quatre processus et indique :
- le temps d’exécution du processus (en unité de temps) ;
- l’instant d’arrivée du processus sur le processeur (en unité de temps) ;
- le numéro de priorité du processus (classé de 1 à 10).
Plus la priorité est grande plus le numéro de priorité est petit. Ainsi le processus P3 est plus prioritaire que P1.
L’ordonnancement est de type préemptif : à chaque unité de temps, le processeur choisit d’exécuter le processus ayant le plus petit numéro de priorité (un seul processus à la fois). Ceci peut provoquer la suspension d’un autre processus qui reprendra lorsqu’il deviendra le plus prioritaire dans la file d’attente.
| Processus | Temps d’exécution | Instant d’arrivée | Numéro de priorité |
|---|---|---|---|
| P1 | 3 | 0 | 4 |
| P2 | 4 | 2 | 2 |
| P3 | 3 | 3 | 1 |
| P4 | 4 | 5 | 3 |
1. Reproduire le diagramme ci-dessous et indiquer dans chacune des cases le processus exécuté par le processeur entre deux unités de temps (il peut y avoir des cases vides).
| 0–1 | 1–2 | 2–3 | 3–4 | 4–5 | 5–6 | 6–7 | 7–8 | 8–9 | 9–10 | 10–11 | 11–12 | 12–13 | 13–14 | 14–15 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Processus | P1 |
2. Recopier et compléter les temps de séjour ainsi que les temps d’attente de chacun des processus (toujours en unités de temps).
Rappel :
- Temps de séjour = instant de terminaison − instant d’arrivée
- Temps d’attente = temps de séjour − temps d’exécution
| Processus | Temps d’exécution | Instant d’arrivée | Temps de séjour | Temps d’attente |
|---|---|---|---|---|
| P1 | 3 | 0 | 14 − 0 = 14 | 14 − 3 = 11 |
| P2 | 4 | 2 | ||
| P3 | 3 | 3 | ||
| P4 | 4 | 5 |
3. À quelles conditions le temps d’attente d’un processus peut-il être nul ?
B. Processus et ressources
Dans ce laboratoire d’analyse médicale de l’hôpital, le laborantin en charge du traitement des différents prélèvements (sanguins, urinaires et biopsiques) utilise simultanément quatre logiciels :
- Logiciel d’analyse d’échantillons (connecté à l’analyseur) ;
- Logiciel d’accès à la base de données des patients (SGBD) ;
- Traitement de texte ;
- Tableur.
Le tableau ci-dessous donne l’état à un instant donné des différents processus (instances des programmes) qui peuvent soit mobiliser (M) des données (D1, D2, D3, D4 et D5), soit être en attente (A) des données ou ne pas les solliciter (-).
Une donnée ne peut être mobilisée que par un seul processus à la fois. Si un autre processus demande une donnée déjà mobilisée, il passe en attente.
Exemple : le SGBD mobilise la donnée D4 et est en attente de la donnée D5.
| D1 | D2 | D3 | D4 | D5 | |
|---|---|---|---|---|---|
| Analyseur échantillon | M | - | - | A | - |
| SGBD | - | - | - | M | A |
| Traitement de texte | - | M | A | - | - |
| Tableur | A | - | M | - | M |
1. À partir du tableau ci-dessus, démontrer que, à cet instant, les processus s’attendent mutuellement.
2. Comment s’appelle cette situation ?
3. On suppose que l’analyseur d’échantillon libère la ressource D1. Donner un ordre possible d’exécution des processus.
Solution
A. Ordonnancement par priorité préemptif
1. À chaque unité de temps, on élit le processus présent dont le numéro de priorité est le plus petit (priorité la plus forte). Lorsqu’un processus plus prioritaire arrive, il préempte le processus en cours.
| 0–1 | 1–2 | 2–3 | 3–4 | 4–5 | 5–6 | 6–7 | 7–8 | 8–9 | 9–10 | 10–11 | 11–12 | 12–13 | 13–14 |
| P1 | P1 | P2 | P3 | P3 | P3 ✓ | P2 | P2 | P2 ✓ | P4 | P4 | P4 | P4 ✓ | P1 ✓ |
P1 commence seul (t=0–2). À t=2, P2 (priorité 2) arrive et préempte P1 (priorité 4). À t=3, P3 (priorité 1) préempte P2. P3 termine à t=6, puis P2 reprend et termine à t=9. Ensuite P4 (priorité 3) s’exécute avant P1 (priorité 4). P1 termine en dernier à t=14.
2. Calcul des temps de séjour et d’attente :
| Processus | Temps d’exécution | Instant d’arrivée | Terminaison | Temps de séjour | Temps d’attente |
|---|---|---|---|---|---|
| P1 | 3 | 0 | 14 | 14 − 0 = 14 | 14 − 3 = 11 |
| P2 | 4 | 2 | 9 | 9 − 2 = 7 | 7 − 4 = 3 |
| P3 | 3 | 3 | 6 | 6 − 3 = 3 | 3 − 3 = 0 |
| P4 | 4 | 5 | 13 | 13 − 5 = 8 | 8 − 4 = 4 |
3. Le temps d’attente d’un processus est nul lorsque le processus s’exécute immédiatement à partir de son arrivée, sans interruption et sans jamais être préempté. Autrement dit, il faut que le processus soit le plus prioritaire dès son arrivée et qu’il le reste jusqu’à sa terminaison (comme c’est le cas pour P3 dans cet exercice).
B. Processus et ressources
1. Identifions les attentes de chaque processus :
- L’analyseur d’échantillon mobilise D1 et attend D4 (mobilisée par le SGBD).
- Le SGBD mobilise D4 et attend D5 (mobilisée par le tableur).
- Le traitement de texte mobilise D2 et attend D3 (mobilisée par le tableur).
- Le tableur mobilise D3 et D5, et attend D1 (mobilisée par l’analyseur).
On a un cycle d’attente : l’analyseur attend le SGBD (via D4), le SGBD attend le tableur (via D5), et le tableur attend l’analyseur (via D1). Le traitement de texte attend aussi le tableur (via D3). Les processus s’attendent mutuellement et aucun ne peut progresser.
2. Cette situation s’appelle un interblocage (deadlock).
3. Si l’analyseur libère D1, le cycle est rompu :
- Le tableur obtient D1 (qu’il attendait), s’exécute et libère D1, D3 et D5.
- Le traitement de texte obtient D3 (qu’il attendait), s’exécute et libère D2 et D3.
- Le SGBD obtient D5 (qu’il attendait), s’exécute et libère D4 et D5.
- L’analyseur obtient D4 (qu’il attendait), s’exécute et termine.
Exercice 4 — Polynésie 2023 (4 points)
Cet exercice porte sur la gestion des processus et la programmation orientée objet.
On rappelle qu’un processus est l’instance d’un programme en cours d’exécution. Il est identifié par un numéro unique appelé PID. L’ordonnanceur est la composante du système d’exploitation qui gère l’allocation du processeur entre les différents processus.
Nous allons nous intéresser à l’algorithme d’ordonnancement du tourniquet dont le fonctionnement est résumé ci-dessous :
- les processus prêts à être exécutés sont placés dans une file d’attente selon leur ordre d’arrivée ;
- l’ordonnanceur alloue le processeur à chaque processus de la file d’attente un même nombre de cycles CPU, appelé quantum ;
- si le processus n’est pas terminé au bout de ce temps, son exécution est suspendue et il est mis à la fin de la file d’attente ;
- si le processus est terminé, il sort définitivement de la file d’attente.
1. On considère trois processus soumis à l’ordonnanceur au même instant pour lesquels on donne les informations ci-dessous :
| PID | Durée (en cycles CPU) | Ordre d’arrivée |
|---|---|---|
| 11 | 4 | 1 |
| 20 | 2 | 2 |
| 32 | 3 | 3 |
a) Si le quantum du tourniquet est d’un cycle CPU, recopier et compléter la suite des PID des processus dans l’ordre de leur exécution :
11, 20, 32, 11, ...
b) Donner la composition de la suite des PID lorsque le quantum du tourniquet est de deux cycles CPU.
2. L’objectif de la suite de l’exercice est d’implémenter en langage Python l’algorithme du tourniquet. Nous allons utiliser une liste pour simuler la file d’attente des processus et la classe Processus dont le constructeur est donné ci-dessous :
class Processus:
def __init__(self, pid, duree):
self.pid = pid
self.duree = duree
# Le nombre de cycles qui restent à faire :
self.reste_a_faire = duree
self.etat = "Prêt"
Les états possibles d’un processus sont : « Prêt », « En cours d’exécution », « Suspendu » et « Terminé ».
a) Recopier et compléter l’instruction Python suivante permettant de créer la liste d’attente initiale des processus donnés dans le tableau précédent :
liste_attente = [Processus(..., ...), ..., ...]
b) Recopier et compléter les trois méthodes suivantes de la classe Processus :
def execute_un_cycle(self):
...
def change_etat(self, nouvel_etat):
...
def est_termine(self):
...
c) La fonction tourniquet ci-dessous implémente l’algorithme. Recopier et compléter le code manquant :
def tourniquet(liste_attente, quantum):
ordre_execution = []
while liste_attente != []:
processus = liste_attente.pop(0)
processus.change_etat("En cours d'exécution")
compteur_tourniquet = 0
while .................. and ..................:
ordre_execution.append(...........)
processus.execute_un_cycle()
compteur_tourniquet = compteur_tourniquet + 1
if .....................:
processus.change_etat("Suspendu")
liste_attente.append(processus)
else:
processus.change_etat(...........)
return ordre_execution
Solution
1. Ordonnancement du tourniquet
a) Quantum = 1 cycle : chaque processus s’exécute pendant 1 cycle puis passe la main au suivant.
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 11 | 20 | 32 | 11 | 20 ✓ | 32 | 11 | 32 ✓ | 11 ✓ |
Suite complète : 11, 20, 32, 11, 20, 32, 11, 32, 11
b) Quantum = 2 cycles : chaque processus s’exécute pendant au plus 2 cycles.
| 1–2 | 3–4 | 5–6 | 7–8 | 9 |
| 11 | 20 ✓ | 32 | 11 ✓ | 32 ✓ |
Suite complète : 11, 11, 20, 20, 32, 32, 11, 11, 32
2. Implémentation Python
a) Création de la liste d’attente :
liste_attente = [Processus(11, 4), Processus(20, 2), Processus(32, 3)]
b) Les trois méthodes :
def execute_un_cycle(self):
self.reste_a_faire = self.reste_a_faire - 1
def change_etat(self, nouvel_etat):
self.etat = nouvel_etat
def est_termine(self):
return self.reste_a_faire == 0
c) Fonction tourniquet complétée :
def tourniquet(liste_attente, quantum):
ordre_execution = []
while liste_attente != []:
processus = liste_attente.pop(0)
processus.change_etat("En cours d'exécution")
compteur_tourniquet = 0
while compteur_tourniquet < quantum and not processus.est_termine():
ordre_execution.append(processus.pid)
processus.execute_un_cycle()
compteur_tourniquet = compteur_tourniquet + 1
if not processus.est_termine():
processus.change_etat("Suspendu")
liste_attente.append(processus)
else:
processus.change_etat("Terminé")
return ordre_execution
Explications :
- La boucle
whileinterne s’exécute tant que le compteur n’a pas atteint le quantum et que le processus n’est pas terminé. - À chaque itération, on ajoute le PID du processus à la liste d’exécution, on exécute un cycle et on incrémente le compteur.
- Après la boucle, si le processus n’est pas terminé, on le suspend et on le remet en bout de file. Sinon, on le marque comme terminé.