Выбор ответа Senior Горутины и планировщик GMP обновлено
Блокирующий системный вызов и P
Вопрос
Горутина выполняет долгий блокирующий системный вызов (например, чтение файла). Что делает планировщик?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: M блокируется вместе с горутиной, а P передаётся другому M. Для файловых операций и прочих блокирующих syscall поток действительно блокируется.
Варианты ответа
- Блокируется весь процесс до завершения системного вызова
- Горутина уходит в netpoller, поток ОС при этом не блокируется
- Рантайм прерывает системный вызов по таймауту 10 мс и повторяет
- M блокируется вместе с горутиной, а P передаётся другому Mправильный ответ
Разбор
Для файловых операций и прочих блокирующих syscall поток действительно блокируется. Рантайм при входе в syscall отвязывает P, а sysmon или сам выход проверяют, не застрял ли вызов; P передаётся свободному или новому M. Netpoller используется для сетевых сокетов, где возможен неблокирующий режим, файлы на Linux так не работают. Прерывать системные вызовы рантайм не умеет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.