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 priorité de transaction
Lors d'un appel de binder synchrone, un thread à priorité élevée peut être bloqué par un thread à faible priorité jusqu'à ce que ce dernier 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 priorité de transaction résout ce problème, car le pilote de binder modifie temporairement la priorité du thread de 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 priorité de nœud
Dans certaines situations, comme celles qui nécessitent une faible latence, la priorité des transactions asynchrones est importante.
L'héritage de priorité de nœud 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 priorité de nœud configuré, toutes les transactions du nœud s'exécutent à cette priorité minimale.
Les règles d'héritage de priorité de nœud sont les suivantes :
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 priorité de nœud
Pour configurer l'héritage de priorité de nœud, utilisez BBinder::setMinSchedulerPolicy.
Héritage de priorité en temps réel
Android utilise des stratégies de planification en temps réel, telles que SCHED_FIFO, pour que les threads essentiels en termes de latence terminent leur travail à temps. De plus, certaines tâches essentielles en termes de latence d'Android sont réparties sur deux processus ou plus.
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 plus élevées ont une priorité supérieure à celles 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).