Приоритетное наследование

Инверсия приоритетов — это ситуация, когда транзакция с высоким приоритетом задерживается задачей с низким приоритетом, поскольку задача с низким приоритетом удерживает ресурс, необходимый задаче с высоким приоритетом. Для смягчения последствий инверсии приоритетов Android поддерживает запуск потоков с разными приоритетами с помощью трех различных форм наследования приоритетов: наследование приоритетов транзакций, наследование приоритетов узлов и наследование приоритетов в реальном времени.

На этой странице объясняются различные формы наследования приоритета.

Наследование приоритетов транзакций

При выполнении синхронного вызова binder поток с высоким приоритетом может быть заблокирован потоком с низким приоритетом до тех пор, пока последний не отправит ответ. Например, поток со значением nice, равным -19, может быть заблокирован потоком со значением nice по умолчанию, равным 0.

Наследование приоритета транзакций решает эту проблему, поскольку драйвер связывателя временно изменяет приоритет потока связывателя, обрабатывающего транзакцию, в соответствии с приоритетом вызывающего потока. После завершения транзакции драйвер связывателя восстанавливает приоритет потока связывателя до его предыдущего значения.

Наследование приоритетов узлов

В некоторых ситуациях, например, когда требуется низкая задержка, приоритет асинхронных транзакций имеет значение.

Наследование приоритетов узлов позволяет настроить минимальный приоритет, с которым должны выполняться все транзакции на узле. После настройки наследования приоритетов узлов все транзакции на узле будут выполняться с этим минимальным приоритетом.

Правила наследования приоритета узлов следующие:

  • Если транзакция синхронная, приоритет становится max(min_node_priority, caller_priority); .

  • Если транзакция асинхронная, приоритет становится max(default_priority (nice 0), min_node_priority); .

Настройка наследования приоритетов узлов

Для настройки наследования приоритетов узлов используйте BBinder::setMinSchedulerPolicy .

Наследование приоритетов в реальном времени

Android использует политики планирования в реальном времени, такие как SCHED_FIFO , чтобы критически важные по задержке потоки завершали свою работу вовремя. Кроме того, часть критически важных по задержке задач в Android распределяется между двумя или более процессами.

Наследование приоритетов в реальном времени работает идентично обычным значениям, за исключением следующих моментов:

  • Наследование приоритетов в реальном времени по умолчанию отключено.
  • Более высокие значения приоритета в реальном времени имеют более высокий приоритет, чем меньшие значения.

Включить наследование приоритетов в реальном времени

Для отдельных узлов необходимо включить наследование приоритетов в реальном времени с помощью вызова BBinder::setInheritRt(true) .