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

Поділитися
Вставка
  • Опубліковано 14 лис 2024

КОМЕНТАРІ • 37

  • @vladimir_balun_programming
    @vladimir_balun_programming  2 місяці тому +1

    Присоединяйтесь к моему каналу в Телеграм: t.me/vladimir_balun_programming

  • @Hande_hoch
    @Hande_hoch 18 днів тому +1

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

  • @antonioalejos1221
    @antonioalejos1221 6 місяців тому +29

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

    • @avikbox
      @avikbox 3 місяці тому

      А где про это можно подробнее почитать\посмотреть ?

    • @antonioalejos1221
      @antonioalejos1221 3 місяці тому

      @@avikbox ютуб не даёт ссылки вставлять в комменты. Про память - на kernel орг есть дока по vmallocated. Про горутины можно у Дейва Чейни (Dave Cheney) почитать, и вообще много что у него почтитать можно по go)

    • @avikbox
      @avikbox 3 місяці тому

      @@antonioalejos1221 спасибо!

  • @mamabkocmoceyt7727
    @mamabkocmoceyt7727 6 місяців тому +15

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

  • @bambalbino
    @bambalbino 6 місяців тому +2

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

  • @broken_beyond_belief
    @broken_beyond_belief 6 місяців тому

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

  • @Andrew-go6hg
    @Andrew-go6hg 5 місяців тому +1

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

  • @rockkley9159
    @rockkley9159 6 місяців тому +3

    Спасибо большое за видео

  • @Albert-nc1rj
    @Albert-nc1rj 6 місяців тому +2

    Спасибо большое!

  • @alexanderspeshilov839
    @alexanderspeshilov839 6 місяців тому

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

  • @БулатБакиров-у8й
    @БулатБакиров-у8й 6 місяців тому

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

  • @Pchelozavr
    @Pchelozavr 10 днів тому

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

  • @alexalex-jj2sy
    @alexalex-jj2sy Місяць тому

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

  • @VasiliyBorodich
    @VasiliyBorodich 3 місяці тому

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

  • @yakomisar
    @yakomisar 6 місяців тому +4

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

    • @alexols7183
      @alexols7183 5 місяців тому +1

      Так это общедоступная технология, тут особо не напридумываешь) Ваш референс - это тоже вольный пересказ комментариев разработчиков к коду

  • @popsul1993
    @popsul1993 6 місяців тому

    Какие-какие в нагрузки в web-приложениях? /sarcasm
    А вообще, материал интересный, спасибо!)

  • @hpv9406
    @hpv9406 6 місяців тому

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

  • @БулатБакиров-у8й
    @БулатБакиров-у8й 6 місяців тому

    Получается максимум может быть 256 горутин на один поток, тогда горутины ограничены количеством потоков * 256? Мой ноут начинает умирать при +-30к потоках, тогда максимум я смогу создать +-7,5млн горутин?

    • @okidoki_poki
      @okidoki_poki 5 місяців тому

      Память закончится раньше вероятно :)

    • @mailmamedov9738
      @mailmamedov9738 2 місяці тому

      Если делать шардирование, как в видео, то нет смысла использовать больше потоков, чем ядер на цпу, плюс поток на обработку сискола, если делать больше потоков, они начнут голодать

  • @valitovgaziz
    @valitovgaziz 5 місяців тому +2

    Минут 10 уже не понимаю что происходит)

  • @onkelen5677
    @onkelen5677 26 днів тому

    Очень много понятия "контекст", но не дано определения, что это такое. А в го контекст - это вообще канал из пакета. Это такое же же или другое? Переключение контекстов медленное "потому что ядро". А других местах линупса это наоборот - аргумент того, что хорошо(какой-нибудь драйвер). А медленно - это насколько медленно?

    • @onkelen5677
      @onkelen5677 26 днів тому

      И опять таки, линупс - прекраснейшее ядро. Неужели мы сейчас на коленке сделаем контекст свитчинг и быстрее и лучше чем там? В общем, не хватает конкретики в этой истории с конткстом.

  • @ide9827
    @ide9827 5 місяців тому

    коммент для продвижения канала и контента

    • @ide9827
      @ide9827 5 місяців тому

      вообще, офигеть как информативное видео! охренеть
      спасибо

  • @slavanikulin8069
    @slavanikulin8069 4 місяці тому

    костыли на костылях какие-то)

  • @TTT111-T
    @TTT111-T 4 місяці тому +1

    Так говоришь, как будто на с/с++ многопоточности невозможно писать высоконагруженные системы. Всё на тредпулах, везде поток на соединение, везде всё работает прекрасно, никто в tcp очередях не ждёт. Руки прямые просто нужны.

    • @vladimir_balun_programming
      @vladimir_balun_programming  4 місяці тому

      Это работает, но работает не так эффективно по сравнению с той моделью, которую я предложил - причины в видео были объяснены