Odwrócenie priorytetów to sytuacja, w której transakcja o wysokim priorytecie jest opóźniona przez zadanie o niskim priorytecie, ponieważ to zadanie wykorzystuje zasób potrzebny do wykonania transakcji o wysokim priorytecie. Aby zapobiec odwróceniu priorytetów, Android obsługuje uruchamianie wątków z różnymi priorytetami za pomocą 3 rodzajów dziedziczenia priorytetów: dziedziczenia priorytetów transakcji, dziedziczenia priorytetów węzłów i dziedziczenia priorytetów w czasie rzeczywistym.
Na tej stronie opisujemy różne formy dziedziczenia priorytetu.
Dziedziczenie priorytetu transakcji
Podczas wykonywania synchronicznego wywołania bindera wątek o wysokim priorytecie może zostać zablokowany przez wątek o niskim priorytecie do momentu, gdy ten ostatni wyśle odpowiedź. Na przykład wątek o wartości nice –19 może zostać zablokowany przez wątek o domyślnej wartości nice 0.
Dziedziczenie priorytetu transakcji rozwiązuje ten problem, ponieważ sterownik bindera tymczasowo zmienia priorytet wątku bindera obsługującego transakcję, aby był zgodny z priorytetem wywołującego. Po zakończeniu transakcji sterownik przywraca poprzednią wartość priorytetu wątku usługi Binder.
Dziedziczenie priorytetu węzła
W niektórych sytuacjach, np. gdy wymagane jest niskie opóźnienie, priorytet transakcji asynchronicznych ma znaczenie.
Dziedziczenie priorytetu węzła umożliwia skonfigurowanie minimalnego priorytetu, z jakim powinny być wykonywane wszystkie transakcje w węźle. Po skonfigurowaniu dziedziczenia priorytetu węzła wszystkie transakcje w węźle będą wykonywane z tym minimalnym priorytetem.
Reguły dziedziczenia priorytetu węzła są następujące:
Jeśli transakcja jest synchroniczna, priorytet zmienia się na
max(min_node_priority, caller_priority);
.Jeśli transakcja jest asynchroniczna, priorytet zmienia się na
max(default_priority (nice 0), min_node_priority);
.
Konfigurowanie dziedziczenia priorytetu węzła
Aby skonfigurować dziedziczenie priorytetu węzła, użyj BBinder::setMinSchedulerPolicy
.
Dziedziczenie priorytetu w czasie rzeczywistym
Android używa zasad planowania w czasie rzeczywistym, takich jak SCHED_FIFO
, aby wątki o krytycznym znaczeniu dla opóźnień mogły wykonywać swoją pracę na czas. Dodatkowo niektóre zadania Androida, które wymagają niskich opóźnień, są rozdzielone na 2 lub więcej procesów.
Dziedziczenie priorytetu w czasie rzeczywistym działa identycznie jak wartości nice, z tymi wyjątkami:
- Dziedziczenie priorytetu w czasie rzeczywistym jest domyślnie wyłączone.
- Większe wartości priorytetu w czasie rzeczywistym mają wyższy priorytet niż mniejsze wartości.
Włączanie dziedziczenia priorytetu w czasie rzeczywistym
Dziedziczenie priorytetu w czasie rzeczywistym musi być włączone dla poszczególnych węzłów za pomocą wywołania BBinder::setInheritRt(true)
.