Media is too big
VIEW IN TELEGRAM
⚡️ Внутренняя Механика Планировщика Go - как реально работает G-P-M под капотом
Go стал популярным благодаря горутинам - быстрым и лёгким. Но настоящая сила в планировщике, который умеет выполнять миллионы задач на ограниченном количестве потоков ОС.
Разбираем устройство модели G-P-M 👇
1. Три основных сущности: G, P, M
- G — горутина: стек, состояние, контекст.
- P — логический процессор, который содержит очередь готовых горутин.
- M — поток ОС, который выполняет горутины из очереди P.
P распределяет работу.
M выполняет её.
G — сама работа.
2. Очереди и балансировка
У каждого P своя локальная очередь.
Если P простаивает, он забирает задачи у других (work stealing).
Это стабилизирует нагрузку и снижает задержки.
3. Блокировки и парковка
Когда горутина блокируется:
- её паркуют
- поток освобождают
- P поднимает другую готовую горутину
- когда syscall завершён, горутину возвращают в очередь
Так минимизируются блокировки потоков ОС.
4. Горутины уступают время сами
Создание новой G, операции с каналами или вызов runtime.Gosched() позволяют планировщику переключить выполнение.
5. Роль GOMAXPROCS
GOMAXPROCS определяет количество P.
Обычно равно числу CPU.
Увеличение сверх количества ядер не ускоряет работу.
6. Почему горутины такие дешёвые?
- стартовый стек около 2 КБ
- автоматическое расширение и сжатие
- быстрые переключения
- минимальная зависимость от ОС
Поэтому легко запускать сотни тысяч и даже миллионы горутин.
Планировщик Go - это компактный и эффективный механизм, который:
- распределяет нагрузку
- минимизирует блокировки
- масштабирует миллионы горутин
- обеспечивает стабильную и предсказуемую конкурентность
Эта архитектура - одна из главных причин успеха Go в высоконагруженных системах.
Go стал популярным благодаря горутинам - быстрым и лёгким. Но настоящая сила в планировщике, который умеет выполнять миллионы задач на ограниченном количестве потоков ОС.
Разбираем устройство модели G-P-M 👇
1. Три основных сущности: G, P, M
- G — горутина: стек, состояние, контекст.
- P — логический процессор, который содержит очередь готовых горутин.
- M — поток ОС, который выполняет горутины из очереди P.
P распределяет работу.
M выполняет её.
G — сама работа.
2. Очереди и балансировка
У каждого P своя локальная очередь.
Если P простаивает, он забирает задачи у других (work stealing).
Это стабилизирует нагрузку и снижает задержки.
3. Блокировки и парковка
Когда горутина блокируется:
- её паркуют
- поток освобождают
- P поднимает другую готовую горутину
- когда syscall завершён, горутину возвращают в очередь
Так минимизируются блокировки потоков ОС.
4. Горутины уступают время сами
Создание новой G, операции с каналами или вызов runtime.Gosched() позволяют планировщику переключить выполнение.
5. Роль GOMAXPROCS
GOMAXPROCS определяет количество P.
Обычно равно числу CPU.
Увеличение сверх количества ядер не ускоряет работу.
6. Почему горутины такие дешёвые?
- стартовый стек около 2 КБ
- автоматическое расширение и сжатие
- быстрые переключения
- минимальная зависимость от ОС
Поэтому легко запускать сотни тысяч и даже миллионы горутин.
Планировщик Go - это компактный и эффективный механизм, который:
- распределяет нагрузку
- минимизирует блокировки
- масштабирует миллионы горутин
- обеспечивает стабильную и предсказуемую конкурентность
Эта архитектура - одна из главных причин успеха Go в высоконагруженных системах.
👍17🔥7❤6🤔1
😎 Найм в компанию, а не в команду: как это работает
Устроиться на работу в компанию, попробовать поработать в разных командах внутри, чтобы выбрать ту самую — звучит как отличный план. В Яндекс Еде это стандартная практика: через буткемп разработчики пробуют разные проекты на практике, чтобы найти тот, где им действительно интересно.
Олег Табота, руководитель команды общих компонентов в Яндекс Еде, написал подробную статью о том, как это работает на практике.
Что внутри:
💠 Как сайдкары избавляют от рутины в поддержке 400+ микросервисов.
💠 Хронология инцидента: что происходит, когда новичок роняет прод.
💠 Как устроены технические процессы, RFC и выбор задач.
Отличный пример того, как выглядит здоровая инженерная культура в бигтехе.
🔗 Читать статью
Устроиться на работу в компанию, попробовать поработать в разных командах внутри, чтобы выбрать ту самую — звучит как отличный план. В Яндекс Еде это стандартная практика: через буткемп разработчики пробуют разные проекты на практике, чтобы найти тот, где им действительно интересно.
Олег Табота, руководитель команды общих компонентов в Яндекс Еде, написал подробную статью о том, как это работает на практике.
Что внутри:
💠 Как сайдкары избавляют от рутины в поддержке 400+ микросервисов.
💠 Хронология инцидента: что происходит, когда новичок роняет прод.
💠 Как устроены технические процессы, RFC и выбор задач.
Отличный пример того, как выглядит здоровая инженерная культура в бигтехе.
🔗 Читать статью
👍4❤3😁2
Go перешёл на единую внутреннюю форму представления кода - Unified IR. Это тихое, но очень важное изменение, которое делает компилятор проще, чище и мощнее.
Go больше не держит несколько разных форм внутреннего представления для разных этапов компиляции.
Теперь весь типизированный AST сначала сериализуется в бинарный формат, а потом тут же десериализуется в IR, который используется на всех стадиях.
- чтобы избавиться от дублирования логики в разных частях компилятора
- чтобы упрощать такие сложные вещи как generics, инлайнинг и импорт пакетов
- чтобы компилятор стабильно обрабатывал огромные проекты и зависимости
1. При компиляции пакета
Go берёт AST → сериализует его → восстанавливает уже как Unified IR → оптимизирует и генерирует код.
2. При импорте зависимостей
Компилятор читает `.pkg`-файлы:
- типы
- функции
- константы
- тела функций, доступные для инлайнинга
И всё это в едином бинарном формате.
Формат разбит на логические секции:
- строки (имена, пути)
- типы
- объекты (функции, переменные)
- тела функций
- метаданные, позиции, generics
Это компактно, быстро и даёт компилятору полную картину.
Unified IR стал фундаментом под generics, кросс-пакетный инлайнинг и дальнейшие оптимизации.
Go-компилятор теперь проще развивать, а экосистема — быстрее и производительнее.
https://internals-for-interns.com/posts/go-compiler-unified-ir/
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍4
В статье объясняется, что такое
struct в Go и почему этот простой механизм лежит в основе большинства пользовательских типов.Главное:
-
struct позволяет объединять связанные данные в один объект. Пример:
type Person struct { Name string; Age int }- Если создать структуру без инициализации, её поля получают нулевые значения: пустые строки, 0, false и т.п.
- Можно сразу задать значения:
p := Person{Name: "Alice", Age: 30}
Структуры — удобный способ описывать сущности: книги, пользователей, заказы, конфиги и любые другие объекты.
struct + методы в Go - аналог классов, но проще и без наследования. Логика добавляется через методы внешне.
Композиция важнее наследования: структуры можно вкладывать друг в друга или встраивать, собирая сложные типы из простых.
https://dev.to/aaron_rose_0787cc8b4775a0/the-secret-life-of-go-structs-3aj9
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍2🥰2🤯2🔥1