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

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

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

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

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

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

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

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

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

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

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

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

Как настроить наследование приоритета узла

Чтобы настроить наследование приоритета узла, используйте BBinder::setMinSchedulerPolicy.

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

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

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

  • По умолчанию наследование приоритета в реальном времени отключено.
  • Чем выше значение приоритета в реальном времени, тем выше приоритет.

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

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