Подтвердить что ты не робот

Что такое "функции безопасных точек", как указано в исходном коде Go?

В файле runtime/proc.go Исходный код Go, есть много комментариев, относящихся к функциям безопасных точек, которые, по-видимому, связаны с точками времени, когда безопасно собирать мусор. Однако я не мог найти никаких определений этих функций.

Что такое функции безопасной точки, для чего они используются, и какие примеры таких функций?

4b9b3361

Ответ 1

Вот все, что я мог бы выкопать на эту тему.

Я нашел некоторое обсуждение о Go GC safepoints здесь.

Похоже, что безопасные точки (используемые в реализации Go) фактически аналогичны традиционному определению безопасной точки:

где GC может отслеживать, что все переменные и регистры удерживая нажатой клавишу

Другой пользователь в том же потоке упоминает, что GC

складывает точки превенции в проверки стека во время функции prologs

и что источником для этого утверждения является следующее: https://github.com/golang/go/issues/10958

В соответствии с этот пост в списке рассылки golang-dev, safepoints также называются "сайтами вызовов".

Чтобы получить некоторое представление о природе безопасных точек Go, я считаю важным рассмотреть эволюцию своего GC. В этом сообщении упоминается следующее:

До Go 1.5, Go использовал параллельный stop-the-world (STW) коллектор.

В Go 1.5 вводится параллельный сборщик.

Еще один ответ на этот вопрос:

Начиная с Go 1.7, один оставшийся источник неограниченного и потенциального нетривиальное время остановки (World) (STW) - это повторное сканирование стека.

Начиная с версии 1.8, это выглядит как в худшем случае время прекращения мира улучшено.

Кроме того, здесь является текущей реализацией сборщика мусора Go. Если вы прочтете комментарии, вы увидите, что это сборщик маркеров без генерации. Подробнее об этом можно прочитать здесь: https://blog.plan99.net/modern-garbage-collection-911ef4f8bd8e#.udz1kjk3b

Наконец, здесь - это старый пост Гила Тене в списке рассылки golang-dev, который мотивирует использование движущегося сборщика мусора. Он утверждал (в то время, в 2012 году), что Go использовал "консервативный, неперемещающийся коллекционер", и он обсудил характеристики safepoints, которые позволили бы длинному сборщику мусора.

В то время как Go сборщик мусора был отходит от длинных пауз и теперь является "параллельным, трехцветным, собирающим метки", он по-прежнему является негенеративным GC. Похоже, что Go GC строится на идеях GC от 70-х годов, а не современных, корпоративных подходов.

Похоже, что понятие "точка-точка" в Go больше соответствует традиционному понятию safepoint, а не safepoint с современными качествами, которые позволяют сборку мусора для генерации.