Секреты внутреннего устройства планировщика Go

preview_player
Показать описание

Консультации:

Таймкоды:
00:00 - Введение
03:00 - Потоки операционной системы
07:34 - Легковесные потоки
10:16 - Основные концепции рантайма Go
15:21 - Шасштабирование рантайма Go
18:45 - Локальные очереди
21:45 - Work sharing и work stealing
26:08 - Syscalls в планировщике Go
27:41 - Handoff
34:50 - Netpoller
37:33 - Очереди в планировщике Go
42:28 - Примитивы синхронизации
48:57 - Циклы
52:27 - Курс по Concurrency в Go

Внутреннее устройство планировщика Go. Планировщик Go. Горутины. Внутреннее устройство горутин. Netpoller. Sysmon. GRQ. LRQ. Wait queue. Handoff. Work sharing. Work stealing. Golang. Golang уроки. Golang с нуля. Горутины Golang.

#concurrency #golang
Рекомендации по теме
Комментарии
Автор


Делюсь там интересными активностями, мыслями, новостями и материалами по программированию, а также рассказываю о том, что читаю и изучаю по программированию и не только!

vladimir_balun_programming
Автор

Отличная презентация. Небольшие дополнения:
• 8 мб - верхняя граница размера стека потока ОС, дефолтное значение зависит от дистрибутива, можно поменять через ulimit. По факту при создании системного потока эти 8 мб аллоцируются в виртуальной памяти (устанавливаются MMU page tables), т.о. начальный размер физической памяти для системного треда 16 кб для 64 битных дистров.
• Про переключение контекста потоков ОС: стек горутины по факту создаётся в хипе, а не в стеке системного потока. Это тоже влияет на быстрое переключение контекста горутин (и на то, что стек горутины может расти до 1 Гб). Т.к. горутина не работает со стеком потока ОС, для горутины используется всего 3 регистра ЦПУ, которые нужно скинуть при переключении контекста. Т.е. даже если ОС переключит поток, на котором выполнялись горутины, планировщик может очень быстро перекинуть их на другой поток.
Надеюсь, не слишком коряво написал.

antonioalejos
Автор

Владимир, спасибо тебе большое что делишся знаниями в доступном для понимания виде ❤

mamabkocmoceyt
Автор

Владимир, спасибо. Лучшее объяснение по теме. Многие вещи знал, но не до конца понимал, а сейчас кааак понял. Все-таки сторителлинги решают. Еще раз спасибо за труд.

bambalbino
Автор

отдельное спасибо за темный фон, глазам комфортно 👍

Hande_hoch
Автор

Блин, как же круто. Практически ОС под капотом

ShtrikeBirb
Автор

47:22 Ещё одно горутина, пришла и захватывает мьютекс. Кажется очень маловероятно. Если она начала ждать мьютекс она должна встать в очередь. А так должны по времени совпасть 2 события освобождение мьютекса и захват другой гарутиной. А не легче при попытке захвата мьютекса идти всегда по одному пути: вставать в очередь. Это справедливо и проще.

fsfqp
Автор

Прекрасная лекция. Пожалуй, что стоило еще хотя бы в пару предложений упомянуть, как этот планировщик (вместе с планировщиком памяти) начинают страдать, когда нужен интероп (например с C). Впрочем, похожие страдания возникают у всех языков с богатым рантаймом (Python, Java/JRE, C#/dotnet, JS/V8 и других). Отдельная забава, когда в одном процессе хочется иметь более одного такого рантайма.

alexanderspeshilov
Автор

Большое спасибо за видео, отличная подача материала!

Andrew-gohg
Автор

думал это будет приватный урок для тех, кто зарегался. но время есть не у всех. респект за аплоуд на ютуб!

broken_beyond_belief
Автор

Несовсем остался понятен момент с откреплением потока при системном вызове. В итоге по факту как работает?
1. Поток открепляется от процессора и переходи в тред пул? Тогда получается для этого процессора будет создан новый поток? У него же есть еще другие горутины
2. Поток не открепляется, а существует тред потоков, которые выполняют системные вызовы. Мы передаем выполнение кода этой горутины треду в тред пуле.
Какой из вариантов корректный? В лекции эта часть сумбурно рассказана

БулатБакиров-уй
Автор

Добрый день, спасибо за лекцию) Есть вопрос: получается в модели "GMP", "М" это не абстракция, а прям конкретный тред ОС?

VasiliyBorodich
Автор

6:15 Можно подумать, что при переключении горутин кэш не вымывается. Там тоже "абсолютно другой код", "абсолютно другие данные".

onamixt
Автор

Противоречие.
Вопрос по 40:45, выполнившаяся горутина идет в lifo и вытесняет прежную lifo горутину в fifo или же в выполнение?
В первый раз сказал первое, во второй раз второе.

Pchelozavr
Автор

Во первых спасибо за отличный курс🔥 Во вторых я кое что не понял😅 На уровне os есть процессы и потоки да + планировщик который по алгоритму делает context switch. НО что означает context switch в контексте процесса и потока?? Планировшик выбирает поток или процесс??

harutavetisyan
Автор

В чем отличие от глобальной очереди и waiting очереди
на первую вытесняются горутины висящие на сисколе, а другую — заблокированные на мтьтексе/чтении канала и тд
в чем отличие

arsnazzz
Автор

А вот вопрос: вы говорите, что поток ворует горутины. По-моему процесс этим как раз занимается?

devKenny
Автор

Поправьте правильно ли я понял: если приложение получает очень много ввода-вывода заведомо долгих операций (к примеру 1000)-> скедулер создаёт ос тред в котором крутится еполл на 1000 сокетов, вместо создания кучи ос тредов на тред пуле? Вот этот момент не до конца понял, объясните пожалуйста

hpv
Автор

Владимир спасибо большое за урок !!! Но вот я не могу понять что на собесе я говорю что в планировщике преимущественно все таки кооперативная много задачность, но теперь и есть вытеснение, но мне говорят что я не прав, что сейчас планировщик преимущественно реализует вытеснение, что это было переделано в последних версиях го, буду благодарен за Ваш ответ 🙏🏻

alexalex-jjsy
Автор

вольный пересказ книги Learn Concurrent Programming with Go

yakomisar
visit shbcf.ru