Как стать автором
Обновить

Комментарии 9

Очень интересно! Спасибо за статью!
Пожалуйста!
Спасибо!

Сам, было дело, хотел покопаться как сделали вытесняющую многозадачность с 1.14, но так руки и не дошли. Вы прямо таки сделали работу за меня :).
Рад что помог, я так понимаю в 1.15 так же ожидается ряд изменений касающихся safe/unsafe point'ов, думаю там тоже будет много чего интересного :)
Стоит заметить, что, концепция с сигналом — это решение для UNIX-base систем, в то время как например для Windows реализация вытеснения все еще в разработке

Почему? Все реализовано и работает через SuspendThread. В процессе реализация windows/arm.
Да, действительно, тут я неверно интерпретировал 1.14 release notes. Спасибо за замечание!

С идеологической точки зрения это положительное изменение? В плане того, что раньше как-то внутри сами решали задачу, а теперь полагаются на средства ОС? Скромное имхо — это усложнение по не особо больной теме...

Это скорее эволюция чем революция. Раньше проблема того, что горутина может захватить все ресурсы не решалась, теперь — решается. Но, старые кооперативные стратегии никуда не делись.

Они продолжают решать задачу внутри себя. Средства ОС им нужны только для одной цели — приостановить ОС поток посреди выполнения. А тема больная. Банальный дедлок с GOMAXPROC=1 это самая меньшая из проблем во всем этом. Главная проблема была в другом — невозможность прерывания потоков ведет к непредсказуемым задержкам во всем рантайме.

К примеру, возьмем тот же самый пример с бесконечным циклом, но GOMAXPROC будет больше единицы. Вопрос, будет ли дедлок? Будет, но потом. Все дело в GC. Ему для работы надо stop the world делать, а для этого надо остановить все горутины. Если одна из них в бесконечном цикле, то это повесит все приложение — GC остановит все остальные горутины и будет ждать, пока остановится та, что в бесконечном цикле.

Но то тоже довольно синтетическая проблема. На деле все сложнее. Некоторые реальные приложения содержат длинные циклы, которые не получается прервать (например, там одна математика). GC все так же придется ждать, пока этот цикл закончится, чтобы начать цикл сборки, а это опять повесит все приложение. Ненадолго, но повесит. Это хотели решать тупо — вставлять на каждой итерации циклов вызов рантайма. Это работает, но медленно. Хотели делать умнее и делать вставки как-то хитрее, но не вышло. В итоге и пришли к текущему варианту.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации