Почему горутина так мало весит?

В спецификации текущей версии написанно, что начальный размер горутины = 2кб.
В то же время, они основаны на системных потоках, размер которых не меньше 1Мб.

Почему основываясь на системном потоке, программа с одной горутиной занимает всего 2кб?
  • Вопрос задан
  • 270 просмотров
Решения вопроса 2
@deliro
Агрессивное программирование
В то же время, они основаны на системных потоках, размер которых не меньше 1Мб.

Вот в этом главное заблуждение. Горутины не основаны на системных потоках, системные потоки исполняют горутины. Горутина — это "задача", поток — "исполнитель". Исполнитель может исполнять задачу, пока она не будет выполнена или пока исполнителю есть что делать (а не ждать сеть или диск, например). После этого исполнитель ищет новую задачу. Для этого у него есть своя очередь задач. Если в ней что-то есть — исполняется это "что-то" (другая горутина). Если нет — исполнитель идёт в "глобальную очередь" и выгребает оттуда немного задач (больше одной). Если и в той очереди ничего нет, он идёт "воровать" (да, это буквально так называется — stealing) задачи из очередей других исполнителей (соседних потоков).

Так вот, поток далеко не равно горутина. У потока системный стек, у горутины — какой захочет рантайм го.
Ответ написан
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
Гуглить greenthreads, user space threads. Такое не только Go умеет. Архитектурно, конкретно Go берёт истоки в Plan9, можно почитать например https://9fans.github.io/plan9port/man/man3/thread.html
Планировщик user space потоков похож на системный планировщик pthreads. Но в системных потоках, если совсем грубо, при переключении контекста нужно сохранить регистры, стек и кучу(heap). В легковесных user space потоках куча общая для всех. Память для сохранения стека при переключении контекста системный планировщик выделяет сразу с запасом. А планировщик Go runtime выделяет, без запаса, всего 2кб с возможностью роста. (Между прочим много кода и архитектуры в планировщик Go занёс соотечественник -- Дмитрий Вьюков. 2кб вроде его персональная заслуга)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
18 мая 2022, в 00:48
3000 руб./за проект
18 мая 2022, в 00:31
100000 руб./за проект
18 мая 2022, в 00:09
15000 руб./за проект