Может ли инверсия приоритетов происходить в Android
Инверсия приоритетов - это проблема, которая может возникнуть во время планирования потоков / процессов из-за приоритетов, связанных с ними.
Инверсия приоритетов - это проблемный сценарий в планировании, в котором задача с высоким приоритетом косвенно вытесняется задачей со средним приоритетом, которая эффективно "инвертирует" относительные приоритеты двух задач - Википедия
Интересно, может ли инверсия приоритетов произойти в Android, так как мы знаем, что Android предоставляет разные процессы с разными приоритетами, см. Этот пост. Также мы можем создать несколько потоков (в действиях и сервисах) с разными приоритетами, как они вписываются в этот сценарий? Я видел статью, в которой говорится о планировании потоков в Android. Если произошла инверсия приоритета, как мы можем обнаружить и избежать ее?
Когда я искал ответы на этот вопрос, я нашел эту страницу на Android, которая говорит нам, как избежать инверсии приоритетов в контексте аудиосистемы Android.
1 ответ
Краткий ответ
Да, в Android может произойти инверсия приоритетов, как подробно описано в предоставленной вами ссылке.
Эта проблема
Любая система, которая позволяет задачам с разными приоритетами блокировать один и тот же общий ресурс, уязвима для инверсии приоритетов, если только не предприняты шаги для ее предотвращения. Вы упомянули потоки и процессы - в Android состояние может быть разделено между процессами и потоками, что делает их обоих уязвимыми для инверсии приоритетов.
Основная проблема, связанная с инверсией приоритетов, состоит в том, что задачам с более низким приоритетом дается меньше циклов ЦП для выполнения. Если чувствительная ко времени задача с высоким приоритетом заблокирована задачей с низким приоритетом, возможно, ей придется ждать недопустимо долгое время для выполнения и либо вызвать сбой где-то в вашей системе, либо ухудшить взаимодействие с пользователем.
Традиционное решение
Традиционным решением этого является приоритет наследования. При наследовании приоритетов задача (поток или процесс), которая содержит общий ресурс, будет временно наследовать приоритет задачи с наивысшим приоритетом, которая блокирует этот ресурс. Это решает проблему, поскольку задача с низким приоритетом будет выполняться намного быстрее, освобождая ресурсы для чувствительной ко времени задачи.
Футексы (быстрые мьютексы пространства пользователя) с этой возможностью доступны в ядре Linux. Однако они не доступны в стандартной библиотеке C Android из-за проблем безопасности и из-за большого количества накладных расходов.
Android-решение
Android Open Source Project рекомендует несколько различных подходов к решению проблемы инверсии приоритетов.
- "try lock" / lock with timeout - установить некоторый период времени ожидания того, как долго задача с низким приоритетом может удерживать мьютекс, что повышает вероятность того, что задача с высоким приоритетом может получить доступ вовремя. Недостатком является наличие последовательности несвязанных задач с низким приоритетом с длительным совокупным тайм-аутом.
- В некоторых случаях мьютекс или другой примитив синхронизации могут быть заменены соответствующим набором атомарных операций вместе с Symmetric Multiprocessing. Руководство по этому предоставлено здесь.
- Вы также можете реализовать очередь задач FIFO без единого считывателя и одного записывающего устройства. Это описано здесь и здесь.
Основная тема, общая для всех этих методов, состоит в том, чтобы минимизировать количество блокировок ресурсов, совместно используемых высокоуровневыми рассками, или смягчить их последствия, если их действительно невозможно удалить. В настоящее время все эти методы используются в Android для уменьшения проблем с инверсией приоритетов.
обнаружение
Трудно автоматически обнаружить инверсию приоритета до того, как она произойдет. Если вы подозреваете, что это происходит, вы можете проверить свою гипотезу, используя такие инструменты, как systrace
а также ps -t -p
проверить количество времени, которое ваши различные процессы тратят на выполнение и блокировку. Лучший совет - хорошо понимать различные части системы, с которыми вы имеете дело, и проблему инверсии приоритетов.