L'inversion de priorité se produit lorsqu'une transaction à priorité élevée est retardée par une tâche à faible priorité, car cette dernière détient une ressource nécessaire à la tâche à priorité élevée. Pour atténuer l'inversion de priorité, Android permet d'exécuter des threads à différentes priorités grâce à trois formes différentes d'héritage de priorité : l'héritage de priorité de transaction, l'héritage de priorité de nœud et l'héritage de priorité en temps réel.
Cette page explique ces différentes formes d'héritage de priorité.
Héritage de la priorité des transactions
Lors d'un appel de liaison synchrone, un thread à priorité élevée peut être bloqué par un thread à priorité faible jusqu'à ce que le thread à priorité faible ait envoyé une réponse. Par exemple, un thread avec une valeur nice de -19 peut être bloqué par un thread avec une valeur nice par défaut de 0.
L'héritage de la priorité des transactions corrige ce problème, car le pilote Binder modifie temporairement la priorité du thread Binder qui gère la transaction pour qu'elle corresponde à celle de l'appelant. Une fois la transaction terminée, le pilote de binder rétablit la priorité du thread de binder à sa valeur précédente.
Héritage de la priorité des nœuds
Dans certaines situations, comme celles qui nécessitent une faible latence, la priorité des transactions asynchrones est importante.
L'héritage de la priorité des nœuds vous permet de configurer la priorité minimale à laquelle toutes les transactions d'un nœud doivent s'exécuter. Une fois l'héritage de la priorité des nœuds configuré, toutes les transactions sur le nœud s'exécutent à cette priorité minimale.
Voici les règles d'héritage de la priorité des nœuds :
Si la transaction est synchrone, la priorité devient
max(min_node_priority, caller_priority);
.Si la transaction est asynchrone, la priorité devient
max(default_priority (nice 0), min_node_priority);
.
Configurer l'héritage de la priorité des nœuds
Pour configurer l'héritage de la priorité des nœuds, utilisez BBinder::setMinSchedulerPolicy
.
Héritage de priorité en temps réel
Android utilise des règles de planification en temps réel, telles que SCHED_FIFO
, pour que les threads critiques en termes de latence terminent leur travail à temps. De plus, certaines tâches critiques en termes de latence d'Android sont réparties sur plusieurs processus.
L'héritage de priorité en temps réel fonctionne de la même manière que les valeurs nice, sauf que :
- L'héritage de priorité en temps réel est désactivé par défaut.
- Les valeurs de priorité en temps réel les plus élevées ont une priorité plus élevée que les valeurs plus faibles.
Activer l'héritage de priorité en temps réel
L'héritage de priorité en temps réel doit être activé pour les nœuds individuels à l'aide de l'appel BBinder::setInheritRt(true)
.