Go源代码中提到的"安全点函数"是什么?

mer*_*011 12 go

Go源代码的文件runtime/proc.go中,有许多注释涉及安全点函数,它们似乎与垃圾收集安全的时间点相关.但是,我找不到这些功能的任何定义.

什么是安全点功能,它们用于什么,以及这些功能的一些示例是什么?

rud*_*024 4

这是我能在这个主题上挖掘到的所有内容。

我在这里找到了一些关于 Go GC 安全点的讨论。

看起来安全点(在 Go 实现中使用)实际上与安全点的传统定义相同:

GC 可以跟踪所有变量和寄存器所保存内容的关​​键点

同一线程上的另一个用户提到 GC

在函数序言期间将抢占点折叠到堆栈检查中

该声明的来源如下:https://github.com/golang/go/issues/10958

根据golang-dev 邮件列表上的这篇文章,安全点也称为“调用站点”。

为了深入了解 Go 安全点的本质,我认为了解 GC 的演变很重要。这篇文章 提到了以下内容:

在 Go 1.5 之前,Go 使用并行停止世界(STW)收集器。

Go 1.5 引入了并发收集器。

该问题的另一个答案提到:

从 Go 1.7 开始,无限且可能不平凡的停止世界(STW)时间的剩余来源之一是堆栈重新扫描。

从 1.8 开始,最坏情况下的世界停止时间似乎已经得到了改善。

另外,这里是 Go 垃圾收集器的当前实现。如果您仔细阅读注释,您会发现它是一个非分代标记清除收集器。您可以在这里阅读更多相关信息:https://blog.plan99.net/modern-garbage-collection-911ef4f8bd8e#.udz1kjk3b

最后,是 Gil Tene 在 golang-dev 邮件列表上发表的一篇旧帖子,它鼓励使用移动垃圾收集器。他声称(当时是 2012 年)Go 使用的是“保守的、非重定位的收集器”,并且他讨论了允许长时间运行垃圾收集器的安全点的特征。

虽然 Go 的垃圾收集器已经摆脱了长时间的暂停,现在是一个“并发、三色、标记-清除收集器”,但它仍然是一个非分代 GC。看起来 Go 的 GC 是建立在 70 年代的 GC 思想之上的,而不是现代的企业方法。

看起来 Go 的安全点概念更符合传统的安全点概念,而不是具有允许分代垃圾收集的现代品质的安全点。