10-ая глава "Golang для профи" - продолжение темы асинхронщины, но уже более сложной. Постарался простым языком законспектировать основные тезисы подраздела о работе планировщика, велкоме.
Планировщик go - модуль, управляющий горутинами. Его задача - запустить горутину, обеспечить ей комфортную жизнь, а затем убить её.
Планировщик использует несколько стратегий работы.
Первая - стратегия справедливого планирования: максимально равномерно размазать все задачи по всем процессорам. В теории стратегия звучит хорошо, на практике - горутины часто связаны друг с другом, из-за чего на один процессор из-за связности может улететь больше горутин, чем на другой, и справедливостью уже не пахнет.
Вторая - стратегия перехвата работы, спешит на помощь первой. Находим недостаточно загруженный процессор, и начинаем кидать на него все доступные задачи, пока ему не станет плохо. Когда всем процессорам плохо в равной мере - стратегия считает, что она выполнена успешно. Доступные задачи, которые можно кинуть на процессор - могут быть забраны у других процессоров, даже если они ранее на них уже начали выполняться. Если ты ничего не понял, но тебе очень интересно, этот момент круто объяснялся в курсе по Go на stepik от mail.ru. Рекламить не буду, кому нужно - сам найдёт :)
В go есть ещё одна интересная штука с непонятным названием: алгоритм планирования m:n. Внесём ясность: m - количество горутин, которые можно выполнить одновременно, а n - количество потоков (про потоки, процессы и горутины было в предыдущем конспекте, если не читал - рекомендую: https://t.me/junsenior/224). Этот алгоритм подразумевает, что есть глобальная очередь горутин: создали горутину, она улетела в очередь, а затем процессоры начинают определять, кто будет с ней работать.
Помимо глобальной очереди, доступной всем процессорам, есть ещё локальные очереди внутри каждого логического процессора. Из глобальной очереди горутины переезжают в локальные очереди, а затем начинают выполняться.
На картинке ниже P - логический процессор, М - поток операционной системы, а G - горутина. Это сжатое, но основное представление того, как устроен жизненный цикл работы горутин.
Post #225
1.4K