Инверсия приоритетов — это ситуация, когда высокоприоритетная транзакция задерживается низкоприоритетной задачей, поскольку низкоприоритетная задача удерживает ресурс, необходимый высокоприоритетной задаче. Для предотвращения инверсии приоритетов 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)
.