Что такое инверсия приоритетов в многопоточности?

«Что такое инверсия приоритетов в многопоточности?» — вопрос из категории Многопоточность, который задают на 22% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Инверсия приоритетов — это проблема планирования задач, при которой задача с высоким приоритетом вынуждена ожидать задачу с низким приоритетом, что нарушает ожидаемую иерархию приоритетов.

Классический сценарий:

  1. Низкоприоритетная задача (L) захватывает общий ресурс (например, мьютекс).
  2. Высокоприоритетная задача (H) запускается и пытается захватить тот же ресурс, но блокируется, ожидая L.
  3. Задача со средним приоритетом (M) запускается. Её приоритет выше, чем у L, но ниже, чем у H.
  4. Проблема: M выполняется, не давая L завершиться и освободить ресурс. Таким образом, H блокируется задачей M, хотя имеет более высокий приоритет.

Решения:

  • Наследование приоритета (Priority Inheritance): Когда H блокируется на ресурсе L, приоритет L временно повышается до приоритета H, чтобы она могла быстрее завершиться и освободить ресурс.
  • Протокол предельных приоритетов (Priority Ceiling Protocol): Каждому ресурсу назначается "предельный" приоритет. Задача, захватившая ресурс, временно получает этот приоритет.

Пример на Swift (Grand Central Dispatch): Используйте одинаковые QoS для задач, работающих с общим ресурсом, или механизмы вроде os_unfair_lock, которые частично смягчают эту проблему.