什么是「;“安全点功能”;正如Go源代码中提到的那样?

什么是「;“安全点功能”;正如Go源代码中提到的那样?,go,Go,在的文件中,有许多注释指向安全点函数,它们似乎与垃圾收集安全的时间点有关。但是,我找不到这些函数的任何定义 什么是安全点函数,它们的用途是什么,这些函数的一些示例是什么?以下是我在这个主题上可以挖掘的所有内容 我发现一些关于Go的GC安全点的讨论 看起来安全点(在Go实现中使用)实际上与安全点的传统定义相同: GC可以跟踪所有变量和寄存器的关键点 持有 同一线程上的另一个用户提到GC 在函数执行期间,将抢占点折叠到堆栈检查中 序言 该索赔的来源如下: 根据golang dev邮件列表,安全点也称

在的文件中,有许多注释指向安全点函数,它们似乎与垃圾收集安全的时间点有关。但是,我找不到这些函数的任何定义


什么是安全点函数,它们的用途是什么,这些函数的一些示例是什么?

以下是我在这个主题上可以挖掘的所有内容

我发现一些关于Go的GC安全点的讨论

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

GC可以跟踪所有变量和寄存器的关键点 持有

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

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

该索赔的来源如下:

根据golang dev邮件列表,安全点也称为“呼叫站点”

为了深入了解Go的safepoints的本质,我认为查看其GC的演变非常重要。提到以下内容:

在Go 1.5之前,Go使用了平行世界站(STW) 收藏家

Go 1.5引入了并发收集器

对该问题的另一个答复提到:

截至Go 1.7,剩余的一个无限和潜在 非平凡停止世界(STW)时间是堆栈重新扫描

从1.8开始,它看起来像

另外,是Go的垃圾收集器的当前实现。如果您通读这些注释,您将看到它是一个非世代标记扫描收集器。您可以在此处阅读更多关于此的信息:

最后,是Gil Tene在golang dev邮件列表上的一篇旧文章,它激发了移动垃圾收集器的使用。他声称(在2012年的时候)Go使用的是“保守的、不重新定位的收集器”,并讨论了允许长时间运行垃圾收集器的safepoints的特性

虽然Go的垃圾收集器过去和现在都是一个“并发、三色、标记清除收集器”,但它仍然是一个非代GC。看起来Go的GC是基于70年代的GC思想,而不是现代的企业方法


Go关于safepoint的概念似乎更符合传统的safepoint概念,而不是具有允许分代垃圾收集的现代品质的safepoint。

这些是GC和运行时的实现细节,在语言本身中无法访问。如果你问我们这个特定版本的运行时是如何工作的,那是一回事,但这对任何用户编写的代码都没有影响。@JimB,我想了解Go中的线程库实现(即GoRoutine是如何实现和调度的细节),这似乎至少与GC行为和安全点相关。您是对的,这与语言的使用无关。我对当前运行时不是最新的,但这与GC密切相关,可能会引起您的兴趣。如果您感兴趣,您会发现以下关键注释:“从现在起,任何输入_Pidle或_Psyscall的P将观察P.runSafePointFn==1,并在将其状态更改为_Pidle/_Psyscall时调用runSafePointFn。“。您将看到,
entersyscall
调用的
reentersyscall
,在检查
runSafePointFn
后,将P的状态设置为
\u Psyscall
。因此,在面包屑之后,系统调用和其他使goroutines空闲的事情(同步/通道操作)可能导致GC安全点。还听说了负责根据需要增加堆栈的函数prelude(
morestack
)有时会导致在最新版本的Go中切换goroutines;我不知道,但也许这也能带来一个安全点。