Portée des conflits et niveau d'accès concurrent

La portée des conflits d'une unité d'exécution utilisateur définit la façon dont elle est mappée à une unité d'exécution du noyau.

La bibliothèque d'unités d'exécution définit les portées de conflit suivantes:
PROCESSUS_PORTÉE_PTHREAD_PROCESSUS
Portée des conflits de processus, parfois appelée portée des conflits locaux. Indique que l'unité d'exécution sera planifiée pour toutes les autres unités d'exécution de portée de conflit local du processus. Une unité d'exécution utilisateur de portée de conflit de processus est une unité d'exécution utilisateur qui partage une unité d'exécution de noyau avec d'autres unités d'exécution utilisateur de portée de conflit de processus dans le processus. Toutes les unités d'exécution utilisateur d'un modèle d'unité d'exécution M:1 ont une portée de conflit de processus.

À partir d'AIX 7.3, cette portée de contention n'est plus prise en charge.

SYSTÈME_PORTÉE_PTHREAD_SYSTEM
Portée des conflits système, parfois appelée portée des conflits globaux. Indique que l'unité d'exécution est planifiée pour toutes les autres unités d'exécution du système et qu'elle est directement mappée à une unité d'exécution du noyau. Toutes les unités d'exécution utilisateur d'un modèle d'unité d'exécution 1: 1 ont une portée de conflit système.

A partir de AIX 7.3, seule cette portée de conflit est prise en charge.

Dans un modèle d'unité d'exécution M: N, les unités d'exécution utilisateur peuvent avoir une portée de conflit de système ou de processus. Par conséquent, un modèle d'unité d'exécution M: N est souvent appelé modèle à portée mixte .

Le niveau d'accès concurrent est une propriété des bibliothèques d'unités d'exécution M: N. Il définit le nombre de processeurs virtuels utilisés pour exécuter les unités d'exécution utilisateur de la portée des conflits de processus. Ce nombre ne peut pas dépasser le nombre d'unités d'exécution utilisateur de portée conflit de processus et est généralement défini de manière dynamique par la bibliothèque d'unités d'exécution. Le système définit également une limite au nombre d'unités d'exécution de noyau disponibles.

Définition de la portée des conflits

La portée des conflits ne peut être définie qu'avant la création d'une unité d'exécution en définissant l'attribut de portée des conflits d'un objet d'attributs d'unité d'exécution. La sous-routine pthread_attr_setscope définit la valeur de l'attribut ; pthread_attr_getscope la renvoie.

La portée des conflits n'est significative que dans une implémentation de bibliothèque M: N à portée mixte. Une routine TestImplementation peut être écrite comme suit:
int TestImplementation()
{
        pthread_attr_t a;
        int result;

        pthread_attr_init(&a);
        switch (pthread_attr_setscope(&a, PTHREAD_SCOPE_PROCESS))
        {
                case 0:          result = LIB_MN; break;
                case ENOTSUP:    result = LIB_11; break;
                case ENOSYS:     result = NO_PRIO_OPTION; break;
                default:         result = ERROR; break;
        }

        pthread_attr_destroy(&a);
        return result;
}

Impacts de la portée des conflits sur la planification

La portée des conflits d'une unité d'exécution influence sa planification. Chaque unité d'exécution de portée conflit est liée à une unité d'exécution de noyau. Ainsi, la modification de la règle de planification et de la priorité d'une unité d'exécution utilisateur globale entraîne la modification de la règle de planification et de la priorité de l'unité d'exécution du noyau sous-jacente.

Dans AIX, seules les unités d'exécution du noyau disposant de droits d'accès root peuvent utiliser une règle de planification à priorité fixe (FIFO ou round-robin). Le code suivant renvoie toujours le code d'erreur EPERM si l'unité d'exécution appelante a une portée de conflit système mais ne dispose pas des droits d'accès root. Ce code n'échouerait pas si l'unité d'exécution appelante avait une portée de conflit de processus.
schedparam.sched_priority = 3;
pthread_setschedparam(pthread_self(), SCHED_FIFO, schedparam);
Remarque: Les droits d'accès root ne sont pas requis pour contrôler les paramètres de planification des unités d'exécution utilisateur ayant une portée de conflit de processus.

Les unités d'exécution d'utilisateur local peuvent définir n'importe quelle règle et priorité de planification, dans la plage de valeurs valide. Toutefois, deux unités d'exécution ayant la même règle de planification et la même priorité mais ayant une portée de conflit différente ne seront pas planifiées de la même manière. Les unités d'exécution ayant une portée de conflit de processus sont exécutées par des unités d'exécution de noyau dont les paramètres de planification sont définis par la bibliothèque.