Coconote
AI notes
AI voice & video notes
Try for free
📅
Планировщик в языке программирования Go
Jul 21, 2024
Лекция о планировщике в языке программирования Go
План лекции
Введение в планировщик: опре деления и задачи.
Проблема масштабируемости в веб-сервисах.
Алгоритмы и модели многозадачности.
Системные примитивы синхронизации и их проблемы.
Разработка своих примитивов синхронизации.
Ведение глобальной и локальных очередей для управления рутинами.
Решение проблемы ожидания и блокировок.
Преимущества использования асинхронной preemption.
Введение дополнительных потоков и системного монитора.
Работа с очередями и задача по обеспечению fairness.
Основные моменты лекции
Введение
Цель лекции: понять работу планировщика в Go и как он решает задачи масштабируемости и эффективности в веб-сервисах.
Веб-сервисы в основном имеют I/O bound нагрузки, где важно минимизировать контекстные переключения.
Основы планировщика
Ядро операционной системы отвечает за выполнение потоков, однако это медленно из-за необходимости переключений между контекстами потоков.
Идея: создавать легковесные потоки (рутины) внутри приложения, что будет более эффективно.
Многозадачность в Go
Начальная модель: n к 1, где множество рутин выполняются на одном потоке.
Проблема контекстного переключения и предложенные решения (кооперативная многозадачность, вставка точек переключения контекста в компиляторе).
Распределение нагрузки и масштабируемость
Введение модели M:N для работы с многоядерными процессорами.
Использование локальных и глобальной очередей для рутин.
Подход work-stealing для перераспределения рутин.
Примитивы синхронизации
Проблема использования системных примитивов синхронизации (медленно, блокируют поток).
Разработка своих примитивов (мьютексов) в Go, которые блокируют только рутину, а не поток.
Работая с сопряжением с системными вызовами (syscall)
Введение концепции открепления потока от процессора при выполнении длительных системных вызовов.
Использование средств мультиплексирования (например, epoll в Linux) для обработки I/O операций.
Вытесняющая многозадачность (preemption)
Проблема бесконечных циклов и CPU-bound задач.
Введение асинхронной preemption для принудительной остановки рутин, работающих более 10 миллисекунд.
Заключение
Лекция дала понимание ключевых аспектов работы планировщика в Go и предложила основы для углубленного изучения и разработки эффективных веб-сервисов.
📄
Full transcript