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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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