Ordonnancement des Systèmes d'Exploitation
Ordonnancement des Systèmes d'Exploitation
Module 4
Mondher Bouden
Maître assistant
Semestre 2
2023-2024
Ordonnancement
2
Ordonnancement
• Processus en concurrence pour l’exécution (état
prêt)
4
Quand S.E. doit ordonnancer?
• Créer un processus
• Processus se termine
• Processus bloque sur E/S, mutex, condition, …
• Processus libère mutex, signale sémaphore/condition
• Processus fait un yield
• Interruption :
– sur E/S qui était bloquée (e.g. lecture bloc disque)
• après l’interruption on repart :
– le processus interrompu ?
– le processus bloqué ?
– un processus de plus grande priorité?
– un processus qui a été le moins exécuté dernièrement?
5
Quand S.E. doit ordonnancer? (2)
• Si S.E. préemptif, quand quantum expire
– (~5-20 ms sur votre machine)
– être équitable entre processus
quantum
– ordinateur fonctionne même si
un processus fait une
boucle sans fin
6
Pas d’ordonnanceur parfait
• Dépend du type d’application
• Traitement par lot :
– non préemptif ou préemptif avec long quantum
– Windows server ~200 ms
– bonne capacité de traitement (débit)
• Interactifs :
– préemptif + rapide. Windows : quantum 5-20 ms
– compromis entre temps réponse et débit
• Temps réel
– QNX ajustable jusqu’à 40 ms
– temps de réponse et prédictibilité
7
Considérations
• Maximiser l’utilisation
– Chercher à maximiser l’utilisation de toutes les
composantes du système (disque, CPU, etc)
– si beaucoup Entrées/Sorties, redonner le contrôle
vite à ce processus (pour lancer la prochaine E/S)
requête E/S
processus A
bloqué
• Équitable
– chaque processus ait accès au même temps de
calcul, en moyenne
8
Algorithmes d’ordonnancement
• Il en existe plusieurs :
– Premier arrivé, premier servi
• FCFS: First-Come First-Served
– Job le plus court en premier
• SJB : Shortest Job First
– Temps restant le plus court se concentrer
– Tourniquet (Round Robin) sur eux
– Priorité
– O(1)
– CFS : Completely Fair Scheduler (Linux)
– Windows
– BFS : Brain Fuck Scheduler (Linux)
– et plein d’autres… 9
Premier arrivé, premier servi
• L’ordre d’exécution dépend de l’ordre d’arrivée
• Une seule file d’attente
• Pas de préemption
• Si un processus bloque, on exécute le prochain
• Quand le processus débloque, place à la fin de la
file
10
PREMIER ARRIVÉ, PREMIER SERVI
FCFS - First-Come, First-Served
P3 P2 P1 CPU
processus temps d'arrivée temps CPU
P1 0.0000 24
P2 0.0001 3
P3 0.0002 3
file
temps = 0 P3 P2 P1 CPU
P1
0 24 27 30
processus temps d'arrivée temps CPU
P1 0.0000 24
P2 0.0001 3
P3 0.0002 3
file
temps = 24 P3 P2 CPU
P1 P2
0 24 27 30
processus temps d'arrivée temps CPU
P1 0.0000 24
P2 0.0001 3
P3 0.0002 3
file
temps = 27 P3 CPU
P1 P2 P3
0 24 27 30
processus temps d'arrivée temps CPU
P1 0.0000 24
P2 0.0001 3
P3 0.0002 3
file
temps = 30 CPU
P1 P2 P3
0 24 27 30
P1 P2 P3
0 24 27 30
(quand il termine) (quand il commence)
temps de temps
processus
traitement d'attente
P1 24 0
P2 27 24
P3 30 27
total 81 51
moyenne(÷3) 27 17
change l’ordre d’arrivé : P2, P3 et P1
P2 P3 P1
0 3 6 30
(quand il termine) (quand il commence)
temps de temps CPU temps
processus
traitement (d'exécution) d'attente
P1 30 - 24 =6
P2 3 -3 =0
P3 6 -3 =3
total 39 - 30 =9
moyenne(÷3) 13 - 10 =3
(comparé à 27) (comparé à 17)
• Défaut
– pas optimal pour le temps moyen d’exécution
– punir les processus qui font beaucoup E/S
• si replacé à la fin de la file
– très mauvais temps de réponse
• traitement de texte ?
18
Job/processus le plus court en premier
• Suppose qu’on connait le temps d’exécution à
l’avance
(pas le cas en général)
• Exécuter le job le plus court en premier
• Sans préemption
– quand on lance un job, on ne peut pas le remplacer
par un autre job
19
PROCESSUS LE PLUS COURT EN PREMIER
SJF - Shortest Job First
plus court
temps = 0 P4 P3 P2 P1 CPU
P4
0 3 9 16 24
temps
processus temps d'arrivée temps CPU
P1 0 6
P2 0 8
P3 0 7
P4 0 3
plus court
temps = 0 P4 P3 P2 P1 CPU Ordonnanceur
examine pour
trouver le plus
P4 court
0 3 9 16 24
temps
processus temps d'arrivée temps CPU
P1 0 6
P2 0 8
P3 0 7
P4 0 3
plus court
temps = 0 P4 P3 P2 P1 CPU Ordonnanceur
examine pour
trouver le plus
P4 court
0 3 9 16 24
temps
processus temps d'arrivée temps CPU
P1 0 6
P2 0 8
P3 0 7
P4 0 3
plus court
temps = 3 P3 P2 P1 CPU Ordonnanceur
examine pour
trouver le plus
court
P4 P1
0 3 9 16 24
temps
processus temps d'arrivée temps CPU
P1 0 6
P2 0 8
P3 0 7
P4 0 3
plus court
temps = 9 P3 P2 CPU Ordonnanceur
examine pour
trouver le plus
P4 P1 P3 court
0 3 9 16 24
temps
processus temps d'arrivée temps CPU
P1 0 6
P2 0 8
P3 0 7
P4 0 3
plus court
temps = 16 P2 CPU Ordonnanceur
examine pour
trouver le plus
court
P4 P1 P3 P2
0 3 9 16 24 temps
processus temps d'arrivée temps CPU
P1 0 6
P2 0 8
P3 0 7
P4 0 3
plus court
temps = 16 P2 CPU Ordonnanceur
examine pour
trouver le plus
court
P4 P1 P3 P2
0 3 9 16 24 temps
plus court
temps = 3 P3 P2 P1 CPU
commence à exécuter P1…
P1
0 3 temps
P4 arrive!
processus temps d'arrivée temps CPU
P1 0 6
P2 0 8
P3 0 7
P4 3 3
plus court
temps = 3 P3 P2 P1 CPU
P1
0 3 temps
P4 arrive!
processus temps d'arrivée temps CPU
P1 0 6
P2 0 8
P3 0 7
P4 3 3
temps = 3
P4 P3 P2 P1 CPU
?
P1
0 3 temps
La sélection du prochain processus se fait seulement à la
fin de l'exécution d'un processus : pas de préemption
processus temps d'arrivée temps CPU
P1 0 6
P2 0 8
P3 0 7
P4 3 3
temps = 3 Ordonnanceur
P4 P3 P2 P1 CPU
examine pour
trouver le plus
P1 court
0 6 temps
plus court
temps = 6 P4 P3 P2 CPU Ordonnanceur
examine pour
trouver le plus
P1 P4 court
0 6 9 temps
processus temps d'arrivée temps CPU
P1 0 6
P2 0 8
P3 0 7
P4 3 3
plus court
temps = 9 P3 P2 CPU Ordonnanceur
examine pour
trouver le plus
P1 P4 P3 court
0 6 9 16
temps
processus temps d'arrivée temps CPU
P1 0 6
P2 0 8
P3 0 7
P4 3 3
plus court
temps = 16 P2 CPU Ordonnanceur
examine pour
trouver le plus
P1 P4 P3 P2 court
0 6 9 16 24 temps
PROCESSUS LE PLUS COURT EN PREMIER
SJF - Shortest Job First
est l'algorithme optimum
les temps d'exécution sont connus
sans préemption
P1 P2
temps d'attente
P2 P1
temps d'attente
réduction
Temps restant le plus court
• Version préemptive du job le plus court
• Va exécuter un nouveau processus si plus court
que le temps restant du processus actuel
• Risques de famine pour les tâches très longues
39
TEMPS RESTANT LE PLUS COURT (EN PREMIER)
SRT - Shortest Remaining Time ( First )
avec préemption
processus temps d'arrivée temps CPU
P1 0 8
P2 1 4
P3 2 9
P4 3 5
plus court
P4 P3 P2 P1 CPU
processus temps d'arrivée temps CPU temps restant
P1 0 8 8
P2 1 4
P3 2 9
P4 3 5
plus court
temps = 0 P1 CPU
P1
01 5 10 20 26
processus temps d'arrivée temps CPU temps restant
P1 0 8 -1 = 7
P2 1 4 4
P3 2 9
P4 3 5
plus court
temps = 1 P2 P1 CPU
P1 P2
01 2 5 10 20 26
processus temps d'arrivée temps CPU temps restant
P1 0 8 -1 = 7
P2 1 4 -1 = 3
P3 2 9 9
P4 3 5
plus court
temps = 2 P3 P2 P1 CPU
P1 P2
01 3 5 10 20 26
processus temps d'arrivée temps CPU temps restant
P1 0 8 -1 = 7
P2 1 4 -2 = 2
P3 2 9 9
P4 3 5 5
plus court
temps = 3 P4 P3 P2 P1 CPU
P1 P2
01 3 5 10 20 26
processus temps d'arrivée temps CPU temps restant
P1 0 8 -1 = 7
P2 1 4 -4 = 0
P3 2 9 9
P4 3 5 5
plus court
temps = 5 P4 P3 P1 CPU
P1 P2 P4
01 3 5 10 20 26
plus court
temps = 10 P3 P1 CPU
P1 P2 P4 P1
01 5 10 17 26
processus temps d'arrivée temps CPU temps restant
P1 0 8 -8 = 0
P2 1 4 -4 = 0
P3 2 9 9
P4 3 5 -5 = 0
plus court
temps = 17
P3 CPU
P1 P2 P4 P1 P3
01 5 10 17 26
Tourniquet (round robin)
• Très utilisé car :
– simple
– relativement équitable
– sert de base pour d’autres algorithmes
• Préemptif :
– processus reçoit un quanta de temps (e.g. 20 ms)
– s’exécute pendant le quanta, puis interruption sur horloge
• préemption
– s’il pourrait continuer à s’exécuter, l’ordonnanceur le place à la
fin de la file
– ordonnanceur prend prochain processus dans la file
48
Taille du quanta?
1 ms 20-50 ms 500 ms
•perte temps •mauvais temps de
changement processus réponse
49
ROUND ROBIN OU TOURNIQUET
pour système à temps partagé ou interactif
retourne à la fin de la
file après un quantum
processus temps d'arrivée temps CPU temps restant
P1 0 20 20
P2 0 3 3
P3 0 7 7
quantum = 4 ut
P3 P2 P1 CPU
P1
0 4 10 20 30
processus temps d'arrivée temps CPU temps restant
P1 0 20 16
P2 0 3 3
P3 0 7 7
quantum = 4 ut
P3 P2 P1 CPU
P1
0 4 10 20 30
processus temps d'arrivée temps CPU temps restant
P1 0 20 16
P2 0 3 3
P3 0 7 7
quantum = 4 ut
P1 P3 P2 CPU
P1
0 4 10 20 30
processus temps d'arrivée temps CPU temps restant
P1 0 20 16
P2 0 3 3
P3 0 7 7
quantum = 4 ut
P1 P3 P2 CPU
P1 P2
0 4 7 10 20 30
processus temps d'arrivée temps CPU temps restant
P1 0 20 16
P2 0 3 0
P3 0 7 7
quantum = 4 ut
P1 P3 X CPU
fin
P1 P2
0 4 7 10 20 30
processus temps d'arrivée temps CPU temps restant
P1 0 20 16
P2 0 3 0
P3 0 7 7
quantum = 4 ut
P1 P3 CPU
P1 P2 P3
0 4 7 11 20 30
processus temps d'arrivée temps CPU temps restant
P1 0 20 16
P2 0 3 0
P3 0 7 3
quantum = 4 ut
P3 P1 CPU
P1 P2 P3
0 4 7 11 20 30
processus temps d'arrivée temps CPU temps restant
P1 0 20 16
P2 0 3 0
P3 0 7 3
quantum = 4 ut
P3 P1 CPU
P1 P2 P3 P1
0 4 7 11 15 20 30
processus temps d'arrivée temps CPU temps restant
P1 0 20 12
P2 0 3 0
P3 0 7 3
quantum = 4 ut
P1 P3 CPU
P1 P2 P3 P1
0 4 7 11 15 20 30
processus temps d'arrivée temps CPU temps restant
P1 0 20 12
P2 0 3 0
P3 0 7 3
quantum = 4 ut
P1 P3 CPU
P1 P2 P3 P1 P3
0 4 7 11 15 18 30
processus temps d'arrivée temps CPU temps restant
P1 0 20 12
P2 0 3 0
P3 0 7 0
quantum = 4 ut
P1 X CPU
fin
P1 P2 P3 P1 P3
0 4 7 11 15 18 30
processus temps d'arrivée temps CPU temps restant
P1 0 20 8
P2 0 3 0
P3 0 7 0
quantum = 4 ut
P1 CPU
P1 P2 P3 P1 P3 P1
0 4 7 11 15 18 22 30
processus temps d'arrivée temps CPU temps restant
P1 0 20 4
P2 0 3 0
P3 0 7 0
quantum = 4 ut
P1 CPU
P1 P2 P3 P1 P3 P1 P1
0 4 7 11 15 18 22 26 30
processus temps d'arrivée temps CPU temps restant
P1 0 20 0
P2 0 3 0
P3 0 7 0
quantum = 4 ut
P1 CPU
P1 P2 P3 P1 P3 P1 P1 P1
0 4 7 11 15 18 22 26 30
processus temps d'arrivée temps CPU temps restant
P1 0 20 0
P2 0 3 0
P3 0 7 0
quantum = 4 ut
P1 CPU total : 30
P1 P2 P3 P1 P3 P1 P1 P1
0 4 7 11 15 18 22 26 30
P1 P2 P3 P1 P3 P1 P1 P1
0 4 7 11 15 18 22 26 30
(quand il termine)
temps de temps CPU temps
processus
traitement (d'exécution) d'attente
P1 30 - 20 = 10
P2 7 -3 =4
P3 18 -7 = 11
total 55 - 30 = 25
moyenne(÷3) 18.33 = 8.33
Exemple question tourniquet
• 5 Jobs qui arrivent en même temps. Trouver quand chaque job se
termine (approx.) avec tourniquet, quantum ~10 ms. Négliger le
temps pour changement de contexte.
Dernier job doit terminer à 10+6+2+4+8 = 30
Job Temps A
traitement B
(min) C
A 10 D
E
B 6
# job qui tournent
5
C 2 4
D 4 3
E 8 2
67
10 20 30
Priorités
• Concept clé des S.E.
• Pour pouvoir choisir quel thread/processus est
plus « important »
– vous « suggérez » au S.E.
• Affecter
– le temps de réponse
– le % de CPU alloué à chaque processus/thread
68
Pourquoi priorités
• Toutes les tâches ne sont pas égales
– défragmenter disque dur vs. jeu vidéo en ligne
– vérifier nouveau courrier vs. traitement de texte
• Ajuster le comportement du timing
– bouger un curseur sur l’écran
– déplacer fenêtre
– son, vidéo, animations
• Encore plus critique pour temps réel
– contraintes de temps sont importantes
69
Réaliser avec plusieurs files
• Une file par priorité
70
Ordonnanceur Linux O(1)
71
Ordonnanceur Linux
• Basé sur les threads et non pas processus
72
Threads
• Avant : 1 processus = 1 fil d’exécution
• Parfois besoin de plusieurs fils d’exécutions :
– plusieurs activités en même temps
– activités avec grands temps d’attentes
• disque, clavier, port sériel, etc.
• Va vouloir ajouter d’autres fils d’exécutions dans
un processus : threads
• Au démarrage, un processus n’a qu’un thread
73
Threads
• Un peu comme si vous aviez plusieurs main()
dans votre programme en C/C++
74
Utilisation des threads
• Chaque thread va avoir son contexte de processeur
– Program Counter (EIP) par thread, copie des registres CPU
– « mini-processus » → light weight process (LWP)
– tourne indépendamment des autres threads
• Thread partage l’espace d’adressage + ressources du
processus : pas de protection mémoire entre threads
1 2 3
75
États d’un thread
• Comme un processus, un thread peut être
– bloqué
– en cours d’exécution
– en attente d’exécution
76
Élements des processus et threads
Éléments par processus Éléments par thread
Espace d’adressage (mém.) Compteur ordinal (EIP)
Variables Globales Registres (EAX, EBX, …)
Fichiers ouverts Pile
Processus enfant (si applicable) État
Alertes en attentes
Signaux et gestionnaires de
signaux
77
Utilisation des threads
• Beaucoup plus rapide à créer qu’un processus,
car moins de ressources associées (tableau de
données beaucoup plus petit)
• Utile quand on a une
partie CPU intensive,
et une partie bloquant
sur E/S (disque)
• Serveur web
(pages html sur disque)
78
Utilisation des threads
• Traitement de texte :
– un thread qui bloque pour lire le clavier/souris
– un thread pour la mise en page et l’affichage
– un thread pour écrire sur le disque
79
Utilisation des threads
• Multi-cœurs : distribuer une tâche en parallèle
transcodage d’un fichier mp3
80
Processus vs threads
Processus Threads
Indépendants Sous-ensemble d’un processus
Beaucoup d’information d’état Peu d’information d’état
Espaces d’adressage séparés Espace d’adressage partagé
Intercommunication via S.E. Intercommunication via mémoire
81
Ordonnanceur Linux
• Beaucoup d’évolution au fil du temps
– par exemple, avec multi-processeurs
Kernel 2.4 Kernel 2.6
1 file
d’exécution n files ...
d’exécution
goulot
d’étranglement
82
O(1)
File d’exécution
• 1 File d’exécution par CPU
• 1 file expirée, 1 file active
• 140 niveaux de priorités voir un peu
• Petit numéro = grande priorité plus loin…
• Quand une tâche expire, file expirée file active
elle passe de active → CPU-X CPU-X
expirée
Priorité
• Quand toutes les tâches temps réel
sont expirées, échanger
les files : epoch
tâches
(inverse les pointeurs des files) utilisateur
83
O(1)
Ordonnanceurs Linux 2.6
• Trois policy :
– SCHED_FIFO
• temps réel, pas de préemption→ pas de quantum
– SCHED_RR
• temps réel, préemption → timeslice (quantum différent en
fonction de la priorité)
– SCHED_NORMAL
• pour les thread normaux
• donc, vos processus et threads
84
O(1)
SCHED_FIFO
• FIFO : First In First Out
– Premier arrivé, premier servi
– Sans préemption, sauf si nouveau plus haute priorité
arrive
– Processus doit avoir les droits superuser
File
priorité
+ élevée
- élevée
85
O(1)
SCHED_FIFO
• Préemption si nouveau processus + haute priorité
priorité File
+ élevée
- élevée
86
O(1)
SCHED_FIFO
• Préemption si nouveau processus + haute priorité
- élevée
87
O(1)
SCHED_FIFO
• Préemption si nouveau processus + haute priorité
- élevée
88
O(1)
SCHED_FIFO
• Préemption si nouveau processus + haute priorité
- élevée
89
O(1)
SCHED_RR
• Peuvent être préemptée par SCHED_FIFO
• Possèdent un quantum
• Tourniquet par niveau de priorité
• Processus doit avoir les droits superuser
priorité File
+ élevée
- élevée
Exécution : 90
O(1)
SCHED_FIFO et SCHED_RR:temps réel
91
O(1)
SCHED_NORMAL : priorité statique
• Vous attribuez à chaque processus un niveau de
priorité statique Pstatique
• Varie entre -20 et 19 (40 niveaux)
(encore ici, petit veut dire haute priorité)
élevée basse
• Par défaut, Pstatique =0
• Changer Pstatique avec nice ou setpriority()
– valeur positive → réduire priorité
• pour des longues simulations à tourner
– valeur négative → augmenter priorité
• besoin d’être superuser
92
O(1)
SCHED_NORMAL : priorité dynamique
• Pdynamique est ajustée automatiquement par le S.E.
• Basée sur des heuristiques (algorithmes approximatifs)
• « Récompenser » processus E/S [-1 … -5]
(valeur négative
(I/O bound) hausse la priorité)
bloqué
(CPU bound)
• « Punir » processus gourmand CPU [+1 +5]
93
O(1)
SCHED_NORMAL : priorité dynamique
-5 <= Pdynamique <= 5
• Calculé à partir du temps qu’un thread passe
bloqué
– plus il bloque longtemps, plus Pdynamique augmente
• Ne s’applique pas aux temps réel
– SCHED_FIFO
– SCHED_RR
94
O(1)
SCHED_NORMAL : Niveaux de priorités
• Psched = 120 + Pstatique + Pdynamique
[-20 … 19] [-5 +5]
• Doit rester dans la plage 100 à 139
SCHED_FIFO
SCHED_RR SCHED_NORMAL
Priorité Priorité
+ élevée + faible
95
O(1)
SCHED_NORMAL : timeslice
Les processus hautes priorités statiques vont recevoir
plus de temps de calcul : timeslice
Priorité NICE Timeslice
statique
Haute priorité 100 -20 800 ms
110 -10 600 ms
120 0 100 ms
130 +10 50 ms
Basse priorité 139 +19 5 ms
(besoin superuser)
Timeslice
96
O(1)
SCHED_NORMAL : algorithme
• En commençant par priorité 100
• Pour chaque niveau P :
– on exécute chaque processus pendant timeslice
– si le processus ne termine pas, préempte et transfert
dans la file expirée, et exécute le suivant dans P
– si P est vide, on fait P = P+1 (descend)
– si P est à 140, la file active est vide :
• interverti la file vide avec la file expirée
• P = 100
• et l’on recommence…
97
O(1)
SCHED_NORMAL : Exécution timeslice
• Exemple
timeslice : 100 → 800 ms
120 → 100 ms
139 → 5 ms
140 ms 43 ms
niveau de
priorité
143 ms
100 ms
100