Выбор ответа Senior Горутины и планировщик GMP обновлено

Блокирующий системный вызов и P

Вопрос

Горутина выполняет долгий блокирующий системный вызов (например, чтение файла). Что делает планировщик?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: M блокируется вместе с горутиной, а P передаётся другому M. Для файловых операций и прочих блокирующих syscall поток действительно блокируется.

Варианты ответа

  1. Блокируется весь процесс до завершения системного вызова
  2. Горутина уходит в netpoller, поток ОС при этом не блокируется
  3. Рантайм прерывает системный вызов по таймауту 10 мс и повторяет
  4. M блокируется вместе с горутиной, а P передаётся другому Mправильный ответ

Разбор

Для файловых операций и прочих блокирующих syscall поток действительно блокируется. Рантайм при входе в syscall отвязывает P, а sysmon или сам выход проверяют, не застрял ли вызов; P передаётся свободному или новому M. Netpoller используется для сетевых сокетов, где возможен неблокирующий режим, файлы на Linux так не работают. Прерывать системные вызовы рантайм не умеет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.