Ответ
Инверсия приоритетов — это проблема планирования задач, при которой задача с высоким приоритетом вынуждена ожидать задачу с низким приоритетом, что нарушает ожидаемую иерархию приоритетов.
Классический сценарий:
- Низкоприоритетная задача (L) захватывает общий ресурс (например, мьютекс).
- Высокоприоритетная задача (H) запускается и пытается захватить тот же ресурс, но блокируется, ожидая L.
- Задача со средним приоритетом (M) запускается. Её приоритет выше, чем у L, но ниже, чем у H.
- Проблема: M выполняется, не давая L завершиться и освободить ресурс. Таким образом, H блокируется задачей M, хотя имеет более высокий приоритет.
Решения:
- Наследование приоритета (Priority Inheritance): Когда H блокируется на ресурсе L, приоритет L временно повышается до приоритета H, чтобы она могла быстрее завершиться и освободить ресурс.
- Протокол предельных приоритетов (Priority Ceiling Protocol): Каждому ресурсу назначается "предельный" приоритет. Задача, захватившая ресурс, временно получает этот приоритет.
Пример на Swift (Grand Central Dispatch): Используйте одинаковые QoS для задач, работающих с общим ресурсом, или механизмы вроде os_unfair_lock, которые частично смягчают эту проблему.