> Что такое starvation локальной очереди и когда она возникает (Go)

Уровень: junior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: amoCRM

Стек: Go

> Пример ответа

Starvation локальной очереди (или thread starvation) в контексте Go возникает, когда горутина (goroutine) не может получить доступ к ресурсу, который ей необходим, из-за того, что другие горутины постоянно его захватывают. Это происходит, когда планировщик Go (scheduler) несправедливо распределяет процессорное время между горутинами, и одна из них "голодает", не получая кванта времени.

В Go локальные очереди относятся к очередям горутин, связанным с каждым логическим процессором (P). Starvation возникает в следующих случаях:

  • Долгие блокирующие операции: Если горутина выполняет длительную операцию (например, бесконечный цикл или syscall) без вызова планировщика, она может монополизировать локальную очередь, не давая другим горутинам выполняться.
  • Несправедливое планирование: При использовании примитивов синхронизации, таких как мьютексы, если одна горутина постоянно отпускает и снова захватывает блокировку, другая может никогда не получить её (это называется livelock или голодание блокировки).
  • Высокая конкуренция: Когда много горутин пытаются работать с одним каналом или мьютексом, планировщик может отдавать предпочтение уже активным горутинам, игнорируя ожидающие.

Пример в Go:

GO
package main
import (
"fmt"
"runtime"
"sync"
)
func main() {
runtime.GOMAXPROCS(1) // Один логический процессор
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
for i := 0; i < 100000; i++ {
// Долгая операция без вызова планировщика
_ = i * i
}
}()
go func() {
defer wg.Done()
fmt.Println("Эта горутина может никогда не выполниться")
}()
wg.Wait()
}

Здесь первая горутина монополизирует локальную очередь, и вторая может не получить квант времени, что приводит к starvation. Для предотвращения используют явные вызовы runtime.Gosched() или более сбалансированное проектирование.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью