Prioritätsübernahme

Bei der Prioritätsumkehr 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 belegt, die von der Aufgabe mit hoher Priorität benötigt wird. Um die Prioritätsumkehr zu vermeiden, 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 diese verschiedenen Formen der Prioritätsvererbung erläutert.

Transaktionsprioritätsvererbung

Bei einem synchronen Binder-Aufruf kann ein Thread mit hoher Priorität durch einen Thread mit niedriger Priorität blockiert werden, bis der Thread mit niedriger Priorität eine Antwort gesendet hat. Beispielsweise kann ein Thread mit einem Nice-Wert von -19 durch einen Thread mit einem Standard-Nice-Wert von 0 blockiert werden.

Die Transaktionsprioritätsvererbung behebt dieses Problem, da der Binder-Treiber die Priorität des Binder-Threads, der die Transaktion verarbeitet, vorübergehend so ändert, dass sie der Priorität des Aufrufers entspricht. Nach Abschluss der Transaktion stellt der Binder-Treiber die Priorität des Binder-Threads auf den vorherigen Wert zurück.

Knotenprioritätsvererbung

In einigen Situationen, z. B. bei niedriger Latenz, 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 Knotenprioritätsvererbung konfiguriert wurde, werden alle Transaktionen auf dem Knoten mit dieser Mindestpriorität ausgeführt.

Die Regeln für die Knotenprioritätsvererbung sind:

  • Wenn die Transaktion synchron ist, wird die Priorität zu max(min_node_priority, caller_priority);.

  • Wenn die Transaktion asynchron ist, wird die Priorität zu max(default_priority (nice 0), min_node_priority);.

Knotenprioritätsvererbung konfigurieren

Verwenden Sie BBinder::setMinSchedulerPolicy, um die Knotenprioritätsvererbung zu konfigurieren.

Echtzeitprioritätsvererbung

Android verwendet Echtzeit-Planungsrichtlinien wie SCHED_FIFO, damit latenzkritische Threads ihre Arbeit rechtzeitig abschließen können. Außerdem wird ein Teil der latenzkritischen Arbeit von Android auf zwei oder mehr Prozesse aufgeteilt.

Die Echtzeitprioritätsvererbung funktioniert genauso wie Nice-Werte, mit folgenden Ausnahmen:

  • Die Echtzeitprioritätsvererbung ist standardmäßig deaktiviert.
  • Höhere Echtzeitprioritätswerte haben eine höhere Priorität als niedrigere Werte.

Echtzeitprioritätsvererbung aktivieren

Die Echtzeitprioritätsvererbung muss für einzelne Knoten mit dem Aufruf BBinder::setInheritRt(true) aktiviert werden.