内容简介:有两张不错的gif图(原子wikipedia)最先看的文章,引用了上面的文章在讨论 Go 的混合写屏障
资料阅读
有两张不错的gif图(原子wikipedia) https://zhuanlan.zhihu.com/p/74853110
最先看的文章,引用了上面的文章 https://www.jianshu.com/p/4c5a303af470
在讨论 Go 的混合写屏障 https://github.com/changkun/go-under-the-hood/issues/20
解释了为啥有 read barrier https://www.zhihu.com/question/42879518/answer/437304734
这些个文章看完,总觉得其中对golang的混合写屏障没说透,甚至感觉有错误说法。
三色标记的理解
基本的mark-sweep算法
基本算法有个缺点,需要STW(stop the world),有较大延时。
三色标记法(tricolor mark-sweep)
三色标记的过程中,节点颜色变化:白色》灰色》黑色。当没有灰色了,标记结束,黑色存活,白色清除。
三色标记可以实现增量回收和并发回收,能降低延时(latency);当然也有缺点,会降低吞吐量(throughput)。
三色标记正确运行需要满足下面2个条件中的一个:
- 强三色不变式:黑色对象不引用白色对象。
- 弱三色不变式:黑色对象引用的白色对象可以通过灰色对象搜索到。
当使用增量回收和并发回收时,回收过程中,用户程序会新建对象修改对象引用,会破坏上面的条件。写屏障就是为了处理这个事情。
有两套方案
// 当obj是黑色时,标记插入的*prt对象至少为灰色。满足强三色条件 // GC运行时,新new出来的对象,可以直接标记成黑色。 djjkstra_write_barrier(obj, ref, ptr){ shade(ptr) // shade的做法时如果是白色就标记成灰色,否则不变。后面的伪代码都是这个意思。 ref = ptr } // 从obj上删除ref时,标记*ref至少为灰色。这样可以满足弱三色条件 // 悲观认为所有被删的对象都可能被黑色对象引用了,效率很低的样子。 // **注意:**GC运行时,新new出的对象必须直接标记成黑色 yuasa_write_barrier(obj, ref, ptr){ shade(ref) // 当obj时黑色时,可以不标记,因为删掉黑色到白色之类引用关系不破坏弱三色条件 ref = ptr }
一般来说dijk就挺好的,但像golang这种希望写栈上的引用时不使用写屏蔽,提高性能,所以得找别的方法。
- golang早期用的dijk的方法,得把栈本身重新标记成灰色,mark的最后阶段STW,然后扫描下栈,完成标记。这样说是最后结算的延时可以达到100ms。
- golang 1.8 用yuasa的方法,也同样存在同样的问题。这时可以当栈还不是黑色时,所有复制操作,额外把ptr标记成灰色,就当是从栈里删除下来的。
伪代码
// golang 1.8的方式,说法是结合了dij和yuasa。效率(吞吐量)比yuasa还低。 // **注意:**GC运行时,新new出的对象必须直接标记成黑色 golang_hybird_write_barrier(obj, ref, ptr){ shade(ref) // 当栈本身还没完成扫描时,假定ptr就是从栈上删除取下来的对象。当栈扫描完,可以当成标记为黑色,这时就不需要补充标记了。 if current stack is grey: shade(ptr) ref = ptr }
这样就可以实现,栈里面的写操作不需要barrier处理,扫描最后也不需要STW重新扫描栈。
欢迎关注我们的微信公众号,每天学习Go知识
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- CyclicBarrier - 同步屏障实现分析
- Java 并发编程(三):MESI、内存屏障
- Java 并发编程(三):MESI、内存屏障
- 刘睿民:数据库是保障数据安全的有力屏障
- Golang三色标记、混合写屏障GC模式图文全分析
- Java并发编程的艺术(十一)——倒计时器、同步屏障、信号量
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
精通CSS(第2版)
[英] Andy Budd、[英] Simon Collison、[英] Cameron Moll / 陈剑瓯 / 人民邮电出版社 / 2010-5 / 49.00元
本书汇集了最有用的CSS技术,介绍了CSS的基本概念和最佳实践,结合实例探讨了图像、链接和列表的操纵,还有表单设计、数据表格设计、纯CSS布局等核心CSS技术。此外,书中着眼于创建跨浏览器的技术,讨论了bug及其捕捉和修复技术,还将所有技术组合成两个精彩的实例,讲述这些技术的工作原理和实际用法。 本书适合具有HTML和CSS基础知识的读者阅读。一起来看看 《精通CSS(第2版)》 这本书的介绍吧!
CSS 压缩/解压工具
在线压缩/解压 CSS 代码
JSON 在线解析
在线 JSON 格式化工具