Может ли быть больше потоков, чем количество ядер

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

Ответ

Да, может. В Go горутины (goroutines) — это легковесные потоки, управляемые рантаймом, а не ОС. Они работают поверх реальных потоков ОС (обычно 1 поток на ядро).

Горутины эффективно мультиплексируются на небольшое количество потоков ОС. Например, даже на 4-ядерном CPU можно запустить тысячи горутин. Рантайм Go автоматически распределяет их по доступным потокам.

Пример:

func main() {
    for i := 0; i < 10000; i++ {
        go func() {
            // работа горутины
        }()
    }
    // горутины выполняются конкурентно
    time.Sleep(time.Second)
}

Ключевое отличие от системных потоков — горутины потребляют меньше памяти (стек ~2KB) и переключаются быстрее, так как переключение происходит в пользовательском пространстве.