Bei der Prioritätsinversion wird eine Transaktion mit hoher Priorität durch eine Aufgabe mit niedriger Priorität verzögert, weil die Aufgabe mit niedriger Priorität eine Ressource enthält, die für die Aufgabe mit hoher Priorität erforderlich ist. Um die Prioritätsinversion zu minimieren, unterstützt Android die Ausführung von Threads mit unterschiedlichen Prioritäten durch drei verschiedene Formen der Prioritätsvererbung: Transaktionsprioritätsvererbung, Knotenprioritätsvererbung und Echtzeitprioritätsvererbung.
Auf dieser Seite werden die verschiedenen Formen der Prioritätsvererbung erläutert.
Übernahme der Transaktionspriorität
Bei einem synchronen Binder-Aufruf kann ein Thread mit hoher Priorität von einem Thread mit niedriger Priorität blockiert werden, bis der Thread mit niedriger Priorität eine Antwort gesendet hat. Ein Thread mit dem Nice-Wert -19 kann beispielsweise von einem Thread mit dem Standard-Nice-Wert 0 blockiert werden.
Die Übernahme der Transaktionspriorität behebt dieses Problem, da der Binder-Treiber die Priorität des Binder-Threads, der die Transaktion verarbeitet, vorübergehend an die Priorität des Aufrufers anpasst. Wenn die Transaktion abgeschlossen ist, stellt der Binder-Treiber die Priorität des Binder-Threads auf den vorherigen Wert zurück.
Vererbung der Knotenpriorität
In einigen Situationen, z. B. wenn eine geringe Latenz erforderlich ist, ist die Priorität asynchroner Transaktionen wichtig.
Mit der Knotenprioritätsvererbung können Sie die Mindestpriorität konfigurieren, mit der alle Transaktionen auf einem Knoten ausgeführt werden sollen. Nachdem die Prioritätsvererbung für Knoten konfiguriert wurde, werden alle Transaktionen auf dem Knoten mit dieser Mindestpriorität ausgeführt.
Die Regeln für die Übernahme der Knotenpriorität sind:
Wenn die Transaktion synchron ist, wird die Priorität auf
max(min_node_priority, caller_priority);
festgelegt.Wenn die Transaktion asynchron ist, wird die Priorität auf
max(default_priority (nice 0), min_node_priority);
festgelegt.
Prioritätsvererbung für Knoten konfigurieren
Verwenden Sie BBinder::setMinSchedulerPolicy
, um die Prioritätsvererbung für Knoten zu konfigurieren.
Echtzeit-Prioritätsvererbung
Android verwendet Echtzeit-Scheduling-Richtlinien wie SCHED_FIFO
, damit latenzkritische Threads ihre Arbeit rechtzeitig abschließen. Außerdem werden einige latenzkritische Aufgaben von Android auf zwei oder mehr Prozesse aufgeteilt.
Die Echtzeit-Prioritätsübernahme funktioniert identisch mit Nice-Werten, mit folgenden Ausnahmen:
- Die Echtzeit-Prioritätsvererbung ist standardmäßig deaktiviert.
- Höhere Echtzeit-Prioritätswerte haben eine höhere Priorität als niedrigere Werte.
Echtzeit-Prioritätsvererbung aktivieren
Die Echtzeit-Prioritätsvererbung muss für einzelne Knoten mit dem BBinder::setInheritRt(true)
-Aufruf aktiviert werden.