📅

Планировщик в языке программирования Go

Jul 21, 2024

Лекция о планировщике в языке программирования Go

План лекции

  1. Введение в планировщик: определения и задачи.
  2. Проблема масштабируемости в веб-сервисах.
  3. Алгоритмы и модели многозадачности.
  4. Системные примитивы синхронизации и их проблемы.
  5. Разработка своих примитивов синхронизации.
  6. Ведение глобальной и локальных очередей для управления рутинами.
  7. Решение проблемы ожидания и блокировок.
  8. Преимущества использования асинхронной preemption.
  9. Введение дополнительных потоков и системного монитора.
  10. Работа с очередями и задача по обеспечению fairness.

Основные моменты лекции

Введение

  • Цель лекции: понять работу планировщика в Go и как он решает задачи масштабируемости и эффективности в веб-сервисах.
  • Веб-сервисы в основном имеют I/O bound нагрузки, где важно минимизировать контекстные переключения.

Основы планировщика

  • Ядро операционной системы отвечает за выполнение потоков, однако это медленно из-за необходимости переключений между контекстами потоков.
  • Идея: создавать легковесные потоки (рутины) внутри приложения, что будет более эффективно.

Многозадачность в Go

  • Начальная модель: n к 1, где множество рутин выполняются на одном потоке.
  • Проблема контекстного переключения и предложенные решения (кооперативная многозадачность, вставка точек переключения контекста в компиляторе).

Распределение нагрузки и масштабируемость

  • Введение модели M:N для работы с многоядерными процессорами.
  • Использование локальных и глобальной очередей для рутин.
  • Подход work-stealing для перераспределения рутин.

Примитивы синхронизации

  • Проблема использования системных примитивов синхронизации (медленно, блокируют поток).
  • Разработка своих примитивов (мьютексов) в Go, которые блокируют только рутину, а не поток.

Работая с сопряжением с системными вызовами (syscall)

  • Введение концепции открепления потока от процессора при выполнении длительных системных вызовов.
  • Использование средств мультиплексирования (например, epoll в Linux) для обработки I/O операций.

Вытесняющая многозадачность (preemption)

  • Проблема бесконечных циклов и CPU-bound задач.
  • Введение асинхронной preemption для принудительной остановки рутин, работающих более 10 миллисекунд.

Заключение

  • Лекция дала понимание ключевых аспектов работы планировщика в Go и предложила основы для углубленного изучения и разработки эффективных веб-сервисов.