Introduction
Avant même la mémoire centrale, le(s) processeur(s) constitue(nt) une ressource hautement critique que, dans un contexte multitâche, un S.E. doit attribuer à chaque processus de façon "optimale".
Cette activité est appelée ordonnancement (en anglais scheduling) et est réalisée par un ordonnanceur (en anglais scheduler), qui est une partie du S.E., selon des algorithmes d'ordonnancement.
Objectifs de l'ordonnancement
Pour rendre un S.E. efficace et satisfaisant pour l'utilisateur, l'ordonnanceur doit essayer d'atteindre les objectifs suivants:
-
être le plus équitable possible vis-à-vis des processus, c'est-à-dire ne pas favoriser outrancièrement certains processus et imposer à d'autres des attentes trop longues,
-
maximiser le débit global de l'ordinateur à une échelle macroscopique, c'est-à-dire le nombre moyen de travaux traités par unité de temps (l'heure par ex.),
-
avoir un comportement le plus prévisible possible, c'est-à-dire exécutant à coût et à durée totale à peu près constante un processus donné, quelle que soit la charge du système,
-
permettre un maximum d'utilisateurs interactifs sans augmenter de façon inacceptable les temps de réponse (de l'ordre de quelques secondes),
-
minimiser l'overhead.
En réalité, il suffira de le maintenir dans des limites raisonnables pour que le système ne s'écroule pas (en anglais : trashing),
-
assurer une utilisation maximale des ressources : le processeur, la mémoire, les mémoires secondaires,
-
gérer convenablement les priorités : un processus de haute priorité doit être satisfait avant un processus de priorité basse).
Tous ces objectifs déterminent les algorithmes d'ordonnancement qui prennent en compte différentes caractéristiques des processus qu'ils ont à gérer et de leur comportement :
-
en favorisant les processus peu gourmands en ressources,
-
en augmentant au cours du temps la priorité des processus en attente d'une ressource (processeur, mémoire principale ou secondaire, etc.) jusqu'à ce qu'ils soient choisis,
-
en attribuant des priorités qui prennent en compte l'urgence du traitement, (un processus temps-réel ne peut attendre une réponse au delà d'un certain délai),
-
en favorisant (pas trop!!) des processus interactifs au dépend de processus en tâches de fond (en batch), dont l'utilisateur n'est certainement pas en ligne,
-
en favorisant les processus qui ont un comportement "satisfaisant": peu de défauts de pages par exemple,
-
en limitant la durée qu'un processus peut occuper le CPU consécutivement (quantum de temps), pour éviter qu'un processus ne s'approprie le processeur:w
indéfiniment,
-
en limitant le nombre de processus activables (et donc en interdisant le lancement de nouveaux processus) en cas d'engorgement.
Ordonnancement préemptif/non préemptif
On dit qu'un ordonnanceur est non préemptif lorsqu'après avoir donné le contrôle (le processeur) à un processus, il ne peut le lui reprendre.
C'est alors au processus lui-même d'abandonner le processeur.
Dans le cas contraire, l'ordonnanceur est dit préemptif ou avec réquisition.
Un mode préemptif est indispensable dans le cas du temps réel : un traitement d'extrème urgence ne peut attendre le bon vouloir d'un processus qui ne veut pas abandonner son activité.
Le temps partagé interactif devrait lui aussi être en mode préemptif afin d'assurer à chacun un temps de réponse raisonnable.
Cependant, ce mode peut être coûteux car il peut générer une rotation plus grande des processus actifs, augmentant d'une part l'overhead par les multiples commutations de contexte qu'il provoque, d'autre part le nombre de processus devant être présents physiquement en mémoire, ce qui nécessite des capacités de stockage primaire accrues.
Le "timer"
Toute machine possède une horloge de fréquence donnée et fixe.
A ce dispositif hardware peut en être superposé un autre qui déclenche une interruption à un intervalle de temps déterminé (par exemple 50 à 60 fois par seconde).
A chaque interruption, le système peut reprendre le contrôle et relancer le processus de son choix.
Ce mécanisme permet de mettre en place le quantum de temps.
Priorité statique/dynamique
La priorité d'un processus peut être fixée définitivement au moment du lancement du processus, ou au contraire être calculée au fur et à mesure des besoins, par exemple à chaque top d'horloge.
Bien entendu, la première méthode est beaucoup plus facile à mettre en oeuvre mais la seconde est beaucoup plus souple.
En effet, l'ordonnanceur ne connaît pas quel sera le comportement du processus avant qu'il commence.
La priorité initiale est tout-à-fait arbitraire.
Au contraire, dans le second cas, l'ordonnanceur calcule la priorité courante en fonction du comportement passé du processus.
Dans certains systèmes, la priorité peut être achetée par un utilisateur.
Dernière mise à jour : 06/07/2001