Planification des unités d'exécution

Les unités d'exécution peuvent être planifiées et la bibliothèque d'unités d'exécution fournit plusieurs fonctions permettant de gérer et de contrôler la planification des unités d'exécution.

Il fournit également des fonctions permettant de contrôler l'ordonnancement des unités d'exécution lors des opérations de synchronisation telles que le verrouillage d'un mutex. Chaque unité d'exécution possède son propre ensemble de paramètres de planification. Ces paramètres peuvent être définis à l'aide de l'objet d'attributs d'unité d'exécution avant la création de l'unité d'exécution. Les paramètres peuvent également être définis de manière dynamique lors de l'exécution de l'unité d'exécution.

Le contrôle de la planification d'une unité d'exécution peut être une tâche complexe. Etant donné que le planificateur gère toutes les unités d'exécution à l'échelle du système, les paramètres de planification d'une unité d'exécution interagissent avec ceux de toutes les autres unités d'exécution du processus et des autres processus. Les fonctions suivantes sont les premières à être utilisées si vous souhaitez contrôler la planification d'une unité d'exécution.

La bibliothèque d'unités d'exécution permet au programmeur de contrôler la planification de l'exécution des unités d'exécution de la manière suivante:
  • En définissant des attributs de planification lors de la création d'une unité d'exécution
  • En modifiant dynamiquement les attributs de planification d'une unité d'exécution créée
  • En définissant l'effet d'un mutex sur la planification de l'unité d'exécution lors de la création d'un mutex (appelé planification de la synchronisation)
  • En modifiant de manière dynamique la planification d'une unité d'exécution lors des opérations de synchronisation (appelée planification de la synchronisation)

Paramètres de planification

Une unité d'exécution possède les paramètres de planification suivants:

Paramètre Descriptif
portée La portée de conflit d'une unité d'exécution est définie par le modèle d'unité d'exécution utilisé dans la bibliothèque d'unités d'exécution.
Règle La règle de planification d'une unité d'exécution définit comment le planificateur traite l'unité d'exécution après avoir pris le contrôle de l'unité centrale.
priority La priorité de planification d'une unité d'exécution définit l'importance relative du travail effectué par chaque unité d'exécution.

Les paramètres de planification peuvent être définis avant la création de l'unité d'exécution ou lors de son exécution. En règle générale, le contrôle des paramètres de planification des unités d'exécution est important uniquement pour les unités d'exécution qui consomment beaucoup d'UC. Par conséquent, la bibliothèque d'unités d'exécution fournit des valeurs par défaut qui sont suffisantes dans la plupart des cas.

Utilisation de l'attribut inheritsched

L'attribut inheritsched de l'objet Attributs d'unité d'exécution indique comment les attributs de planification de l'unité d'exécution seront définis. Les valeurs admises sont les suivantes :

Valeurs Descriptif
PTHREAD_INHERIT_SCHED Indique que la nouvelle unité d'exécution obtient les attributs de planification (attributsschedpolicy et schedparam ) de son unité d'exécution de création. Les attributs de planification définis dans l'objet attributs sont ignorés.
PTHREAD_EXPLICIT_SCHED Indique que la nouvelle unité d'exécution obtient les attributs de planification définis dans cet objet d'attributs.

La valeur par défaut de l'attribut inheritsched est PTHREAD_INHERIT_SCHED. L'attribut est défini en appelant la sous-routine pthread_attr_setinheritsched . La valeur en cours de l'attribut est renvoyée par l'appel de la sous-routine pthread_attr_getinheritsched .

Pour définir les attributs de planification d'une unité d'exécution dans l'objet d'attributs d'unité d'exécution, l'attribut inheritsched doit d'abord être défini sur PTHREAD_EXPLICIT_SCHED. Sinon, les attributs de planification d'objet sont ignorés.

Politique et priorité de planification

La bibliothèque d'unités d'exécution fournit les règles de planification suivantes:

Bibliothèque Descriptif
SCHED_FIFO Planification FIFO (premier entré, premier sorti). Chaque unité d'exécution a une priorité fixe ; lorsque plusieurs unités d'exécution ont le même niveau de priorité, elles s'exécutent jusqu'à la fin dans l'ordre FIFO.
SCHED_RR Planification de la permutation circulaire (RR). Chaque unité d'exécution a une priorité fixe ; lorsque plusieurs unités d'exécution ont le même niveau de priorité, elles s'exécutent pour une tranche de temps fixe dans l'ordre FIFO.
SCHED_OTHER Ordonnancement AIX par défaut. Chaque unité d'exécution a une priorité initiale qui est modifiée dynamiquement par le planificateur, en fonction de l'activité de l'unité d'exécution. L'exécution de l'unité d'exécution est fractionnée dans le temps. Sur d'autres systèmes, cette règle de planification peut être différente.

Dans les versions d' AIX antérieures à 5.3, la modification de la priorité d'une unité d'exécution lors de la définition de sa règle de planification sur SCHED_OTHER n'est pas autorisée. Dans ce cas, le noyau gère directement la priorité et la seule valeur admise qui peut être transmise à la sous-routine pthread_setschedparam est la valeur DEFAULT_PRIO . La valeur DEFAULT_PRIO est définie comme 1 dans le fichier pthread.h et toutes les autres valeurs transmises sont ignorées.

A partir de AIX 5.3, vous pouvez modifier la priorité d'une unité d'exécution lorsque vous définissez sa règle de planification sur SCHED_OTHER. Les valeurs admises qui peuvent être transmises à la sous-routine pthread_setschedparam sont comprises entre 40 et 80. Toutefois, seuls les utilisateurs privilégiés peuvent définir une priorité supérieure à 60. Une priorité comprise entre 1 et 39 donne la même priorité que celle de 40, et une priorité comprise entre 81 et 127 donne la même priorité que celle de 80.

Remarque: dans AIX, le noyau inverse les niveaux de priorité. Pour le noyau AIX , la priorité est comprise entre 0 et 127, où 0 est la priorité la plus favorisée et 127 la priorité la moins favorisée. Les commandes, telles que la commande ps , indiquent la priorité du noyau.
La bibliothèque d'unités d'exécution gère la priorité via une structure sched_param , définie dans le fichier d'en-tête sys/sched.h . Cette structure contient les zones suivantes:
Zones Descriptif
sched_priority Indique la priorité.
sched_policy Cette zone est ignorée par la bibliothèque d'unités d'exécution. Ne pas utiliser.

Définition de la règle de planification et de la priorité au moment de la création

La règle de planification peut être définie lors de la création d'une unité d'exécution en définissant l'attribut schedpolicy de l'objet d'attributs d'unité d'exécution. La sous-routine pthread_attr_setschedpolicy définit la règle de planification sur l'une des règles de planification précédemment définies. La valeur actuelle de l'attribut schedpolicy d'un objet d'attributs d'unité d'exécution peut être obtenue à l'aide de la sous-routine pthread_attr_getschedpolicy .

La priorité de planification peut être définie au moment de la création d'une unité d'exécution en définissant l'attribut schedparam de l'objet d'attributs d'unité d'exécution. La sous-routine pthread_attr_setschedparam définit la valeur de l'attribut schedparam en copiant la valeur de la structure spécifiée. La sous-routine pthread_attr_getschedparam obtient l'attribut schedparam .

Dans le fragment de code suivant, une unité d'exécution est créée avec la règle de planification circulaire, à l'aide d'un niveau de priorité de 3:
sched_param schedparam;

schedparam.sched_priority = 3;

pthread_attr_init(&attr);
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
pthread_attr_setschedpolicy(&attr, SCHED_RR);
pthread_attr_setschedparam(&attr, &schedparam);

pthread_create(&thread, &attr, &start_routine, &args);
pthread_attr_destroy(&attr);
Pour plus d'informations sur l'attribut inheritsched , voir Utilisation de l'attribut inheritsched.

Définition des attributs de planification lors de l'exécution

La sous-routine pthread_getschedparam renvoie les attributs schedpolicy et schedparam d'une unité d'exécution. Ces attributs peuvent être définis en appelant la sous-routine pthread_setschedparam . Si l'unité d'exécution cible est en cours d'exécution sur un processeur, la nouvelle règle de planification et la nouvelle priorité seront implémentées lors de la prochaine planification de l'unité d'exécution. Si l'unité d'exécution cible n'est pas en cours d'exécution, elle peut être planifiée immédiatement à la fin de l'appel de la sous-routine.

Par exemple, considérons une unité d'exécution T qui s'exécute actuellement avec une règle de permutation circulaire au moment où l'attribut schedpolicy de T est remplacé par FIFO. T s'exécutera jusqu'à la fin de sa tranche de temps, date à laquelle ses attributs de planification seront réévalués. Si aucune unité d'exécution n'a de priorité plus élevée, T sera replanifiée, même avant les autres unités d'exécution ayant la même priorité. Prenons un deuxième exemple où une unité d'exécution à faible priorité n'est pas en cours d'exécution. Si la priorité de cette unité d'exécution est levée par une autre unité d'exécution appelant la sous-routine pthread_setschedparam , l'unité d'exécution cible est planifiée immédiatement si elle est l'unité d'exécution exécutable dont la priorité est la plus élevée.

Remarque: Les deux sous-routines utilisent un paramètre policy et une structure sched_param . Bien que cette structure contienne unesched_policy, les programmes ne doivent pas l'utiliser. Les sous-routines utilisent le paramètre policy pour transmettre la règle de planification et les sous-routines ignorent ensuite le paramètresched_policy:NONE.

Considérations relatives aux règles de planification

Les applications doivent utiliser la règle de planification par défaut, sauf si une application spécifique requiert l'utilisation d'une règle de planification à priorité fixe. Tenez compte des points suivants concernant l'utilisation des règles autres que les règles par défaut:
  • L'utilisation de la règle de permutation circulaire garantit que toutes les unités d'exécution ayant le même niveau de priorité seront planifiées de manière identique, quelle que soit leur activité. Cela peut être utile dans les programmes où les unités d'exécution doivent lire des capteurs ou des actionneurs d'écriture.
  • L'utilisation de la politique FIFO devrait être faite avec le plus grand soin. Une unité d'exécution s'exécutant avec une règle FIFO s'exécute jusqu'à sa fin, sauf si elle est bloquée par certains appels, tels que l'exécution d'opérations d'entrée et de sortie. Une unité d'exécution FIFO de priorité élevée ne peut pas être préemptée et peut affecter les performances globales du système. Par exemple, les unités d'exécution effectuant des calculs intensifs, tels que l'inversion d'une grande matrice, ne doivent jamais s'exécuter avec la règle FIFO.

La définition de la règle de planification et de la priorité est également influencée par la portée des conflits des unités d'exécution. L'utilisation de la règle FIFO ou de la règle de permutation circulaire n'est pas toujours autorisée.

sous-routine sched_yield

La sous-routine sched_yield est l'équivalent pour les unités d'exécution de la sous-routine yield . La sous-routine sched_yield force l'unité d'exécution appelante à renoncer à l'utilisation de son processeur et offre à d'autres unités d'exécution la possibilité d'être planifiées. L'unité d'exécution planifiée suivante peut appartenir au même processus que l'unité d'exécution appelante ou à un autre processus. N'utilisez pas la sous-routine yield dans un programme à unités d'exécution multiples.

La sous-routine pthread_yield de l'interface n'est pas disponible dans la spécification UNIX unique, version 2.