Что такое starvation и inversion приоритетов
Что проверяют
Различаете ли вы две разные патологии планирования и понимаете ли, как они выглядят именно в iOS, а не в учебнике по операционным системам. Хороший ответ называет механизмы, которыми система лечит инверсию сама, и случаи, когда она её не лечит.
Как отвечать
Голодание это ситуация, когда поток или задача сколь угодно долго не получает ресурс, потому что его постоянно забирают другие. В приложении это чаще всего исчерпание пула потоков: десятки блокирующих операций на конкурентной очереди порождают взрывной рост потоков, а в структурированной многозадачности Swift пул кооперативных потоков ограничен числом ядер, и каждая заблокированная задача выводит поток из оборота.
Инверсия приоритетов это когда высокоприоритетная работа ждёт ресурс, удерживаемый низкоприоритетной. Опасна неограниченная форма: пока низкоприоритетный держит замок, его вытесняет поток среднего приоритета, и высокоприоритетный ждёт фактически за спиной среднего неопределённо долго.
Система лечит частично. Работает наследование приоритета, последовательная очередь поднимает свой класс обслуживания при поступлении более приоритетного элемента, а sync передаёт класс вызывающего. Важная деталь: os_unfair_lock в передаче приоритета участвует, а ожидание на семафоре система зависимостью не считает и приоритет не поднимет.
Профилактика: не блокировать, а выстраивать асинхронную цепочку; прятать общее состояние за одной последовательной очередью или актором; не смешивать классы обслуживания на одном ресурсе.
Где спотыкаются
Путают инверсию приоритетов с инверсией управления, то есть с внедрением зависимостей. Совпадает только слово, механизмы не имеют друг к другу отношения, и такая подмена сразу закрывает тему.
Лечат зависание повышением класса обслуживания всему подряд. Голодание при этом не исчезает, меняется лишь то, кто именно голодает, потому что корень обычно в блокирующем ожидании, а не в расстановке приоритетов.
Блокируют семафором задачу, чтобы дождаться асинхронного результата. На маленьком кооперативном пуле это выводит потоки из оборота и даёт зависание, которое воспроизводится не на каждом устройстве и потому долго считается случайным.