← Назад к вопросам

Как исполняются потоки на ЦПУ?

2.8 Senior🔥 182 комментариев
#Многопоточность и асинхронность

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как работают потоки на уровне процессора

Потоки в iOS (также известные как потоки выполнения или threads) представляют собой наименьшую единицу исполнения кода, которую может планировать операционная система. На уровне процессора их исполнение — это сложный процесс, управляемый микроядром операционной системы (в случае iOS — XNU, объединяющего Mach и BSD).

Основные принципы исполнения потоков на CPU

1. Планирование потоков (Thread Scheduling)

Процессор (CPU) в любой момент времени исполняет только один поток на одном ядре. Когда потоков больше, чем ядер, операционная система использует планировщик (scheduler), который решает, какой поток получит процессорное время. В iOS используется вытесняющая многозадачность (preemptive multitasking), где планировщик может приостановить любой поток (даже системный) и передать управление другому.

// Пример создания потока в iOS
let thread = Thread {
    print("Поток выполняется на ядре \(Thread.current)")
    // CPU выполняет этот код, когда планировщик дает потоку время
}
thread.start()

2. Контекст потока (Thread Context)

Каждый поток имеет свой контекст выполнения, который включает:

  • Состояние регистров CPU (программный счетчик, указатель стека, регистры общего назначения)
  • Стек потока (отдельная область памяти для локальных переменных и адресов возврата)
  • Приоритет потока (в iOS от .background до .userInteractive)

Когда планировщик переключается между потоками, он сохраняет контекст текущего потока и загружает контекст следующего — это называется переключением контекста (context switch). Это дорогостоящая операция (сотни тактов CPU), поэтому iOS оптимизирует переключения.

3. Состояния потока

Поток может находиться в нескольких состояниях:

  • Выполняющийся (Running) — использует ядро CPU прямо сейчас
  • Готовый (Runnable) — ждет выделения процессорного времени
  • Заблокированный (Blocked) — ожидает ресурс (I/O, мьютекс, семафор)
  • Завершенный (Terminated) — исполнение закончено

Технические особенности в iOS

Многоядерные процессоры

Современные iPhone имеют многоядерные процессоры (до 6 ядер в A17 Pro). Каждое ядро может исполнять отдельный поток одновременно:

  • Performance-ядра — для интенсивных вычислений
  • Efficiency-ядра — для фоновых задач с низким энергопотреблением
// Система сама распределяет потоки по ядрам
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{
    // Этот блок может быть исполнен на любом доступном ядре
    // ОС учитывает тип QoS при выборе ядра
});

Приоритеты и Quality of Service (QoS)

iOS использует систему QoS классов для управления приоритетами:

  1. User-interactive — самый высокий приоритет, для анимаций UI
  2. User-initiated — действия, инициированные пользователем
  3. Default — стандартный приоритет
  4. Utility — длительные задачи
  5. Background — фоновые операции

Планировщик учитывает QoS при распределении CPU-времени, чтобы обеспечить плавный UI.

Особенности архитектуры Apple Silicon

Процессоры Apple Silicon используют:

  • Гетерогенную архитектуру — разные типы ядер для разных задач
  • Унифицированную память — CPU и GPU обращаются к одной памяти, что ускоряет обмен данными между потоками
  • Energy Aware Scheduling — планировщик учитывает энергопотребление

Пример переключения потоков

Представьте сценарий с двумя потоками:

  1. Поток A вычисляет сложную анимацию (user-interactive)
  2. Поток B загружает данные из сети (utility)
Время | Ядро 1        | Ядро 2
------|---------------|---------------
t1    | Поток A       | Поток B
t2    | Поток A       | (ожидание сети)
t3    | Поток A       | Другой поток
t4    | (завершен)    | Поток B продолжается

Планировщик может приостановить Поток B на время ожидания сети, освободив ядро для других задач, а затем возобновить его при получении данных.

Оптимизации в iOS

  1. Кооперативные очереди (GCD) — система управляет пулом потоков, переиспользуя их
  2. Thread explosion prevention — ограничение количества создаваемых потоков
  3. Affinity hints — попытка исполнять связанные задачи на одном ядре (для кэша CPU)
  4. Спящий режим ядер — отключение неиспользуемых ядер для экономии энергии

Практические рекомендации для разработчика

  • Не создавайте потоки напрямую — используйте GCD или OperationQueue
  • Указывайте правильный QoS для своих задач
  • Избегайте блокировок потоков — используйте асинхронные API
  • Учитывайте энергоэффективность — интенсивные вычисления на performance-ядрах

Исполнение потоков на CPU в iOS — это баланс между производительностью, отзывчивостью UI и энергопотреблением. Планировщик XNU постоянно адаптируется к нагрузке, делая систему одновременно мощной и эффективной.