Swift iOS Interview Вопросы и ответы – Часть 3 – Многопоточность и параллелизм

Перевод статьи https://ishtiz.com/swift/swift-ios-interview-questions-and-answers-part-3

Часть 3 состоит из вопросов и ответов для интервью Swift iOS по потокам, очередям и параллелизму. Она будет охватывать темы, связанные с параллелизмом, такие как GCD, NSOperation, очередь операций, блокировка, семафор и т. д.

В: Что такое GCD?
О: GCD — это библиотека, которая предоставляет низкоуровневый объектно-ориентированный API для одновременного выполнения задач при управлении потоками за кулисами. GCD абстрагирует код управления потоками и перемещает его на системный уровень, предоставляя легкий API для определения задач и их выполнения в соответствующей очереди отправки.

В: Что такое очередь отправки(dispatch queue)?
О: Очередь отвечает за выполнение задачи в порядке FIFO.

В: Объясните основной поток и как его можно использовать?
О: В iOS основной поток приложения — это глобально доступная последовательная очередь. Основной поток должен использоваться для всех представлений, а элементы интерфейса не должны блокироваться длительными задачами. Разработчик должен избегать функций, использующих основной поток для загрузки данных, изображений и т. д.

В: Что такое последовательная(serial) очередь?
О: Последовательная очередь запускает задачи последовательно в порядке добавления, для запуска следующей задачи необходимо дождаться завершения выполнения текущей.

В: Что такое параллельная(concurrent) очередь?
О: Параллельная очередь может запускать столько задач, сколько может, не дожидаясь завершения запущенных задач.

В: Какие три типа очередей предоставляет GCD?
О: GCD предоставляет три типа очередей:
– main – основная последовательная(serial) очередь – выполняется в основном потоке
– global – глобальная параллельная очередь(concurrent) – работает с разными приоритетами и используется всей системой
– пользовательская очередь: последовательная/параллельная очередь.

В: Что такое Quality of Service(QoS) в GCD?
О: QoS является приоритетом для выполнения задачи в GCD. Задача, имеющая более высокий приоритет, будет обработна раньше.
Quality of Service(QoS) от высшего приоритета к низшему:
User Interactive: работа, которая происходит в основном потоке, например анимация или операции рисования
User Initiated: работа, которую запускает пользователь и которая должна дать немедленные результаты, эта работа должна быть завершена, чтобы пользователь мог продолжить
Utility: работа, которая может занять немного времени и не требует немедленного завершения, аналогично индикаторам выполнения и импорту данных
Background: эта работа не видна пользователю: резервное копирование, синхронизация, индексация и т. д.

В: Что такое состояние гонки(race condition)?
О: Состояние гонки возникает, когда два или более потока могут получить доступ к общим данным и одновременно попытаться их изменить.

В: Что такое инверсия приоритета(priority inversion)?
О: Инверсия приоритета — это критическое состояние многопоточности, когда поток с низким приоритетом блокирует выполнение потока с высоким приоритетом и делает назначенные приоритеты бессмысленными для потока.

В: Что такое взаимная блокировка(deadlock)?
О: Взаимная блокировка возникает, когда две, а иногда и более задачи ждут завершения другой, и ни одна из них никогда не завершится.

В: Что такое многопоточность(concurrency) и разделение времени(time slicing)?
О: Многопоточность — это структурный способ запуска нескольких задач одновременно. Разделение времени используется для обеспечения многопоточности на одном основном устройстве. В случае использования разделения времени на одноядерном устройстве — один поток будет выполняться в определенное время и выполнять переключение контекста, затем будет выполняться другой поток. Многоядерные устройства могут одновременно запускать несколько потоков посредством многопоточности.

В: Что такое NSOperation?
О: NSOperation построен на основе GCD. При использовании NSOperation разработчик может добавлять зависимости между различными операциями и повторно использовать, отменять и приостанавливать операции. Конечно, то же самое можно реализовать и через GCD, но это добавит дополнительных накладных расходов.

В: Что такое NSBlockOperation?
О: NSBlockOperation помогает реализовать NSOperation из одного или нескольких замыканий. NSBlockOperation может иметь несколько блоков, которые могут выполняться одновременно.

В: Что такое ThreadPool?
О: ThreadPool — это пул потоков, который повторно использует фиксированное количество потоков для выполнения конкретной задачи.

В: Что используется для бездействия потока?
О: sleep(forTimeInterval:) приостанавливает поток на заданный интервал времени.

В: Объясните разницу между многопоточностью и параллелизмом?
О: Многопоточность — это когда две или более задач могут запускаться, выполняться и завершаться в перекрывающиеся периоды времени. Это не обязательно означает, что они когда-либо будут работать одновременно.
Параллелизм — это когда задачи выполняются буквально одновременно.
Это выступление Роба Пайка очень полезно для понимания концепции.

В: Что такое semaphore?
О: Семафоры дают нам возможность контролировать доступ к общему ресурсу несколькими потоками. Семафор состоит из очереди потоков и значения счетчика. Значение счетчика используется семафором, чтобы решить, должен ли поток получить доступ к общему ресурсу или нет. Значение счетчика изменяется, когда мы вызываем функции signal() или wait().

В: Что такое Task?
О: Task был представлен ​​в среде параллелизма на WWDC 2021. С помощью task мы можем просто создать параллельный контекст из непараллельного метода, вызывая методы с помощью async/await. Между очередями отправки и задачами есть много общего, и задачи кажутся более удобными для разработчиков с меньшим количеством кода. И задача, и очередь отправки могут обслуживать некоторую работу в другом потоке с приоритетом по умолчанию/определяемым пользователем.

В: Что такое Actor?
О: Actor в Swift работает как потокобезопасный класс, который можно безопасно использовать в параллельной среде. Компилятор Swift гарантирует, что ни один участок кода из другого потока не сможет одновременно получить доступ к данным actor. Этот подход обеспечивает безопасность по умолчанию без написания шаблонного кода с использованием семафора/блокировки.

В: Что такое TaskGroup?
О: TaskGroup в Swift — это набор задач, которые работают вместе для получения результата. Каждая задача внутри группы задач может генерировать данные частичного результата, которые будут использоваться для получения ожидаемого результата. Очень распространенным примером использования группы задач является создание коллажа путем загрузки нескольких изображений из сети.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *