MENU

Fun & Interesting

Планировщик Go — самый подробный гайд простым языком

Video Not Working? Fix It Now

Самый подробный гайд по Планировщику 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

Comment