> Что такое starvation локальной очереди и когда она возникает (Go)
Уровень: junior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: amoCRM
Стек: Go
> Пример ответа
Starvation локальной очереди (или thread starvation) в контексте Go возникает, когда горутина (goroutine) не может получить доступ к ресурсу, который ей необходим, из-за того, что другие горутины постоянно его захватывают. Это происходит, когда планировщик Go (scheduler) несправедливо распределяет процессорное время между горутинами, и одна из них "голодает", не получая кванта времени.
В Go локальные очереди относятся к очередям горутин, связанным с каждым логическим процессором (P). Starvation возникает в следующих случаях:
- Долгие блокирующие операции: Если горутина выполняет длительную операцию (например, бесконечный цикл или syscall) без вызова планировщика, она может монополизировать локальную очередь, не давая другим горутинам выполняться.
- Несправедливое планирование: При использовании примитивов синхронизации, таких как мьютексы, если одна горутина постоянно отпускает и снова захватывает блокировку, другая может никогда не получить её (это называется livelock или голодание блокировки).
- Высокая конкуренция: Когда много горутин пытаются работать с одним каналом или мьютексом, планировщик может отдавать предпочтение уже активным горутинам, игнорируя ожидающие.
Пример в Go:
GOpackage mainimport ("fmt""runtime""sync")func main() {runtime.GOMAXPROCS(1) // Один логический процессорvar wg sync.WaitGroupwg.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() или более сбалансированное проектирование.
> Похожие задачи по Go
Как реализовать TTL кэш на Redis без использования таблиц
Как масштабировать сервис коротких ссылок и настроить балансировку нагрузки
Как происходит балансировка нагрузки в планировщике Go
На чем реализовывали поиск
> Похожие задачи по backend
Что происходит, если по userId пользователь не найден?
Работал ли ты с Cassandra, MongoDB, Redis, ElasticSearch, ClickHouse
Как происходит балансировка нагрузки в планировщике Go
На чем реализовывали поиск
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью