SETSCHEDULER(2)

NOM
sched_setscheduler, sched_getscheduler - Lire / fixer la politique d'ordonnancement et ses parametres.

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 a la fois la politique d'ordonnancement et ses parametres pour le processus identifie par pid. Si pid vaut zero, la politique du processus en cours sera fixee. L'interpretation du parametre p depend de la politique employee. Actuellement il y a trois politiques proposees par Linux : SCHED_FIFO, SCHED_RR, et SCHED_OTHER. Leurs semantiques respectives sont decrites ci-dessous. sched_getscheduler lit la politique d'ordonnancement et ses parametres pour le processus identifie par pid. Si pid vaut zero, la politique du processus en cours sera recuperee.

  Politiques d'ordonnancement
L'ordonnanceur est la partie du noyau qui decide quel processus pret va etre execute ensuite. L'ordonnanceur de Linux propose trois politiques differentes, une pour les processus classiques, et deux pour les applications a vocation temps-reel. Une valeur de priorite statique sched_priority est assignee a chaque processus, et ne peut etre modifiee que par l'intermediaire d'appels systemes. Conceptuellement, l'ordonnanceur dispose d'une liste de tous les processus prets pour chaque valeur possible de sched_priority (sched_priority est dans l'intervalle 0 a 99). Afin de determiner quel processus doit s'executer ensuite, l'ordonnanceur de Linux recherche la liste non-vide de plus haute priorite statique et prend le processus en tete de cette liste. La politique d'ordonnancement determine pour chaque processus l'emplacement ou il sera insere dans la liste contenant les processus de meme priorite statique, et comment il se deplacera dans cette liste. SCHED_OTHER est l'ordonnancement universel temps-partage par defaut, utilise par la plupart des processus. SCHED_FIFO et SCHED_RR sont prevus pour des applications temps-reel qui necessitent un controle precis de la selection des processus prets. Les processus ordonnances avec SCHED_OTHER doivent avoir une priorite statique de 0, ceux ordonnances par SCHED_FIFO ou SCHED_RR peuvent avoir une priorite statique dans l'intervalle 1 a 99. Seuls les processus disposant de privileges Super-User peuvent obtenir une priorite statique superieure a 0 afin d'etre ordonnance par SCHED_FIFO ou SCHED_RR. les appels systemes sched_get_priority_min et sched_get_priority_max permettent de determiner l'intervalle de priorites valides de maniere portable sur les systemes conformes a la norme POSIX.1b. Tout ordonnancement est preemptif : Si un processus avec une priorite statique plus elevee devient pret, le processus en cours est interrompu et retourne dans sa liste d'attente. La politique d'ordonnancement determine simplement l'ordre utilise dans une liste de processus prets avec des priorites statiques egales.

  SCHED_FIFO: Ordonnancement First In-First out (premier arrive, premier servi)
SCHED_FIFO ne peut etre utilise qu'avec des priorites statiques superieures a 0, ce qui signifie que des qu'un processus SCHED_FIFO devient pret, un processus normal SCHED_OTHER en cours d'execution sera interrompu. SCHED_FIFO est un ordonnancement simple a base de tranches de temps. Pour les processus ordonnances par SCHED_FIFO les regles suivantes sont appliquees : Un processus SCHED_FIFO qui a ete preempte par un autre processus de priorite superieure restera en tete de sa liste et reprendra son execution des que tous les processus de priorites superieures sont a nouveau bloques. Quand un processus SCHED_FIFO devient pret, il est insere a la fin de sa liste. Un appel systeme sched_setscheduler ou sched_setparam placera le processus SCHED_FIFO identifie par pid a la fin de sa liste s'il est pret. Un processus appelant sched_yield sera place a la fin de sa liste. Aucun autre evenement ne modifiera l'ordre des listes de priorites statiques egales avec SCHED_FIFO. Un processus SCHED_FIFO s'execute jusqu'a ce qu'il soit bloque par une operation d'entree/sortie, qu'il soit preempte par un processus de priorite superieure, ou qu'il appelle sched_yield.

  SCHED_RR: Ordonnancement Round Robin
SCHED_RR est une amelioration simple de la politique SCHED_FIFO. Tout ce qui est decrit pour SCHED_FIFO s'applique aussi a SCHED_RR, sauf que chaque processus ne dispose que d'une tranche temporelle limitee pour son execution. Si un processus sous politique SCHED_RR s'est execute depuis une duree superieure ou egale a la tranche temporelle (time quantum), il sera place a la fin de la liste de sa priorite. Un processus sous SCHED_RR qui a ete preempte par un processus de priorite superieure terminera sa tranche de temps lorsqu'il reprendra son execution. la longueur du time quantum peut etre lue avec sched_rr_get_interval.

  SCHED_OTHER: Ordonnancement temps-partage par defaut
La politique SCHED_OTHER ne peut etre utilisee qu'avec des priorites statiques a 0. C'est la politique standard de l'ordonnanceur temps partage de Linux, et est concue pour tous les processus ne reclamant pas de fonctionnalites temps-reel. Le processus a executer est choisi dans la liste des processus de priorites statiques nulles, en utilisant une priorite dynamique qui ne s'applique que dans cette liste. La priorite dynamique est basee sur la valeur de "gentillesse" du processus (fixee avec les appels systemes nice ou setpriority) et est incrementee a chaque time quantum ou le processus est pret mais non selectionne par l'ordonnanceur. Ceci garantit une progression equitable de tous les processus SCHED_OTHER.

  Temps de reponse
Un processus de haute priorite bloque en attente d'entrees/sorties est affecte d'un certain temps de reponse avant d'etre selectionne a nouveau. Le concepteur d'un gestionnaire de peripherique peut reduire grandement ce temps de reponse en utilisant un gestionnaire d'interruptions lentes comme decrit dans request_irq(9).

  Divers
Les processus fils heritent de la politique d'ordonnancement et des parametres associes lors d'un fork. Le verrouillage de pages en memoire est generalement necessaire pour les processus temps reel afin d'eviter les delais de pagination. Ceci peut etre effectue avec mlock(2) ou mlockall(2). Comme une boucle sans fin non bloquante dans un processus ordonnance sous une politique SCHED_FIFO ou SCHED_RR bloquera indefiniment tous les processus avec une priorite plus faible, le developpeur d'applications temps-reel devrait toujours conserver sur une console un schell ordonnance avec une priorite superieure a celle de l'application testee. Ceci permettra un kill((1) d'urgence des applications testees qui ne se bloquent pas ou qui ne se terminent pas comme prevu. Comme les processus sous SCHED_FIFO et SCHED_RR peuvent preempter les autres processus normaux pour toujours, seuls les processus Super-User ont le droit d'activer ces politiques sous Linux. Les systemes POSIX sur lesquels sched_setscheduler et sched_getscheduler sont disponibles definissent _POSIX_PRIORITY_SCHEDULING dans <unistd.h>.

VALEUR RENVOYEE
sched_setscheduler renvoie 0 s'il reussi sched_getscheduler renvoie la politique pour le processus s'il reussit. En cas d'echec, -1 est renvoye et errno contient le code d'erreur.

ERREURS

ESRCH
    Le processus numero pid n'existe pas.

EPERM
    Le processus appelant n'a pas les privileges necessaires. Seul les processus Super-User peuvent activer les politiques SCHED_FIFO et SCHED_RR. Le processus appelant sched_setscheduler doit avoir un UID effectif egal a celui du processus pid, ou etre Super-User.

EINVAL
    La valeur de politique d'ordonnancement policy n'existe pas, ou le parametre p n'a pas de signification pour la politique policy.

CONFORMITE
POSIX.1b (POSIX.4)

BUGS
Sous Linux 1.3.81,SCHED_RR n'a pas ete teste totalement, et ne se comporte peut etre pas exactement comme decrit 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 revision 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).