Выбор ответа Senior Горутины и планировщик GMP обновлено

Как растёт стек горутины

Вопрос

Как устроен стек горутины в современном Go?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Маленький непрерывный стек; при нехватке копируется в вдвое больший. Начальный стек горутины около 2 КБ.

Варианты ответа

  1. Фиксированный стек 1 МБ, как у потока ОС, без роста
  2. Маленький непрерывный стек; при нехватке копируется в вдвое большийправильный ответ
  3. Сегментированный стек: новые куски по 8 КБ цепляются связным списком
  4. Стека нет вообще: все локальные переменные лежат в куче

Разбор

Начальный стек горутины около 2 КБ. Пролог функции проверяет, хватает ли места, и если нет, рантайм выделяет стек в 2 раза больше и копирует старый, корректируя указатели на стек (это возможно, потому что компилятор знает, где они). При GC слишком большой стек может сжаться. Сегментированные стеки были до Go 1.4 и давали «hot split». Фиксированный мегабайтный стек был бы слишком дорог для миллиона горутин.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.