Может ли инверсия приоритетов происходить в 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 проверить количество времени, которое ваши различные процессы тратят на выполнение и блокировку. Лучший совет - хорошо понимать различные части системы, с которыми вы имеете дело, и проблему инверсии приоритетов.

Другие вопросы по тегам