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.
- 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.
| 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 .
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.
Considérations relatives aux règles de planification
- 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.