Dziedziczenie priorytetów

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).