Что такое Starvation в Go

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

Ответ

Starvation (голодание) в Go возникает, когда горутина не может получить доступ к ресурсу (например, CPU или мьютексу) в течение длительного времени из-за того, что другие горутины постоянно его монополизируют.

Пример с мьютексом:

var mu sync.Mutex

func greedy() {
    for {
        mu.Lock()
        time.Sleep(100 * time.Millisecond) // Долгая работа с мьютексом
        mu.Unlock()
    }
}

func starved() {
    for {
        mu.Lock()
        fmt.Println("I got the lock!") // Выполняется редко
        mu.Unlock()
    }
}

func main() {
    go greedy()
    go starved()
    time.Sleep(time.Second)
}

Чтобы избежать starvation:

  1. Используйте sync.RWMutex вместо sync.Mutex где возможно
  2. Ограничивайте время работы с блокировками
  3. Используйте каналы или другие примитивы синхронизации
  4. В Go 1.5+ планировщик предотвращает CPU starvation