什么是"安全点功能"如Go源代码中所提到的那样?

时间:2015-09-28 21:01:54

标签: go

runtime/proc.goGo source code文件中,有许多评论涉及安全点功能,这些评论似乎与安全点安全的时间点相关。垃圾收集。但是,我找不到这些功能的任何定义。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

  

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

同一个帖子中的另一个用户提到了GC

  

在功能期间将抢占点折叠到堆栈检查中   prologs

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

根据golang-dev邮件列表中的this post,安全点也被称为"呼叫站点"。

为了深入了解Go的安全点,我认为了解GC的发展非常重要。 This post提及以下内容:

  

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

     

Go 1.5引入了一个并发收集器。

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

  

从Go 1.7开始,剩下的一个无限且可能的来源   非平凡的世界末日(STW)时间是堆栈重新扫描。

从1.8开始,它看起来像worst-case stop-the-world times have been improved

此外,here是Go的垃圾收集器的当前实现。如果你仔细阅读了评论,你就会发现它是一个非世代的标记扫描收集器。您可以在此处详细了解:https://blog.plan99.net/modern-garbage-collection-911ef4f8bd8e#.udz1kjk3b

最后,here是Gil Tene在golang-dev邮件列表上的一篇老帖子,该帖子激发了移动垃圾收集器的使用。他声称(在2012年的时候)Go正在使用一个保守的,非搬迁的收藏家"他讨论了允许长期运行的垃圾收集器的安全点的特征。

虽然Go的垃圾收集器已经moving away from long pauses并且现在是一个"并发,三色,标记扫描收集器",它仍然是非世代的GC。看起来Go的GC正在建立70年代的GC思想,而不是现代的企业方法。

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