Доклад о многозадачности, планировщике и программах на Go

Jul 16, 2024

Доклад о многозадачности, планировщике и программах на Go

Введение

  • Приветствие:

    • Меня зовут Антон
    • Если запутаемся, остановимся и обсудим подробнее
  • Темы доклада:

    • Из чего состоят программы на Go
    • Отличия от программ на C
    • Теоретическая часть, как работает планировщик Go
    • Зачем это нужно

Пример программы

  • Программа на Go:
    • Пример: Hello World на Go, программа 2 МБ, 150,000 инструкций ассемблера
    • Программа на C: 8 КБ, 180 инструкций ассемблера
    • Причины размера:
      • Статическая компиляция, включение всех зависимостей
      • Стандартная библиотека Go обширна
      • Много отладочной информации

Основные компоненты run-time Go

  • В состав входят:
    • Планировщик
    • Сборщик мусора
    • Локатор памяти
    • Стандартная библиотека

Планировщик Go

  • Главное, что управляет горутинами (goroutines)
  • Горнутины легковесные, занимаются меньше памяти чем нативные потоки (threads)
  • Эффективное переключение между задачами
  • Объяснение концепции "зелёных потоков" (green threads)
  • Разработчики Go предложили собственную имплементацию

Внутренняя структура

  • Основные термины:
    • M (машины-threads)
    • P (процессор)
    • G (горутина)
  • Взаимодействие компонентов:
    • Количество P обычно равно количеству ядер
    • Связь между P и M один к одному
    • Очередь горутин может содержать много G, но активна только одна

Виды многозадачности

  • Вытесняющая многозадачность:
    • Все программы равны, одинаковое время на выполнение
  • Кооперативная многозадачность:
    • Программы сами уступают друг другу место
  • Go использует комбинацию:
    • Горутины уступают при обращении к вводу/выводу или при вызове функции
    • Явное уступление через runtime.Gosched
    • Возможно внедрение вытесняющей многозадачности в будущем

Принципы работы планировщика Go

  • Очередь задач FIFO
  • Минимизация количества тредов
  • Принцип "захвата чужой работы"
  • Неинавазивность и отсутствие вытеснения

Ограничения и вопросы

  • Отсутствие контроля над приоритетами задач
  • Нет гарантированного времени выполнения
  • Возможно ухудшение производительности из-за сброса кешей

Создание и запуск программы на Go

  • Запуск программы начинается с ассемблерного кода
  • Функция runtime.newproc отвечает за запуск горутин
  • runtime.schedule выполняет раунды планировщика
  • Завершение горутины ведет к новому раунду планировщика

Практическое применение

  • Глубокое знание работы планировщика помогает в отладке и мониторинге
  • Важность понимания внутренностей языка для более эффективного использования

Заключение

  • Ценности любопытства и понимания внутренностей технологий
  • Упоминание полезных ссылок и дальнейшее изучение

Вопросы и ответы

  • Вопросы задавались по различным аспектам планировщика и его работы
  • Интересные вопросы получили призы (кружки)

Полезные ссылки

  • Презентация содержит ссылки на полезные ресурсы для глубинного изучения