SETSCHEDULER(2) Manuel du programmeur Linux SETSCHEDULER(2)
NOM
sched_setscheduler, sched_getscheduler - Lire / fixer la
politique d'ordonnancement et ses paramètres.
SYNOPSIS
#include <sched.h>
int sched_setscheduler(pid_t pid, int policy, const struct
sched_param *p);
int sched_getscheduler(pid_t pid);
struct sched_param {
...
int sched_priority;
...
};
DESCRIPTION
sched_setscheduler fixe à la fois la politique d'ordon
nancement et ses paramètres pour le processus identifié
par pid. Si pid vaut zéro, la politique du processus en
cours sera fixée. L'interprétation du paramètre p dépend
de la politique employée. Actuellement il y a trois poli
tiques proposées par Linux : SCHED_FIFO, SCHED_RR, et
SCHED_OTHER. Leurs sémantiques respectives sont décrites
ci-dessous.
sched_getscheduler lit la politique d'ordonnancement et
ses paramètres pour le processus identifié par pid. Si
pid vaut zéro, la politique du processus en cours sera
récupérée.
Politiques d'ordonnancement
L'ordonnanceur est la partie du noyau qui décide quel pro
cessus prêt va être exécuté ensuite. L'ordonnanceur de
Linux propose trois politiques différentes, une pour les
processus classiques, et deux pour les applications à
vocation temps-réel.
Une valeur de priorité statique sched_priority est
assignée à chaque processus, et ne peut être modifiée que
par l'intermédiaire d'appels systèmes. Conceptuellement,
l'ordonnanceur dispose d'une liste de tous les processus
prêts pour chaque valeur possible de sched_priority
(sched_priority est dans l'intervalle 0 à 99).
Afin de déterminer quel processus doit s'exécuter ensuite,
l'ordonnanceur de Linux recherche la liste non-vide de
plus haute priorité statique et prend le processus en tête
de cette liste. La politique d'ordonnancement détermine
Linux 8 Avril 1997 1
SETSCHEDULER(2) Manuel du programmeur Linux SETSCHEDULER(2)
pour chaque processus l'emplacement où il sera inséré dans
la liste contenant les processus de même priorite sta
tique, et comment il se déplacera dans cette liste.
SCHED_OTHER est l'ordonnancement universel temps-partagé
par défaut, utilisé par la plupart des processus.
SCHED_FIFO et SCHED_RR sont prévus pour des applications
temps-réel qui nécessitent un contrôle précis de la sélec
tion des processus prêts.
Les processus ordonnancés avec SCHED_OTHER doivent avoir
une priorité statique de 0, ceux ordonnancés par
SCHED_FIFO ou SCHED_RR peuvent avoir une priorité statique
dans l'intervalle 1 à 99. Seuls les processus disposant
de privilèges Super-User peuvent obtenir une priorité sta
tique supérieure a 0 afin d'être ordonnancé par SCHED_FIFO
ou SCHED_RR.
Les appels systèmes sched_get_priority_min et
sched_get_priority_max permettent de déterminer l'inter
valle de priorités valides de manière portable sur les
systèmes conformes à la norme POSIX.1b.
Tout ordonnancement est préemptif : Si un processus avec
une priorité statique plus élevée devient prêt, le proces
sus en cours est interrompu et retourne dans sa liste
d'attente. La politique d'ordonnancement détermine simple
ment l'ordre utilisé dans une liste de processus prêts
avec des priorités statiques égales.
SCHED_FIFO: Ordonnancement First In-First out (premier arrivé,
premier servi)
SCHED_FIFO ne peut être utilisé qu'avec des priorités sta
tiques supérieures à 0, ce qui signifie que dès qu'un pro
cessus SCHED_FIFO devient prêt, un processus normal
SCHED_OTHER en cours d'exécution sera interrompu.
SCHED_FIFO est un ordonnancement simple à base de tranches
de temps. Pour les processus ordonnancés par SCHED_FIFO
les règles suivantes sont appliquées :
Un processus SCHED_FIFO qui a été préempté par un autre
processus de priorité supérieure restera en tête de sa
liste et reprendra son exécution dès que tous les proces
sus de priorités supérieures sont à nouveau bloqués.
Quand un processus SCHED_FIFO devient prêt, il est inséré
à la fin de sa liste.
Un appel système sched_setscheduler ou sched_setparam
placera le processus SCHED_FIFO identifié par pid à la fin
de sa liste s'il est prêt.
Linux 8 Avril 1997 2
SETSCHEDULER(2) Manuel du programmeur Linux SETSCHEDULER(2)
Un processus appelant sched_yield sera placé à la fin de
sa liste.
Aucun autre évènement ne modifiera l'ordre des listes de
priorités statiques égales avec SCHED_FIFO.
Un processus SCHED_FIFO s'exécute jusqu'à ce qu'il soit
bloqué par une opération d'entrée/sortie, qu'il soit
préempté par un processus de priorité supérieure, ou qu'il
appelle sched_yield.
SCHED_RR: Ordonnancement Round Robin
SCHED_RR est une amélioration simple de la politique
SCHED_FIFO. Tout ce qui est décrit pour SCHED_FIFO
s'applique aussi à SCHED_RR, sauf que chaque processus ne
dispose que d'une tranche temporelle limitée pour son
exécution. Si un processus sous politique SCHED_RR s'est
exécuté depuis une durée supérieure ou égale à la tranche
temporelle (time quantum), il sera placé à la fin de la
liste de sa priorité.
Un processus sous SCHED_RR qui a été préempté par un pro
cessus de priorité supérieure terminera sa tranche de
temps lorsqu'il reprendra son exécution. la longueur du
time quantum peut être lue avec sched_rr_get_interval.
SCHED_OTHER: Ordonnancement temps-partagé par défaut
La politique SCHED_OTHER ne peut être utilisée qu'avec des
priorités statiques à 0. C'est la politique standard de
l'ordonnanceur temps partagé de Linux, et est conçue pour
tous les processus ne réclamant pas de fonctionnalites
temps-réel.
Le processus à exécuter est choisi dans la liste des pro
cessus de priorités statiques nulles, en utilisant une
priorité dynamique qui ne s'applique que dans cette liste.
La priorite dynamique est basée sur la valeur de "gentil
lesse" du processus (fixée avec les appels systèmes nice
ou setpriority) et est incrémentée à chaque time quantum
où le processus est prêt mais non sélectionné par l'ordon
nanceur. Ceci garantit une progression équitable de tous
les processus SCHED_OTHER.
Temps de réponse
Un processus de haute priorité bloqué en attente
d'entrées/sorties est affecté d'un certain temps de
réponse avant d'être sélectionné à nouveau. Le concepteur
d'un gestionnaire de périphérique peut réduire grandement
Linux 8 Avril 1997 3
SETSCHEDULER(2) Manuel du programmeur Linux SETSCHEDULER(2)
ce temps de réponse en utilisant un gestionnaire d'inter
ruptions lentes comme décrit dans request_irq(9).
Divers
Les processus fils héritent de la politique d'ordonnance
ment et des paramètres associés lors d'un fork.
Le verrouillage de pages en mémoire est généralement
nécessaire pour les processus temps réel afin d'éviter les
délais de pagination. Ceci peut être effectué avec
mlock(2) ou mlockall(2).
Comme une boucle sans fin non bloquante dans un processus
ordonnancé sous une politique SCHED_FIFO ou SCHED_RR blo
quera indéfiniment tous les processus avec une priorité
plus faible, le développeur d'applications temps-réel
devrait toujours conserver sur une console un schell
ordonnancé avec une priorité supérieure à celle de
l'application testée.
Ceci permettra un kill((1) d'urgence des applications
testées qui ne se bloquent pas ou qui ne se terminent pas
comme prévu. Comme les processus sous SCHED_FIFO et
SCHED_RR peuvent préempter les autres processus normaux
pour toujours, seuls les processus Super-User ont le droit
d'activer ces politiques sous Linux.
Les systèmes POSIX sur lesquels sched_setscheduler et
sched_getscheduler sont disponibles définissent
_POSIX_PRIORITY_SCHEDULING dans <unistd.h>.
VALEUR RENVOYÉE
sched_setscheduler renvoie 0 s'il réussit sched_getsched
uler renvoie la politique pour le processus s'il réussit.
En cas d'échec, -1 est renvoyé et errno contient le code
d'erreur.
ERREURS
ESRCH Le processus numéro pid n'existe pas.
EPERM Le processus appelant n'a pas les privilèges
nécessaires. Seul les processus Super-User peuvent
activer les politiques SCHED_FIFO et SCHED_RR. Le
processus appelant sched_setscheduler doit avoir
un UID effectif égal à celui du processus pid, ou
être Super-User.
EINVAL La valeur de politique d'ordonnancement policy
n'existe pas, ou le paramètre p n'a pas de signi
fication pour la politique policy.
Linux 8 Avril 1997 4
SETSCHEDULER(2) Manuel du programmeur Linux SETSCHEDULER(2)
CONFORMITÉ
POSIX.1b (POSIX.4)
BUGS
Sous Linux 1.3.81,SCHED_RR n'a pas ete testé totalement,
et ne se comporte peut être pas exactement comme décrit
ci-dessus.
VOIR AUSSI
sched_setparam(2), sched_getparam(2), sched_yield(2),
sched_get_priority_max(2), sched_get_priority_min(2),
nice(2), setpriority(2), getpriority(2), mlockall(2),
munlockall(2), mlock(2), munlock(2).
Programming for the real world - POSIX.4 by Bill O.
Gallmeister, O'Reilly & Associates, Inc., ISBN
1-56592-074-0
IEEE Std 1003.1b-1993 (POSIX.1b standard)
ISO/IEC 9945-1:1996 - C'est une nouvelle révision 1996 de
POSIX.1 qui regroupe en un seul standard les normes
POSIX.1(1990), POSIX.1b(1993), POSIX.1c(1995), et
POSIX.1i(1995).
TRADUCTION
Christophe Blaess, 1997.
Linux 8 Avril 1997 5