Изменится ли порядок выполнения задач при использовании очереди user-initiated вместо background в iOS?
Что проверяют
Понимаете ли вы, что QoS в GCD управляет приоритетом и ресурсами, а не порядком выполнения. Обычно вопрос идёт с кодом из пары async на разных глобальных очередях и просьбой предсказать вывод. Следом спрашивают, как гарантировать порядок и что такое инверсия приоритетов.
Как отвечать
Короткий ответ: порядок не был гарантирован и не станет гарантированным. Меняется вероятность и скорость, но не семантика.
- иерархия QoS:
.userInteractive,.userInitiated,.default,.utility,.background. Чем выше класс, тем раньше поток получает CPU и тем меньше троттлинг ввода-вывода; - глобальные очереди конкурентные:
DispatchQueue.global(qos:)забирает задачи по FIFO, но выполняет их параллельно на нескольких потоках, и завершаются они в любом порядке. На многоядерном устройстве задачи с.userInitiatedи.backgroundвполне идут одновременно; - что даёт замена
backgroundнаuserInitiated: задача вероятнее стартует и закончится раньше, особенно под нагрузкой..backgroundсистема может сильно придержать, например в режиме энергосбережения; - как гарантировать порядок: последовательная очередь (её FIFO от QoS не зависит), зависимости в
OperationQueueчерезaddDependency,DispatchGroupсnotify, в Swift Concurrency последовательныеawait. УTaskестьpriority, но это та же подсказка планировщику, а не очерёдность.
Отдельно назовите инверсию приоритетов: высокоприоритетная задача ждёт работу низкого класса. GCD повышает QoS последовательной очереди, если в неё ставят более приоритетную работу или ждут её через sync. Семафор такой информации не несёт, и поток с .userInitiated может надолго застрять на DispatchSemaphore.wait().
Где спотыкаются
Отвечают «да, сначала выполнятся задачи userInitiated, потом background». Это вероятное поведение, а не гарантия, и код, который на него рассчитывает, содержит гонку.
Кладут в .background работу, результат которой пользователь ждёт на экране, и получают заметные задержки, особенно в режиме энергосбережения.
Чинят порядок повышением приоритета вместо явной синхронизации.