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

Асинхронное вытеснение с Go 1.14

Вопрос

Горутина крутит тесный цикл for { i++ } без вызовов функций. Что изменилось в Go 1.14 для такого случая?

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

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

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

Коротко

Правильный ответ: Асинхронное вытеснение: sysmon прерывает её сигналом через 10 мс. До 1.14 вытеснение было только кооперативным, в прологах функций, и цикл без вызовов мог заблокировать GC (stop-the-world ждал бы его вечно) и другие горутины.

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

  1. Такие циклы запрещены компилятором, нужен вызов функции
  2. Асинхронное вытеснение: sysmon прерывает её сигналом через ~10 мсправильный ответ
  3. Горутина с тесным циклом получает отдельный поток ОС
  4. Ничего: такой цикл по-прежнему навсегда захватывает свой P

Разбор

До 1.14 вытеснение было только кооперативным, в прологах функций, и цикл без вызовов мог заблокировать GC (stop-the-world ждал бы его вечно) и другие горутины. С 1.14 sysmon посылает потоку сигнал (SIGURG на Unix), обработчик сохраняет состояние и переключает горутину. Компилятор такие циклы не запрещает, и отдельного потока горутина не получает.

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

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