Самый подробный гайд по Планировщику Go максимально простым языком. В первой половине видео мы будем шаг за шагом строить планировщик Go идя от простого к сложному, детально вникая в суть каждого нового механизма — какую проблему он решает и каким образом. В итоге мы получим Планировщик, который очень близок к настоящему (исключая совсем уж тонкие механизмы, часть из котрых я разберу в отдельных эксклюзивных для моих платных каналов роликах, ссылки см. ниже).
Во второй половине мы будем препарировать настоящий планировщик Go, изучая как ведут себя все его основные параметры вживую на примерах разных программ. Я буду это делать с помощью своей утилиты goschedviz (ссылку см. ниже), которую написал специально для этого ролика.
И в самом конце построим общую схему планировщика, чтобы окинуть взгляд все механизмы, которые мы обсудили.
Утилита goschedviz: https://github.com/JustSkiv/goschedviz
Другие ролики из серии "Под капотом Go": https://youtube.com/playlist?list=PLFAQFisfyqlWiA6NqeTaNdPxYbfOq9fVP&si=ikwPfeIKjcwFghTq
————
👾 https://t.me/ntuzov - мой канал в Telegram.
Пока я делал этот ролик, я также написал здесь серию подготовительных коротких гайдов, чтобы более подробно разобрать некоторые механизмы, которые тут упоминал, и которые выходили за рамки формата.
Кроме этого, я часто пишу там и другие текстовые гайды, которых нет на YouTube, интересные мысли про разработку, новости и анонсы всех моих активностей и др.
👀 GoLang Digest: https://t.me/golang_digest - мои регулярные подборки самых интересных материалов по Go.
🗣️ Наше сообщество GopherClub: https://t.me/+zsSZ63wEJDs3NGVi
Лучшее русскоязычное Go-сообщество с очень приятной атмосферой, без токсиков. Детальное обсуждение вокруг тем моих роликов я в основном веду только там.
Кроме того, мы вежливо и терпеливо помогаем новичкам, конструктивно дискутируем с профессионалами и т.п.
Здесь также присутствуют все звезды Go-сообщества и представители разных компаний.
————
❤️ Если у вас есть желание поддержать развитие канала и получить доступ к дополнительных эксклюзивным роликам с более детальными разборами:
Закрытый телеграм-канал:
- В рублях: https://t.me/tribute/app?startapp=s3Q5
- В евро: https://t.me/tribute/app?startapp=s3Q6
Boosty: https://boosty.to/nikolay.tuzov
Patreon: https://www.patreon.com/tuzov
Тайминги
0:00 Вступление
1:45 Зачем изучать планировщик?
6:40 У меня не было выбора
7:01 Постановка задачи: требования к планировщику
9:04 Краткий ликбез по основам
9:29 Ликбез: Процессор компьютера и его ядра
10:45 Относительность одновременности
11:14 Ликбез: Конкурентность VS параллельность
12:44 Ликбез: Планировщик ОС
14:55 Ликбез: Почему треды дорогие? Переключение контекста
16:12 Вводим концепцию горутин
17:45 Ликбез: картина целиком
18:34 Состояния горутин
19:12 GMP-модель: Процессор и Машина
20:30 Шаг 1: Модель планировщика 1:1
21:36 Почему не подходит модель 1:N
22:04 Шаг 2: Пул тредов
23:04 Шаг 3: Ограниченный пул горутин
24:20 Global Run Queue - GRQ
27:08 Сколько тредов будем использовать?
28:10 Блокировка GRQ - добавляем mutex
30:32 Local Run Queue - LRQ
32:43 Порядок получения горутин из GRQ и LRQ
37:25 Work stealing - балансировка горутин между Процессорами
40:23 Проблема заблокированных тредов
40:40 Что такое Syscall (системный вызов)
41:31 Продолжаем про заблокированные треды
42:21 Handoff - решение проблемы заблокированных тредов
43:35 Проблема создания дополнительных тредов
44:55 Оптимизация Handoff - как создавать меньше тредов?
46:11 System Monitor - выполнение Handoff для слишком долгих системных вызовов
47:40 Куда поместить горутину после Handoff
49:18 Асинхронное выполнение системных вызовов без создания дополнительных тредов
54:02 Network Poller - асинхронные системные вызовы в Go
56:12 Решение проблемы простаивания Netpoller'а с помощью Sysmon
58:58 Кооперативная многозадачность - порядок выполнения горутин
01:02:54 Вытесняющая многозадачность - планировщика ОС
01:03:14 Что случилось в Go v1.14 и какая же в Go многозадачность?
01:03:51 GOMAXPROCS - что это и зачем?
01:05:12 Принудительное вытеснение горутин
01:07:54 Закрепление материала
01:08:46 Что происходит после запуска программы?
01:11:43 Как посмотреть трейсинг Планировщика? Параметр schedtrace
01:17:07 Как узнать количество горутин в программе
01:18:10 Как выполняются короткие syscall'ы - функция fmt.Println()
01:19:09 Создаём много горутин, нагружая LRQ и GRQ
01:22:23 Визуализация внутренностей планировщика - утилита goschedviz
01:29:57 100 горутин
01:30:39 10 горутин — мало работы, много процессоров
01:30:56 Села батарейка на камере..
01:31:14 Продолжение: 10 горутин — мало работы, много процессоров
01:34:49 Пример выполнения Handoff
01:38:21 Пример работы Netpoller - запускаем клиент и сервер
01:44:05 Пример с Mutex'ами - почему блокировки это плохо
01:46:56 Итоговая схема
01:51:15 Заключение
01:53:20 Спонсоры
#golang #ntuzov