Man page - sched(7)

Packages contains this manual

Available languages:

en fr ja ru

Manual

sched

NOM
DESCRIPTION
Résumé des API
Politiques d’ordonnancement
SCHED_FIFO : Ordonnancement premier entré, premier sorti
SCHED_RR : ordonnancement tourniquet
SCHED_DEADLINE: ordonnancement sur échéances selon le modÚle des tùchessporadiques.
SCHED_OTHER : ordonnancement temps partagé par défaut
La valeur de politesse
SCHED_BATCH : ordonnancement de processus par lots
SCHED_IDLE : ordonnancement de tùches de trÚs faible priorité
RĂ©initialiser la politique d’ordonnancement pour les processus enfant
PrivilĂšges et limites de ressources
Limiter l’utilisation CPU des processus temps-rĂ©el et Ă  Ă©chĂ©ances.
Temps de réponse
Divers
FonctionnalitĂ© d’autogroupage
Valeur de politesse et ordonnancement de groupe
Fonctionnalités temps réel dans le noyau Linux principal
NOTES
VOIR AUSSI
TRADUCTION

NOM

sched - Aperçu de l’ordonnancement de CPU

DESCRIPTION

Depuis Linux 2.6.23, l’ordonnanceur par dĂ©faut est CFS (Completely Fair Scheduler – ordonnanceur complĂštement Ă©quitable). Il remplace l’ordonnanceur prĂ©cĂ©dent, « O(1) ».

Résumé des API

Linux fournit les appels systĂšme suivants pour contrĂŽler le comportement de l’ordonnancement du CPU, la politique et la prioritĂ© des processus (ou, plus prĂ©cisĂ©ment, des threads).
nice
(2)

Définir une nouvelle valeur de politesse pour le thread appelant et renvoyer cette nouvelle valeur.

getpriority (2)

Renvoyer la valeur de politesse d’un thread, d’un groupe de processus ou de l’ensemble des threads possĂ©dĂ©s par un utilisateur particulier.

setpriority (2)

DĂ©finir la valeur de politesse d’un thread, d’un groupe de processus ou de l’ensemble des threads possĂ©dĂ©s par un utilisateur particulier.

sched_setscheduler (2)

DĂ©finir la politique d’ordonnancement et les paramĂštres du thread indiquĂ©.

sched_getscheduler (2)

Renvoyer la politique d’ordonnancement du thread indiquĂ©.

sched_setparam (2)

DĂ©finir les paramĂštres d’ordonnancement du thread indiquĂ©.

sched_getparam (2)

RĂ©cupĂ©rer les paramĂštres d’ordonnancement du thread indiquĂ©.

sched_get_priority_max (2)

Renvoyer la prioritĂ© la plus haute disponible pour la politique d’ordonnancement indiquĂ©e.

sched_get_priority_min (2)

Renvoyer la prioritĂ© la plus basse disponible pour la politique d’ordonnancement indiquĂ©e.

sched_rr_get_interval (2)

Récupérer le quantum de temps alloué utilisé pour les threads ordonnancés par une politique de type répartition par tourniquet (round robin).

sched_yield (2)

Provoquer la libĂ©ration du CPU par l’appelant afin de permettre l’exĂ©cution d’autres threads.

sched_setaffinity (2)

DĂ©finir le masque d’affinitĂ© CPU du thread indiquĂ© (propre Ă  Linux).

sched_getaffinity (2)

RĂ©cupĂ©rer le masque d’affinitĂ© CPU du thread indiquĂ© (propre Ă  Linux).

sched_setattr (2)

DĂ©finir la politique d’ordonnancement et les paramĂštres du thread indiquĂ©. Cet appel systĂšme (propre Ă  Linux) fournit un sur-ensemble de la fonctionnalitĂ© de sched_setscheduler (2) et de sched_setparam (2).

sched_getattr (2)

RĂ©cupĂ©rer la politique d’ordonnancement et les paramĂštres du thread indiquĂ©. Cet appel systĂšme (propre Ă  Linux) fournit un sur-ensemble de la fonctionnalitĂ© de sched_getscheduler (2) et de sched_getparam (2).

Politiques d’ordonnancement

L’ordonnanceur est la partie du noyau qui dĂ©cide quel thread prĂȘt va ĂȘtre exĂ©cutĂ© ensuite. Chaque processus a une politique d’ordonnancement associĂ©e et une prioritĂ© d’ordonnancement statique , sched_priority . L’ordonnanceur prend ses dĂ©cisions en fonction de la politique d’ordonnancement et de la prioritĂ© statique de tous les threads du systĂšme.

Pour les threads ordonnancĂ©s sous l’une des politiques d’ordonnancement normales ( SCHED_OTHER , SCHED_IDLE , SCHED_BATCH ), sched_priority n’est pas utilisĂ©e dans les dĂ©cisions d’ordonnancement (et doit valoir 0).

Les processus ordonnancĂ©s sous l’une des politiques d’ordonnancement temps rĂ©el ( SCHED_FIFO , SCHED_RR ) ont une valeur sched_priority dans l’intervalle 1 (faible) à 99 (haute). (Comme les nombres l’impliquent, les threads temps rĂ©el ont toujours une prioritĂ© plus haute que les threads normaux.) Notez bien : POSIX.1 exige d’une implĂ©mentation qu’elle gĂšre seulement un minimum de 32 niveaux de prioritĂ© distincts pour les politiques temps rĂ©el et certains systĂšmes n’offrent que ce minimum. Les programmes portables doivent utiliser sched_get_priority_min (2) et sched_get_priority_max (2) pour connaĂźtre l’intervalle des prioritĂ©s gĂ©rĂ©es pour une politique particuliĂšre.

ThĂ©oriquement, l’ordonnanceur entretient une liste de tous les threads prĂȘts pour l’exĂ©cution pour chaque valeur possible de sched_priority . Afin de dĂ©terminer quel processus doit s’exĂ©cuter ensuite, l’ordonnanceur recherche la liste non vide de plus haute prioritĂ© statique et choisit le thread en tĂȘte de cette liste.

La politique d’ordonnancement d’un thread dĂ©termine l’emplacement oĂč il sera insĂ©rĂ© dans la liste contenant les threads de mĂȘme prioritĂ© statique et comment il se dĂ©placera dans cette liste.

Tout ordonnancement est prĂ©emptif : si un thread avec une prioritĂ© statique plus Ă©levĂ©e devient prĂȘt, le thread actuellement en cours d’exĂ©cution est interrompu et retourne dans la liste d’attente avec son niveau de prioritĂ© statique. La politique d’ordonnancement dĂ©termine l’ordre utilisĂ© seulement dans la liste de threads prĂȘts avec des prioritĂ©s statiques Ă©gales.

SCHED_FIFO : Ordonnancement premier entré, premier sorti

SCHED_FIFO ne peut ĂȘtre utilisĂ©e qu’avec des prioritĂ©s statiques supĂ©rieures à 0, ce qui signifie que dĂšs qu’un thread SCHED_FIFO devient prĂȘt, il prĂ©empte n’importe quel thread SCHED_OTHER , SCHED_BATCH ou SCHED_IDLE en cours d’exĂ©cution. SCHED_FIFO est un ordonnancement simple sans dĂ©coupage temporel. Pour les threads ordonnancĂ©s selon la politique SCHED_FIFO , les rĂšgles suivantes sont appliquĂ©es :

-

Un thread SCHED_FIFO qui a Ă©tĂ© prĂ©emptĂ© par un autre thread de prioritĂ© supĂ©rieure restera en tĂȘte de liste pour sa prioritĂ© et reprendra son exĂ©cution dĂšs que tous les threads de prioritĂ© supĂ©rieure seront Ă  nouveau bloquĂ©s.

-

Quand un thread SCHED_FIFO bloquĂ© devient prĂȘt, il est insĂ©rĂ© en fin de liste pour sa prioritĂ©.

-

Si un appel Ă  sched_setscheduler (2), sched_setparam (2), sched_setattr (2), pthread_setschedparam (3) ou pthread_setschedprio (3) modifie la prioritĂ© du thread SCHED_FIFO prĂȘt ou en cours d’exĂ©cution, identifiĂ© par pid , l’effet sur la position du thread dans la liste dĂ©pend de la direction de la modification de la prioritĂ© des threads :

(a)

Si la prioritĂ© du thread est relevĂ©e, il est placĂ© en fin de liste pour sa nouvelle prioritĂ©. Par consĂ©quent, il peut prĂ©empter un thread en cours d’exĂ©cution ayant la mĂȘme prioritĂ©.

(b)

Si la priorité du thread est inchangée, sa position dans la liste des exécutions est inchangée.

(c)

Si la prioritĂ© du thread est abaissĂ©e, il est placĂ© en tĂȘte de liste pour sa nouvelle prioritĂ©.

Selon POSIX.1-2008, les modifications de priorité (ou politique) de thread en utilisant tout autre mécanisme que pthread_setschedprio (3) devraient aboutir à ce que le thread soit placé en fin de liste pour sa priorité.

-

Un thread appelant sched_yield (2) sera placé en fin liste.

Aucun autre Ă©vĂ©nement ne dĂ©placera un thread ordonnancĂ© selon la politique SCHED_FIFO dans la liste d’attente des threads prĂȘts de prioritĂ© statique Ă©quivalente.

Un thread SCHED_FIFO s’exĂ©cute jusqu’à ce qu’il soit bloquĂ© par une requĂȘte d’entrĂ©e-sortie, qu’il soit prĂ©emptĂ© par un thread de prioritĂ© supĂ©rieure ou qu’il appelle sched_yield (2).

SCHED_RR : ordonnancement tourniquet

SCHED_RR est une amĂ©lioration simple de SCHED_FIFO . Tout ce qui est dĂ©crit pour SCHED_FIFO s’applique aussi Ă  SCHED_RR , sauf que chaque thread ne dispose que d’un quantum de temps maximal pour son exĂ©cution. Si l’exĂ©cution d’un thread SCHED_RR est d’une durĂ©e supĂ©rieure ou Ă©gale au quantum de temps, il sera placĂ© en fin de liste pour sa prioritĂ©. Un thread SCHED_RR qui a Ă©tĂ© prĂ©emptĂ© par un thread de prioritĂ© supĂ©rieure et par consĂ©quent qui reprend l’exĂ©cution en tant que thread en cours, terminera la part non utilisĂ©e de son quantum de temps dans le tourniquet. La valeur du quantum de temps peut ĂȘtre lue avec sched_rr_get_interval (2).

SCHED_DEADLINE: ordonnancement sur échéances selon le modÚle des tùchessporadiques.

Depuis Linux 3.14, Linux offre une politique d’ordonnancement sur Ă©chĂ©ances ( SCHED_DEADLINE ). L’implĂ©mentation actuelle de cette politique repose sur les algorithmes GEDF (Global Earliest Deadline First, ou « prioritĂ© globale Ă  l’échĂ©ance proche ») et CBS (Constant Bandwidth Server, ou « serveur Ă  bande passante constante ») utilisĂ©s conjointement. Pour dĂ©finir ou rĂ©cupĂ©rer cette politique et ses attributs associĂ©s, les appels systĂšme sched_setattr (2) et sched_getattr (2) doivent ĂȘtre utilisĂ©s.

Une tĂąche sporadique prĂ©sente une sĂ©quence de sous-tĂąches qui sont chacune activĂ©es au moins une fois par pĂ©riode. Chaque sous-tĂąche a Ă©galement une Ă©chĂ©ance relative , avant laquelle elle doit achever son exĂ©cution, et un temps d’exĂ©cution qui est le temps CPU nĂ©cessaire pour qu’elle s’exĂ©cute. Le moment auquel une tĂąche est activĂ©e parce qu’une sous-tĂąche doit ĂȘtre exĂ©cutĂ©e est appelĂ© temps d’activation (Ă©galement dĂ©signĂ© temps d’appel (« request time ») ou temps de libĂ©ration (« release time »)). Le temps de lancement est le moment auquel la tĂąche commence son exĂ©cution. L’ Ă©chĂ©ance impĂ©rative est obtenue en additionnant l’échĂ©ance relative et le temps d’activation.

Le schéma suivant illustre ces termes :

activation/réveil échéance impérative
| temps du lancement |
| | |
v v v
-----x--------xoooooooooooooooooooooooo--------x--------x---
|<- temps d’exĂ©cution ->|
|<---------- échéance relative ---------->|
|<----------------- période ---------------------->|

Lorsqu’une politique SCHED_DEADLINE est activĂ©e au moyen de sched_setattr (2), il est possible de prĂ©ciser trois paramĂštres : Runtime , Deadline et Period . Ces paramĂštres ne correspondent pas forcĂ©ment aux termes dĂ©crits prĂ©cĂ©demment : il est d’usage d’affecter Ă  Runtime une valeur supĂ©rieure au temps d’exĂ©cution moyen (ou le pire temps d’exĂ©cution possible, pour les cas de temps rĂ©el extrĂȘmes) ; Deadline prend la valeur de l’échĂ©ance relative ; enfin, Period reçoit la valeur de la pĂ©riode de la tĂąche. Ainsi, pour un ordonnancement SCHED_DEADLINE , on obtient.

activation/réveil échéance impérative
| temps du lancement |
| | |
v v v
-----x--------xoooooooooooooooooooooooo--------x--------x---
|<------- Exécution ------->|
|<----------------- ÉchĂ©ance ------------>|
|<----------------- Période ---------------------->|

Les trois paramĂštres de configuration de l’ordonnancement sur Ă©chĂ©ances correspondent aux champs sched_runtime , sched_deadline et sched_period de la structure sched_attr (consultez sched_setattr (2)). Ces champs sont exprimĂ©s en nanosecondes. Si la valeur 0 est affectĂ©e Ă  sched_period , ce paramĂštre prend la valeur de sched_deadline .

Le noyau exige que :

sched_runtime <= sched_deadline <= sched_period

De plus, dans l’implĂ©mentation actuelle, tous les paramĂštres doivent valoir au moins 1024 (c’est Ă  dire Ă  peine plus qu’une microseconde, qui est la rĂ©solution de cette implĂ©mentation) et moins de 2^63. Si la valeur de l’un de ces paramĂštres sort de cet intervalle, sched_setattr (2) Ă©choue en renvoyant l’erreur EINVAL .

Le CBS assure que les diffĂ©rentes tĂąches n’interfĂšrent pas en bloquant les threads qui tentent de dĂ©passer leur temps d’exĂ©cution (Runtime).

Pour que les conditions requises par l’ordonnancement sur Ă©chĂ©ances soient remplies, le noyau doit empĂȘcher des situations dans lesquelles l’ensemble des threads SCHED_DEADLINE n’est pas rĂ©alisable (ordonnancement non possible) en tenant compte des contraintes donnĂ©es. Le noyau doit donc exĂ©cuter un test d’approbation lorsque la politique SCHED_DEADLINE et ses attributs sont dĂ©finis ou modifiĂ©s. Ce test d’approbation valide que le changement demandĂ© est rĂ©alisable ; si ce n’est pas le cas, sched_setattr (2) Ă©choue et renvoie l’erreur EBUSY .

Par exemple, il est nĂ©cessaire (et par forcĂ©ment suffisant) pour l’utilisation totale d’ĂȘtre infĂ©rieure ou Ă©gale au nombre total de CPU disponibles, oĂč, puisque chaque thread peut s’exĂ©cuter au plus pour Runtime par Period , l’utilisation pour ce thread vaut son Runtime divisĂ© par sa Period .

Pour assurer les conditions qui sont requises lorsqu’un thread est autorisĂ© Ă  utiliser la politique SCHED_DEADLINE , les threads SCHED_DEADLINE ont la prioritĂ© la plus Ă©levĂ©e parmi tous les threads (contrĂŽlable par l’utilisateur) du systĂšme. Si un thread ordonnancĂ© selon SCHED_DEADLINE est prĂȘt, il aura la prioritĂ© sur tout autre thread ordonnancĂ© par une autre politique.

Un appel Ă  fork (2) effectuĂ© par un thread ordonnancĂ© selon la politique SCHED_DEADLINE Ă©chouera en renvoyant l’erreur EAGAIN , sauf dans le cas ou l’attribut « reset-on-fork » du thread est activĂ© (voir plus bas).

Un thread ordonnancé selon SCHED_DEADLINE qui appelle sched_yield (2) cédera la priorité à la sous-tùche en cours et attendra une nouvelle période pour débuter.

SCHED_OTHER : ordonnancement temps partagé par défaut

SCHED_OTHER peut ĂȘtre utilisĂ© seulement pour la prioritĂ© statique 0 (c’est-Ă -dire que les threads sous politique temps rĂ©el ont la prioritĂ© sur les processus SCHED_OTHER ). SCHED_OTHER est l’ordonnanceur temps partagĂ© de Linux prĂ©vu pour tous les threads n’ayant pas besoin des mĂ©canismes temps rĂ©el spĂ©ciaux.

Le thread Ă  exĂ©cuter est choisi dans la liste des threads de prioritĂ© statique 0, en utilisant une prioritĂ© dynamique qui ne s’applique que dans cette liste. La prioritĂ© dynamique est basĂ©e sur la valeur de politesse (« nice ») du thread (voir ci-dessous) et est incrĂ©mentĂ©e Ă  chaque quantum de temps oĂč le thread est prĂȘt, mais non sĂ©lectionnĂ© par l’ordonnanceur. Cela garantit une progression Ă©quitable de tous les threads SCHED_OTHER .

Dans le code source du noyau Linux, la politique SCHED_OTHER est en fait appelée SCHED_NORMAL .

La valeur de politesse

La valeur de politesse est un attribut pouvant ĂȘtre utilisĂ© pour influencer l’ordonnanceur en faveur ou dĂ©faveur d’un processus dans les choix d’ordonnancement. Elle affecte l’ordonnancement des processus SCHED_OTHER et SCHED_BATCH (voir ci-dessous). La valeur de politesse peut ĂȘtre modifiĂ©e avec nice (2), setpriority (2) ou sched_setattr (2).

Selon POSIX.1, la valeur de politesse est un attribut par processus, c’est-Ă -dire que les threads dans un processus devraient partager la valeur de politesse. Cependant, dans Linux, cette valeur est un attribut par thread : des threads distincts dans le mĂȘme processus peuvent avoir des valeurs de politesse diffĂ©rentes.

L’éventail des valeurs de politesse diffĂšre selon les systĂšmes UNIX. Dans un Linux moderne, il varie de −20 (prioritĂ© Ă©levĂ©e) à +19 (prioritĂ© basse). Dans quelques autres systĂšmes, la plage est de −20 à 20. Les tout premiers noyaux Linux (avant Linux 2.0) avaient une plage de −infini à 15 .

De mĂȘme, le degrĂ© auquel la valeur de politesse affecte l’ordonnancement respectif des processus SCHED_OTHER varie selon les systĂšmes UNIX et selon les versions du noyau Linux.

Avec l’arrivĂ©e de l’ordonnanceur CFS dans Linux 2.6.23, Linux a adoptĂ© un algorithme qui provoque des diffĂ©rences relatives aux valeurs de politesse ayant un impact plus important. Dans l’implĂ©mentation actuelle, chaque unitĂ© de diffĂ©rence dans les valeurs de politesse dans deux processus aboutit Ă  un facteur de 1,25 dans le degrĂ© dont l’ordonnancement favorise le processus de plus haute prioritĂ©. Cela fait que les trĂšs petites valeurs de prioritĂ© (+19) fournissent vraiment peu de CPU pour un processus Ă  chaque fois qu’il existe une charge de plus haute prioritĂ© sur le systĂšme, et cela fait que les hautes valeurs (−20) fournissent la plus grande partie du CPU aux applications en ayant besoin (par exemple, certaines applications audio).

Dans Linux, la limite de ressources RLIMIT_NICE peut ĂȘtre utilisĂ©e pour dĂ©finir une limite jusqu’à laquelle une valeur de politesse de processus non privilĂ©giĂ© peut ĂȘtre Ă©levĂ©e. Consultez setrlimit (2) pour les dĂ©tails.

Pour davantage d’explications Ă  propos de la valeur de politesse, consultez ci-dessous les sous-sections sur la fonctionnalitĂ© d’autogroupe et sur l’ordonnancement de groupe.

SCHED_BATCH : ordonnancement de processus par lots

(Depuis Linux 2.6.16) SCHED_BATCH ne peut ĂȘtre utilisĂ©e qu’avec une prioritĂ© statique de 0. Cette politique est similaire Ă  SCHED_OTHER en ce qu’elle ordonnance les threads conformĂ©ment Ă  leur prioritĂ© dynamique (basĂ©e sur la valeur de politesse). La diffĂ©rence est que cette politique fera que l’ordonnanceur considĂ©rera toujours que ce thread demande beaucoup de ressources processeur. Par consĂ©quent, il lui appliquera une petite pĂ©nalitĂ© d’ordonnancement vis-Ă -vis du comportement au rĂ©veil, ainsi le thread sera lĂ©gĂšrement dĂ©savantagĂ© dans les dĂ©cisions d’ordonnancement.

Cette politique est utile pour les charges de travail non interactives, mais qui ne souhaitent pas diminuer leur valeur de politesse, ou pour celles qui veulent une politique d’ordonnancement dĂ©terministe sans que l’interactivitĂ© ne cause de prĂ©emptions supplĂ©mentaires (entre les tĂąches des charges).

SCHED_IDLE : ordonnancement de tùches de trÚs faible priorité

(Depuis Linux 2.6.23.) SCHED_IDLE ne peut ĂȘtre utilisĂ©e qu’avec une prioritĂ© statique de 0 ; la valeur de politesse n’a pas d’influence pour cette politique.

Cette politique est conçue pour l’exĂ©cution de tĂąches de trĂšs faible prioritĂ© (infĂ©rieure mĂȘme Ă  une valeur de politesse +19 avec les politiques SCHED_OTHER ou SCHED_BATCH ).

RĂ©initialiser la politique d’ordonnancement pour les processus enfant

Chaque thread possĂšde un attribut d’ordonnancement reset-on-fork. Lorsque cet attribut est dĂ©fini, les enfants créés au moyen de fork (2) n’hĂ©ritent pas des politiques d’ordonnancement nĂ©cessitant des droits. L’attribut reset-on-fork peut ĂȘtre dĂ©fini soit :

-

en appliquant un OU logique à l’attribut SCHED_RESET_ON_FORK dans l’argument policy au moment de l’appel à sched_setscheduler (2) (à partir de Linux 2.6.32) ;

-

ou en ajoutant l’argument SCHED_FLAG_RESET_ON_FORK dans attr.sched_flags au moment de l’appel à sched_setattr (2).

Notez que les constantes utilisĂ©es dans ces deux API ont des noms diffĂ©rents. La disposition de l’attribut reset-on-fork peut, de façon analogue, ĂȘtre obtenue au moyen de sched_getscheduler (2) et de sched_getattr (2).

La fonctionnalitĂ© reset-on-fork est prĂ©vue pour des applications de lecture audiovisuelle et peut ĂȘtre utilisĂ©e pour empĂȘcher les applications de passer outre la limite de ressource RLIMIT_RTTIME (consultez getrlimit (2)) en crĂ©ant de nombreux processus enfant.

Plus prĂ©cisĂ©ment, si l’attribut reset-on-fork est utilisĂ©, les rĂšgles suivantes seront appliquĂ©es lors de la crĂ©ation ultĂ©rieure des enfants :

-

Si le thread appelant a une politique d’ordonnancement SCHED_FIFO ou SCHED_RR , la politique pour les processus enfant est rĂ©initialisĂ©e Ă  SCHED_OTHER .

-

Si le processus appelant a une valeur de politesse négative, elle est mise à zéro pour les processus enfant.

Une fois que l’attribut reset-on-fork est activĂ©, il ne peut ĂȘtre dĂ©sactivĂ© que si le thread possĂšde la capacitĂ© CAP_SYS_NICE . Cet attribut est dĂ©sactivĂ© pour les processus enfant créés avec fork (2).

PrivilĂšges et limites de ressources

Avant Linux 2.6.12, seuls les threads privilĂ©giĂ©s ( CAP_SYS_NICE ) pouvaient attribuer une prioritĂ© statique non nulle (c’est-Ă -dire dĂ©finir une politique d’ordonnancement temps rĂ©el). Le seul changement qu’un thread non privilĂ©giĂ© pouvait faire Ă©tait d’affecter la politique SCHED_OTHER et cela ne pouvait ĂȘtre fait que si l’UID effectif de l’appelant Ă©tait le mĂȘme que l’UID rĂ©el ou effectif du thread cible (c’est-Ă -dire le thread spĂ©cifiĂ© par pid ) dont la politique Ă©tait modifiĂ©e.

Un thread doit avoir des droits spécifiques ( CAP_SYS_NICE ) pour pouvoir affecter ou modifier la politique SCHED_DEADLINE .

Depuis Linux 2.6.12, la limite de ressources RLIMIT_RTPRIO dĂ©finit un plafond pour la prioritĂ© statique d’un thread non privilĂ©giĂ© pour les politiques SCHED_RR et SCHED_FIFO . Les rĂšgles pour modifier la politique d’ordonnancement et la prioritĂ© sont les suivantes :

-

Si un thread non privilĂ©giĂ© a une limite souple RLIMIT_RTPRIO non nulle, il peut modifier sa politique et sa prioritĂ© d’ordonnancement, Ă  condition que la prioritĂ© reste infĂ©rieure au maximum de sa prioritĂ© actuelle et Ă  sa limite souple RLIMIT_RTPRIO .

-

Si la limite souple RLIMIT_RTPRIO est nulle, les seules modifications permises sont une diminution de la prioritĂ© ou bien un basculement vers une politique qui n’est pas temps rĂ©el.

-

Soumis aux mĂȘmes rĂšgles, un autre thread non privilĂ©giĂ© peut Ă©galement faire ces modifications Ă  partir du moment oĂč l’UID effectif du thread effectuant la modification correspond Ă  l’UID rĂ©el ou effectif du thread cible.

-

Des rĂšgles particuliĂšres s’appliquent Ă  la politique SCHED_IDLE . Avant Linux 2.6.39, un thread non privilĂ©giĂ© opĂ©rant sous cette politique ne peut pas modifier sa politique, quelle que soit la valeur de sa limite souple de ressources RLIMIT_RTPRIO . Depuis Linux 2.6.39, un thread non privilĂ©giĂ© peut basculer vers la politique SCHED_BATCH ou SCHED_OTHER tant que sa valeur de politesse tombe dans l’intervalle permis par sa limite de ressources RLIMIT_NICE (consultez getrlimit (2)).

Les threads privilĂ©giĂ©s ( CAP_SYS_NICE ) ignorent la limite RLIMIT_RTPRIO : comme avec d’anciens noyaux, ils peuvent modifier arbitrairement la politique d’ordonnancement et la prioritĂ©. Consultez getrlimit (2) pour plus d’informations sur RLIMIT_RTPRIO .

Limiter l’utilisation CPU des processus temps-rĂ©el et Ă  Ă©chĂ©ances.

Une boucle sans fin non bloquante dans un thread ordonnancĂ© selon une politique SCHED_FIFO , SCHED_RR ou SCHED_DEADLINE peut potentiellement bloquer indĂ©finiment l’accĂšs au CPU de tous les threads. Avant Linux 2.6.25, le seul moyen d’éviter qu’un processus temps rĂ©el hors de contrĂŽle ne bloque le systĂšme Ă©tait d’exĂ©cuter (sur la console) un shell ayant un prioritĂ© statique supĂ©rieure Ă  celle de l’application testĂ©e. Cela permettait d’exĂ©cuter en urgence une commande kill sur les applications temps rĂ©el en cours de test qui ne se bloquaient pas ou ne se terminaient pas comme prĂ©vu.

Depuis Linux 2.6.25, il existe d’autres techniques pour traiter le cas des processus temps rĂ©el et Ă  Ă©chĂ©ances qui sont hors de contrĂŽle. L’une de ces techniques consiste Ă  utiliser la limite de ressources RLIMIT_RTTIME pour dĂ©finir la limite du temps CPU qu’un processus temps rĂ©el a le droit de consommer. Consultez getrlimit (2) pour plus de dĂ©tails.

Depuis, Linux 2.6.25 propose Ă©galement deux fichiers /proc qui peuvent ĂȘtre utilisĂ©s pour rĂ©server une certaine quantitĂ© de temps CPU aux processus non temps rĂ©el. La rĂ©servation de temps CPU par ce moyen permet d’allouer du temps CPU, par exemple, Ă  un shell administrateur pour qu’il puisse exĂ©cuter une commande kill sur un processus hors de contrĂŽle. Ces deux fichiers dĂ©finissent des valeurs exprimĂ©es en microseconde :
/proc/sys/kernel/sched_rt_period_us

Ce fichier dĂ©finit une pĂ©riode d’ordonnancement correspondant Ă  100 % de la bande passante du CPU. La valeur contenue dans ce fichier peut aller de 1 Ă  INT_MAX , soit une durĂ©e allant de 1 microseconde Ă  environ 35 minutes. La valeur par dĂ©faut contenue dans ce fichier est 1 000 000 (1 seconde).

/proc/sys/kernel/sched_rt_runtime_us

La valeur contenue dans ce fichier dĂ©finit quelle part d’une « pĂ©riode » peut ĂȘtre utilisĂ©e par des processus temps rĂ©el et Ă  Ă©chĂ©ances. La valeur contenue dans ce fichier peut aller de −1 Ă  INT_MAX −1. −1 fixe un temps d’exĂ©cution Ă©gal Ă  la pĂ©riode, c’est Ă  dire qu’aucun temps CPU n’est rĂ©servĂ© pour les processus non temps rĂ©el (ce qui correspond au comportement avant Linux 2.6.25 du noyau). La valeur par dĂ©faut contenue dans ce fichier est 950 000 (0,95 seconde), ce qui signifie que 5 % du temps CPU est rĂ©servĂ© aux processus qui ne s’exĂ©cutent pas selon une politique d’ordonnancement temps rĂ©el ou Ă  Ă©chĂ©ances.

Temps de réponse

Un thread 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 ce temps de rĂ©ponse en utilisant un gestionnaire d’interruptions « lentes ».

Divers

Les processus enfant hĂ©ritent de la politique d’ordonnancement et des paramĂštres associĂ©s lors d’un fork (2). La politique et les paramĂštres d’ordonnancement sont conservĂ©s au travers d’un execve (2).

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 ; cela peut ĂȘtre effectuĂ© avec mlock (2) ou mlockall (2).

FonctionnalitĂ© d’autogroupage

Depuis Linux 2.6.38, le noyau fournit une fonctionnalitĂ© connue comme l’autogroupage pour amĂ©liorer les performances des bureaux interactifs confrontĂ©s Ă  des charges de travail multiprocessus utilisant Ă©normĂ©ment le CPU telles que la construction du noyau Linux avec un grand nombre de processus de construction en parallĂšle (c’est-Ă -dire l’indicateur -j de make (1)).

Cette fonction opĂšre en conjonction avec l’ordonnancement CFS et nĂ©cessite un noyau configurĂ© avec CONFIG_SCHED_AUTOGROUP . Sur un systĂšme en cours d’exĂ©cution, cette fonctionnalitĂ© est activĂ©e ou dĂ©sactivĂ©e Ă  l’aide du fichier /proc/sys/kernel/sched_autogroup_enabled . Une valeur 0 dĂ©sactive cette fonctionnalitĂ© tandis qu’une valeur 1 l’active. La valeur par dĂ©faut dans ce fichier est 1 Ă  moins que le noyau ait Ă©tĂ© amorcĂ© avec le paramĂštre noautogroup .

Un nouvel autogroupe est créé quand une nouvelle session est créée Ă  l’aide de setsid (2). Cela se produit, par exemple, quand une nouvelle fenĂȘtre de terminal est dĂ©marrĂ©e. Un nouveau processus créé par fork (2) hĂ©rite de l’appartenance d’autogroupe de son parent. Par consĂ©quent, tous les processus dans une session sont membres du mĂȘme autogroupe. Un autogroupe est automatiquement dĂ©truit quand le dernier processus du groupe se termine.

Lorsque l’autogroupage est activĂ©, tous les membres d’un autogroupe sont placĂ©s dans le mĂȘme ordonnanceur « groupe de tĂąches » du noyau. L’ordonnanceur CFS emploie un algorithme qui Ă©galise la distribution des cycles du CPU entre les groupes de tĂąches. Le bĂ©nĂ©fice qui en dĂ©coule pour la performance de bureau interactif peut ĂȘtre dĂ©crit Ă  l’aide de l’exemple qui suit.

Supposons qu’il existe deux autogroupes en compĂ©tition pour le mĂȘme CPU (c’est-Ă -dire soit un systĂšme avec un seul CPU, soit l’utilisation de taskset (1) pour confiner tous les processus sur le mĂȘme CPU sur un systĂšme SMP). Le premier groupe contient dix processus liĂ©s Ă  un CPU d’une construction de noyau dĂ©marrĂ©e avec make -j10 . L’autre groupe contient un seul processus liĂ© Ă  un CPU : un lecteur vidĂ©o. Le rĂ©sultat de l’autogroupage est que les deux groupes recevront chacun la moitiĂ© des cycles CPU. C’est-Ă -dire que le lecteur vidĂ©o recevra 50 % des cycles CPU, plutĂŽt que seulement 9 % des cycles, ce qui conduirait probablement Ă  une lecture vidĂ©o dĂ©gradĂ©e. La situation sur le systĂšme SMP est plus complexe, mais l’effet gĂ©nĂ©ral est le mĂȘme : l’ordonnanceur rĂ©partit les cycles CPU dans les groupes de tĂąches de telle façon qu’un autogroupe contenant un grand nombre de processus liĂ©s Ă  un CPU n’aboutisse pas Ă  un accaparement des cycles CPU au dĂ©triment des autres travaux dans le systĂšme.

L’appartenance Ă  un autogroupe de processus (groupe de tĂąches) peut ĂȘtre vue dans le fichier /proc/ pid /autogroup :

$ cat /proc/1/autogroup
/autogroup-1 nice 0

Ce fichier peut aussi ĂȘtre utilisĂ© pour modifier la bande passante de CPU allouĂ©e Ă  un autogroupe. Cela peut ĂȘtre rĂ©alisĂ© en Ă©crivant un nombre dans le champ « nice » du fichier pour dĂ©finir la valeur de politesse de l’autogroupe. L’intervalle autorisĂ© va de +19 (prioritĂ© basse) Ă  -20 (prioritĂ© haute). L’écriture d’une valeur en dehors de cet intervalle provoquera l’échec de write (2) avec l’erreur EINVAL .

Le rĂ©glage de la politesse de l’autogroupe a la mĂȘme acception que la valeur de politesse du processus, mais s’applique Ă  la rĂ©partition des cycles CPU Ă  un autogroupe dans son ensemble, basĂ©e sur les valeurs relatives de politesse des autres autogroupes. Pour un processus dans un autogroupe, les cycles CPU qu’il reçoit sont dĂ©duits de la valeur de politesse de l’autogroupe (comparĂ©e aux autres autogroupes) et de la valeur de politesse du processus (comparĂ©e aux autres processus dans le mĂȘme autogroupe).

L’utilisation du contrîleur de CPU cgroups (7) pour placer les processus dans des cgroups autres que le cgroup racine du CPU contourne l’effet de l’autogroupage.

La fonctionnalitĂ© d’autogroupage groupe seulement les processus ordonnancĂ©s selon des politiques non temps rĂ©el ( SCHED_OTHER , SCHED_BATCH et SCHED_IDLE ). Elle ne groupe pas les processus ordonnancĂ©s selon les politiques temps rĂ©el et Ă  Ă©chĂ©ances. Ceux-ci sont ordonnancĂ©s selon les rĂšgles dĂ©crites ci-dessus.

Valeur de politesse et ordonnancement de groupe

Lors de l’ordonnancement de processus non temps rĂ©el (c’est-Ă -dire ceux ordonnancĂ©s selon les politiques SCHED_OTHER , SCHED_BATCH et SCHED_IDLE ), L’ordonnanceur CFS emploie une technique connue comme « ordonnancement de groupe » (group scheduling) si le noyau a Ă©tĂ© configurĂ© avec l’option CONFIG_FAIR_GROUP_SCHED (ce qui est typique).

Avec l’ordonnancement de groupe, les threads sont ordonnancĂ©s dans des « groupes de tĂąches ». Celles-ci ont une relation hiĂ©rarchique, avec comme racine le groupe de tĂąches initial du systĂšme connu comme « groupe de tĂąches racine » (root task group). Les groupes de tĂąches sont constituĂ©s dans les circonstances suivantes :

-

Tous les threads dans un cgroup du CPU forment un groupe de tĂąches. Le parent de ce groupe de tĂąches est le groupe de tĂąches du cgroup parent correspondant.

-

Si l’autogroupage est activĂ©, alors tous les threads qui sont (implicitement) placĂ©s dans un autogroupe (c’est-Ă -dire la mĂȘme session, telle que créée par setsid (2)) forment un groupe de tĂąches. Chaque nouvel autogroupe est par consĂ©quent un groupe de tĂąches distinct. Le groupe de tĂąches racine est le parent de tous les autogroupes de ce type.

-

Si l’autogroupage est activĂ©, alors le groupe de tĂąches racine se compose de tous les processus dans le cgroup racine du CPU qui n’étaient pas par ailleurs placĂ©s implicitement dans un nouvel autogroupe.

-

Si l’autogroupage est dĂ©sactivĂ©, alors le groupe de tĂąches racine est constituĂ© de tous les processus dans le cgroup racine du CPU.

-

Si l’ordonnancement de groupe a Ă©tĂ© dĂ©sactivĂ© (c’est-Ă -dire que le noyau a Ă©tĂ© configurĂ© sans CONFIG_FAIR_GROUP_SCHED ), alors tous les processus du systĂšme sont en thĂ©orie placĂ©s dans un groupe de tĂąches unique.

Avec l’ordonnancement de groupe, une valeur de politesse de thread a un effet sur les dĂ©cisions d’ordonnancement seulement relatives aux autres threads dans le mĂȘme groupe de tĂąches . Cela a quelques consĂ©quences surprenantes en terme de sĂ©mantique traditionnelle de la valeur de politesse sur les systĂšmes UNIX. En particulier, si l’autogroupage est activĂ© (par dĂ©faut dans diverses distributions), alors l’emploi de setpriority (2) ou nice (1) sur un processus a un effet seulement sur l’ordonnancement concernant les autres processus exĂ©cutĂ©s dans la mĂȘme session (classiquement : la mĂȘme fenĂȘtre de terminal).

Inversement, pour deux processus qui sont (par exemple) les seuls processus liĂ©s Ă  un CPU dans diffĂ©rentes sessions (par exemple, des fenĂȘtres distinctes de terminal, chacune des tĂąches Ă©tant liĂ©e Ă  un autogroupe distinct), modifier la valeur de politesse du processus d’une des sessions n’a pas d’effet en terme de dĂ©cision d’ordonnancement relative au processus dans l’autre session. Un contournement utile possible consiste Ă  utiliser une commande telle que la suivante pour modifier la valeur de politesse de l’autogroupe pour tous les processus dans une session de terminal :

$ echo 10 > /proc/self/autogroup

Fonctionnalités temps réel dans le noyau Linux principal

Depuis Linux 2.6.18, Linux a Ă©tĂ© graduellement pourvu de capacitĂ©s temps rĂ©el, la plupart Ă©tant dĂ©rivĂ©es de l’ancien ensemble de greffons realtime-preempt . Jusqu’à ce que ces greffons aient Ă©tĂ© entiĂšrement fusionnĂ©s dans le noyau principal, ils devront ĂȘtre installĂ©s pour atteindre les meilleures performances temps rĂ©el. Ces greffons s’appellent :

patch- version-noyau -rt version-greffon

et peuvent ĂȘtre tĂ©lĂ©chargĂ©s Ă  partir de http://www.kernel.org/pub/linux/kernel/projects/rt/ .

Sans les greffons et avant leur complĂšte inclusion dans le noyau principal, la configuration du noyau n’offre que trois classes de prĂ©emption CONFIG_PREEMPT_NONE , CONFIG_PREEMPT_VOLUNTARY et CONFIG_PREEMPT_DESKTOP qui fournissent respectivement « aucune », « quelque » et une « considĂ©rable » rĂ©duction de la pire latence d’ordonnancement.

Avec les greffons appliquĂ©s ou aprĂšs leur pleine inclusion dans le noyau principal, la configuration supplĂ©mentaire CONFIG_PREEMPT_RT devient disponible. Si elle est choisie, Linux est transformĂ© en un systĂšme d’exploitation temps rĂ©el ordinaire. Les politiques d’ordonnancement FIFO et RR sont alors utilisĂ©es pour lancer un thread avec une vraie prioritĂ© temps rĂ©el et une latence minimale d’ordonnancement de pire cas.

NOTES

Le contrĂŽleur cgroups (7) de CPU peut ĂȘtre utilisĂ© pour limiter la consommation de CPU par les groupes de processus.

À l’origine, le noyau Linux standard visait un systĂšme d’exploitation Ă  vocation gĂ©nĂ©raliste, devant gĂ©rer des processus en arriĂšre-plan, des applications interactives et des applications en temps rĂ©el souples (qui ont besoin en gĂ©nĂ©ral de rĂ©pondre Ă  des critĂšres de temps maximal). Bien que Linux 2.6 ait permis la prĂ©emption par le noyau et que l’ordonnanceur O(1), nouvellement introduit, assure que le temps nĂ©cessaire pour planifier soit fixĂ© et dĂ©terministe quel que soit le nombre de tĂąches, une vraie gestion temps rĂ©el n’était pas possible avant Linux 2.6.17.

VOIR AUSSI

chcpu (1), chrt (1), lscpu (1), ps (1), taskset (1), top (1), getpriority (2), mlock (2), mlockall (2), munlock (2), munlockall (2), nice (2), sched_get_priority_max (2), sched_get_priority_min (2), sched_getaffinity (2), sched_getparam (2), sched_getscheduler (2), sched_rr_get_interval (2), sched_setaffinity (2), sched_setparam (2), sched_setscheduler (2), sched_yield (2), setpriority (2), pthread_getaffinity_np (3), pthread_getschedparam (3), pthread_setaffinity_np (3), sched_getcpu (3), capabilities (7), cpuset (7)

Programming for the real world – POSIX.4 de Bill O. Gallmeister, O’Reilly & Associates, Inc., ISBN 1-56592-074-0.

Les fichiers source du noyau Linux Documentation/scheduler/ sched-deadline.txt , Documentation/scheduler/sched-rt-group.txt , Documentation/scheduler/sched-design-CFS.txt et Documentation/ scheduler/sched-nice-design.txt

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Cédric Boutillier <cedric.boutillier@gmail.com>, Frédéric Hantrais <fhantrais@gmail.com> et Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .