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