Выбор ответа Senior Горутины и планировщик GMP обновлено
Асинхронное вытеснение с Go 1.14
Вопрос
Горутина крутит тесный цикл for { i++ } без вызовов функций. Что изменилось в Go 1.14 для такого случая?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Асинхронное вытеснение: sysmon прерывает её сигналом через 10 мс. До 1.14 вытеснение было только кооперативным, в прологах функций, и цикл без вызовов мог заблокировать GC (stop-the-world ждал бы его вечно) и другие горутины.
Варианты ответа
- Такие циклы запрещены компилятором, нужен вызов функции
- Асинхронное вытеснение: sysmon прерывает её сигналом через ~10 мсправильный ответ
- Горутина с тесным циклом получает отдельный поток ОС
- Ничего: такой цикл по-прежнему навсегда захватывает свой P
Разбор
До 1.14 вытеснение было только кооперативным, в прологах функций, и цикл без вызовов мог заблокировать GC (stop-the-world ждал бы его вечно) и другие горутины. С 1.14 sysmon посылает потоку сигнал (SIGURG на Unix), обработчик сохраняет состояние и переключает горутину. Компилятор такие циклы не запрещает, и отдельного потока горутина не получает.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.