Почему потоки имеют изначально стек размером 2 МБ

«Почему потоки имеют изначально стек размером 2 МБ» — вопрос из категории Linux, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Go горутины (не потоки) имеют начальный размер стека всего 2 КБ, а не 2 МБ. Это возможно благодаря сегментированному стеку ("stack splitting"), который динамически увеличивается по мере необходимости.

Причины малого начального размера:

  1. Экономия памяти – тысячи горутин могут работать с минимальными накладными расходами.
  2. Динамический рост – стек расширяется автоматически при нехватке места.
func main() {
    for i := 0; i < 100000; i++ {
        go func() { // Каждая горутина стартует с ~2 КБ
            time.Sleep(time.Second)
        }()
    }
    time.Sleep(time.Second * 2)
}

В отличие от потоков ОС (где стек фиксирован и велик), Go оптимизирован для массового параллелизма.