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ż zadanie o niskim priorytecie korzysta z zasobu potrzebnego zadaniu o wysokim priorytecie. Aby zapobiec odwróceniu priorytetów, Android obsługuje uruchamianie wątków z różnymi priorytetami za pomocą 3 różnych form dziedziczenia priorytetów: dziedziczenia priorytetów transakcji, dziedziczenia priorytetów węzłów i dziedziczenia priorytetów w czasie rzeczywistym.

Na tej stronie opisujemy te różne formy dziedziczenia priorytetów.

Dziedziczenie priorytetów transakcji

Podczas wykonywania synchronicznego wywołania bindera wątek o wysokim priorytecie może zostać zablokowany przez wątek o niskim priorytecie, dopóki wątek o niskim priorytecie nie wyśle odpowiedzi. 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 priorytetów transakcji rozwiązuje ten problem, ponieważ sterownik bindera tymczasowo zmienia priorytet wątku bindera obsługującego transakcję, aby odpowiadał priorytetowi wywołującego. Po zakończeniu transakcji sterownik bindera przywraca poprzednią wartość priorytetu wątku bindera.

Dziedziczenie priorytetów węzłów

W niektórych sytuacjach, np. w przypadku transakcji wymagających niskiego opóźnienia, priorytet transakcji asynchronicznych ma znaczenie.

Dziedziczenie priorytetów węzłów umożliwia skonfigurowanie minimalnego priorytetu, z jakim powinny być uruchamiane wszystkie transakcje w węźle. Po skonfigurowaniu dziedziczenia priorytetów węzłów wszystkie transakcje w węźle są uruchamiane z tym minimalnym priorytetem.

Reguły dziedziczenia priorytetów węzłów są następujące:

  • Jeśli transakcja jest synchroniczna, priorytet staje się max(min_node_priority, caller_priority);.

  • Jeśli transakcja jest asynchroniczna, priorytet staje się max(default_priority (nice 0), min_node_priority);.

Konfigurowanie dziedziczenia priorytetów węzłów

Aby skonfigurować dziedziczenie priorytetów węzłów, użyj BBinder::setMinSchedulerPolicy.

Dziedziczenie priorytetów w czasie rzeczywistym

Android używa zasad planowania w czasie rzeczywistym, takich jak SCHED_FIFO, aby wątki krytyczne pod względem opóźnienia mogły wykonywać swoje zadania na czas. Ponadto niektóre zadania krytyczne pod względem opóźnienia w Androidzie są podzielone na 2 lub więcej procesów.

Dziedziczenie priorytetów w czasie rzeczywistym działa identycznie jak wartości nice, z tym że:

  • Dziedziczenie priorytetów w czasie rzeczywistym jest domyślnie wyłączone.
  • Wyższe wartości priorytetu w czasie rzeczywistym mają wyższy priorytet niż mniejsze wartości.

Włączanie dziedziczenia priorytetów w czasie rzeczywistym

Dziedziczenie priorytetów w czasie rzeczywistym musi być włączone w przypadku poszczególnych węzłów za pomocą wywołania BBinder::setInheritRt(true).