Sobes.tech
Back to questions
Senior
3

Есть фундаментальная проблема с блокирующими системными вызовами (например, чтение файла). Как Go runtime решает это?

Companies where asked
X5 techX5 tech

Answer from AI

sobes.tech AI

В Go runtime блокирующие системные вызовы, такие как чтение файла, решаются с помощью модели M:N планирования горутин на системные потоки. Когда горутина выполняет блокирующий вызов, runtime выделяет отдельный системный поток (M), чтобы не блокировать другие горутины (N). Это достигается через:

  • Использование нескольких системных потоков для выполнения блокирующих операций.
  • Вызов блокирующих операций в отдельных потоках, чтобы не останавливать планировщик горутин.

Таким образом, даже если одна горутина заблокирована на системном вызове, другие горутины продолжают выполняться без задержек, обеспечивая высокую конкурентность и эффективность.

Примерно это выглядит так:

// Горутина вызывает блокирующий системный вызов
go func() {
    data, err := ioutil.ReadFile("file.txt")
    if err != nil {
        // обработка ошибки
    }
    fmt.Println(string(data))
}()
// Runtime выделит отдельный поток для ReadFile, не блокируя другие горутины