IOPRIO_SET(2)

NOM
ioprio_get, ioprio_set - Obtenir/configurer la classe d'ordonnancement et la priorité des entrées/sorties

SYNOPSIS
int ioprio_get(int which, int who);
int ioprio_set(int which, int who, int ioprio);

DESCRIPTION
Les appels système ioprio_get() et ioprio_set() permettent d'obtenir et configurer, respectivement, la classe et la priorité d'ordonnancement des entrées/sorties d'un ou plusieurs processus. Les arguments which et who identifient le(s) processus sur le(s)quel(s) les appels système opèrent. L'argument which détermine comment who est interprété et prend l'une des valeurs suivantes :

IOPRIO_WHO_PROCESS
    who est un PID identifiant un processus unique.

IOPRIO_WHO_PGRP
    who est un PGID identifiant tous les membres d'un groupe de processus.

IOPRIO_WHO_USER
    who est un UID identifiant tous les processus qui correspondent à un UID réel.

Si which vaut IOPRIO_WHO_PGRP ou IOPRIO_WHO_USER lors de l'appel à ioprio_get(), et si plus d'un processus correspond à who, la priorité renvoyée sera la plus grande trouvée parmi tous les processus correspondants. Une priorité est dite plus grande qu'une autre si elle appartient à une classe de priorité supérieure (IOPRIO_CLASS_RT est la classe de priorité la plus haute ; IOPRIO_CLASS_IDLE est la plus basse) ou si elle appartient à la même classe de priorité que les autres processus mais a un niveau de priorité plus grand (une petite valeur de priorité signifie un haut niveau de priorité). L'argument ioprio fourni à ioprio_set() est un masque de bits qui spécifie à la fois la classe d'ordonnancement et la priorité à affecter au(x) processus cible(s). Les macros suivantes sont utilisées pour asssembler et disséquer les valeurs de ioprio :

IOPRIO_PRIO_VALUE(class, data)
    Étant données une classe d'ordonnancement class et une priorité (data), cette macro combine les deux valeurs pour produire une valeur ioprio, qui est renvoyée comme étant le résultat de la macro.

IOPRIO_PRIO_CLASS(mask)
    Étant donné mask (une valeur ioprio), cette macro renvoie le composant classe d'entrées/sorties, c'est-à-dire l'une des valeurs IOPRIO_CLASS_RT, IOPRIO_CLASS_BE ou IOPRIO_CLASS_IDLE.

IOPRIO_PRIO_DATA(mask)
    Étant donné mask (une valeur ioprio), cette macro renvoie le composant priorité (data).

Voir la section NOTES pour plus d'informations sur les classes et priorités d'ordonnancement. Les priorités d'entrées/sorties sont gérées pour les lectures et pour les écritures synchrones (O_DIRECT, O_SYNC). Les priorités d'entrées-sorties ne sont pas supportées pour les écritures asynchrones car elles sont émises en dehors du contexte du programme touchant la mémoire, et ainsi les priorités spécifiques au programme ne s'appliquent pas.

VALEUR RENVOYÉE
S'il réussit, ioprio_get() renvoie la valeur ioprio du processus ayant la plus haute priorité de tous les processus qui correspondent aux critères spécifiés dans which et who. S'il échoue, il renvoie -1 et écrit errno en conséquence.

S'il réussit, ioprio_set() renvoie 0. S'il échoue, il renvoie -1 et renseigne errno en conséquence.

ERREURS

EINVAL
    which ou ioprio n'a pas une valeur valide. Voir la section NOTES pour les classes et priorité d'ordonnancement disponibles pour ioprio.

EPERM
    Le processus appelant n'a pas les privilèges nécessaires pour affecter cet ioprio au(x) processus spécifié(s). Voir la section NOTES pour plus d'informations sur les privilèges nécessaires à ioprio_set().

ESRCH
    Aucun processus ne correspond aux critères indiqués par which et who.

VERSIONS
Ces appels système sont disponibles sous Linux depuis le noyau 2.6.13.

CONFORMITÉ
Ces appels système sont spécifiques à Linux.

NOTES
La glibc ne fournit pas d'enveloppe pour ces appels système ; utilisez syscall(2) pour les appeler. Ces appels système n'ont d'effet qu'utilisés avec un ordonnanceur d'entrées-sorties qui gère les priorités d'entrées-/sorties. Dans le noyau 2.6.17, le seul ordonnanceur adéquat est l'ordonnanceur d'entrées-sorties « Completely Fair Queuing » (CFQ).

  Choisir un ordonnanceur d'entrées-sorties
Les ordonnanceurs d'entrées/sorties sont sélectionnés pour chaque périphérique par le fichier spécial /sys/block/<device>/queue/scheduler. On peut voit l'ordonnanceur d'entrées/sorties actuel via le système de fichiers /sys. Par exemple, la commande suivante affiche une liste de tous les ordonnanceurs actuellement chargés par le noyau :

    $ cat /sys/block/hda/queue/scheduler
    noop anticipatory deadline [cfq]

L'ordonnanceur entre crochets est celui en cours d'utilisation pour le périphérique (hda dans l'exemple). Le choix d'un autre ordonnanceur est effectué en écrivant le nom du nouvel ordonnanceur dans ce fichier. Par exemple, la commande suivante définira à cfq l'ordonnanceur pour le périphérique hda :

    $ su
    Password:
    # echo cfq > /sys/block/hda/queue/scheduler

  L'ordonnanceur d'entrées-sorties Completely Fair Queuing (CFQ)
Depuis la version 3 (aka CFQ Time Sliced), CFQ implémente des niveaux de courtoisie d'entrées-sorties similaires à ceux de l'ordonnancement de la CPU. Ces niveaux de courtoisie sont regroupés en trois classes d'ordonnancement, chacune contenant un ou plusieurs niveaux de priorités :

IOPRIO_CLASS_RT (1)
    C'est la classe d'entrées-sorties temps réel. Cette classe d'ordonnancement a la plus grande priorité de toutes les classes : les processus appartenant à cette classe obtiendront toujours les premiers l'accès au disque. Aussi, cette classe d'entrées-sorties doit être utilisée avec précaution : un processus temps réel d'entrées-sorties peut étioler le système entier. À l'intérieur de la classe temps réel, il y a 8 niveaux de données classe (priorité) qui détermine exactement combien de temps le processus a besoin du disque pour chaque service. Le niveau de priorité temps réel le plus haut est 0, le plus bas est 7. Cela pourrait changer dans le futur afin de pouvoir plus directement maîtriser les performances, en passant par exemple le taux de transfert désiré.

IOPRIO_CLASS_BE (2)
    C'est la classe d'ordonnancement « au mieux » qui est la valeur par défaut pour tous les processus qui n'ont pas de priorité d'entrées-sorties configurée. La donnée classe (priorité) détermine quelle bande passante d'entrées-sorties le processus obtiendra. Les niveaux de priorité « au mieux » sont analogues aux valeurs de courtoisie de la CPU (voir getpriority(2)). Le niveau de priorité détermine une priorité relative aux autres processus dans la classe d'ordonnancement « au mieux ». Les niveaux de priorité s'échelonnent de 0 (le plus grand) à 7 (le plus petit).

IOPRIO_CLASS_IDLE (3)
    C'est la classe d'ordonnancement « idle ». Les processus s'exécutant à ce niveau n'obtiendront du temps d'entrées-sorties que lorsqu'aucun autre n'aura besoin du disque. La classe « idle » n'a pas de donnée de classe. Il faut faire attention lors de l'affectation de cette classe de priorité à un processus car il peut devenir « affamé » si des processus de plus haute priorité accèdent constamment au disque.

Voir Documentation/block/ioprio.txt pour plus d'informations sur l'ordonnanceur d'entrées-sorties CFQ et pour un exemple de programme.

  Permissions nécessaires pour configurer les priorités d'entrées-sorties
La permission pour modifier la priorité d'un processus est accordée ou refusée sur la base de deux assertions :

Appartenance du processus
    Un processus non privilégié ne peut configurer la priorité d'entrées-sorties que d'un processus dont l'UID réel correspond à l'UID réel ou effectif du processus appelant. Un processus qui possède la capacité CAP_SYS_NICE peut modifier la priorité de n'importe quel processus.

Quelle est la priorité souhaitée
    Les tentatives de configurer de très hautes (IOPRIO_CLASS_RT) ou de très basses (IOPRIO_CLASS_IDLE) priorités nécessitent la capacité CAP_SYS_ADMIN.

Un appel à ioprio_set() doit suivre les deux règles, sinon l'appel échouera avec l'erreur EPERM.

BOGUES
La glibc ne fournit pas encore de fichier d'entête convenable définissant les prototypes des fonctions et macros décrites dans cette page. Des définitions convenables peuvent être trouvées dans <linux/ioprio.h>.

VOIR AUSSI
getpriority(2), open(2), capabilities(7)

Documentation/block/ioprio.txt dans l'arborescence des sources du noyau.

TRADUCTION

Ce document est une traduction réalisée par Alain Portal <aportal AT univ-montp2 DOT fr> le 10 août 2006 et révisée le 23 juin 2008.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 ioprio_set ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.