Priorité des processus et des unités d'exécution

Les outils de gestion des priorités manipulent la priorité des processus.

Dans la version 4 d'AIX, la priorité des processus est un précurseur de la priorité des threads. Lorsque la sous-routine fork() est appelée, un processus et une unité d'exécution qui doivent y être exécutés sont créés. L'unité d'exécution a la priorité qui aurait été attribuée au processus.

Le noyau gère une valeur de priorité (parfois appelée priorité de planification) pour chaque unité d'exécution. La valeur de priorité est un entier positif et varie inversement avec l'importance de l'unité d'exécution associée. Autrement dit, une valeur de priorité plus petite indique une unité d'exécution plus importante. Lorsque le planificateur recherche une unité d'exécution à répartir, il choisit l'unité d'exécution du répartiteur avec la plus petite valeur de priorité.

Une unité d'exécution peut être à priorité fixe ou à priorité non fixe. La valeur de priorité d'une unité d'exécution à priorité fixe est constante, tandis que la valeur de priorité d'une unité d'exécution à priorité non fixe varie en fonction du niveau de priorité minimal pour les unités d'exécution utilisateur (une constante 40), de la valeur nice de l'unité d'exécution (20 par défaut, éventuellement définie par la commande nice ou la commande renice) et de sa pénalité d'utilisation du processeur.

La priorité d'une unité d'exécution peut être fixée à une certaine valeur, qui peut avoir une valeur de priorité inférieure à 40, si sa priorité est définie (fixe) via la sous-routine setpri(). Ces unités d'exécution sont immunisées contre les algorithmes de recalcul du planificateur. Si leurs valeurs de priorité sont fixées sur une valeur inférieure à 40, ces unités d'exécution s'exécuteront et se termineront avant que les unités d'exécution utilisateur ne puissent s'exécuter. Par exemple, une unité d'exécution dont la valeur fixe est 10 s'exécutera avant une unité d'exécution dont la valeur fixe est 15.

Les utilisateurs peuvent appliquer la commande nice pour rendre la priorité non fixe d'une unité d'exécution moins favorable. Le gestionnaire du système peut appliquer une valeur nice négative à une unité d'exécution, lui donnant ainsi une meilleure priorité.

L'illustration suivante montre certaines des manières dont la valeur de priorité peut changer.

Figure 1 : Mode de détermination de la valeur de priorité. L'illustration montre comment la valeur de priorité de planification d'une unité d'exécution peut changer lors de l'exécution ou après l'application de la commande nice. Plus la valeur de priorité est petite, plus la priorité de l'unité d'exécution est élevée. Au démarrage, la valeur nice par défaut est 20 et la priorité de base par défaut est 40. Après quelques exécutions et une pénalité du processeur, la valeur nice reste 20 et la priorité de base reste 40. Après l'exécution de la commande renice —5 et avec la même utilisation du processeur qu'auparavant, la valeur nice est maintenant de 15 et la priorité de base reste de 40. Après avoir émis la sous-routine setpri() avec une valeur de 50, la priorité fixe est maintenant 50 et la valeur nice et l'utilisation du processeur ne sont pas pertinentes.
Détermination de la valeur de priorité

La valeur nice d'une unité d'exécution est définie lorsque l'unité d'exécution est créée et est constante pendant toute la durée de vie de l'unité d'exécution, sauf si elle a été explicitement modifiée par l'utilisateur via la commande renice ou les appels système setpri(), setpriority(), thread_setsched() ou nice().

La pénalité du processeur est un entier qui est calculé à partir de l'utilisation récente du processeur d'une unité d'exécution. L'utilisation récente du processeur augmente d'environ 1 à chaque fois que l'unité d'exécution contrôle le processeur à la fin d'une graduation d'horloge de 10 ms, jusqu'à une valeur maximale de 120. La pénalité de priorité réelle par graduation augmente avec la valeur nice. Une fois par seconde, les valeurs d'utilisation du processeur pour toutes les unités d'exécution sont recalculées.

Le résultat est le suivant :

  • La priorité d'une unité d'exécution non fixe devient moins favorable à mesure que son utilisation récente du processeur augmente, et inversement. Cela implique qu'en moyenne, plus une unité d'exécution s'est vue attribuer de tranches de temps récemment, moins il est probable que l'unité d'exécution se verra attribuer la tranche de temps suivante.
  • La priorité d'une unité d'exécution non fixe devient moins favorable à mesure que sa valeur nice augmente, et inversement.
Remarque: Avec l'utilisation de plusieurs files d'attente d'exécution de processeur et de leur mécanisme d'équilibrage de charge, les valeurs nice ou renice peuvent ne pas avoir l'effet attendu sur les priorités d'unité d'exécution car les priorités moins favorisées peuvent avoir un temps d'exécution égal ou supérieur à celui des priorités favorisées. Les unités d'exécution nécessitant les effets attendus des valeurs nice ou renice doivent être placées dans la file d'attente d'exécution globale.

Vous pouvez utiliser la commande ps pour afficher la valeur de priorité, la valeur nice et les valeurs d'utilisation du processeur à court terme d'un processus.

Pour plus d'informations sur l'utilisation des commandes nice et renice , voir Contrôle des conflits pour le microprocesseur .

Voir Calcul de la valeur de priorité d'unité d'exécutionpour plus de détails sur le calcul de la pénalité de processeur et la diminution des valeurs d'utilisation de processeur récentes.

Le mécanisme de priorité est également utilisé par AIX Workload Manager pour appliquer la gestion des ressources processeur. Etant donné que les priorités des unités d'exécution classées dans le Gestionnaire de charge de travail sont gérées par le Gestionnaire de charge de travail, elles peuvent avoir un comportement de priorité différent de celui des unités d'exécution non classées dans le Gestionnaire de charge de travail.