跟雨痕看go源码02.02- 并发清理与三色标记(未完待续)

bairongdong1 · · 2926 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

据说这是go优化最狠的地方。
http://blog.csdn.net/erlib/article/details/51850912
大意是说twitch.tv觉得一次标记的STW(stop the world,就是jojo里面的技能,标记和回收时间很长,所有应用代码都无法工作)太强力了竟然需要2秒钟,不能忍,所以在和go开发团队多次沟通后,开始了大量的优化,这里的代码充斥着并发优化的痕迹。据说到了go1.7的时候STW仅剩下1毫秒。。。go1.5就已经达到了200ms(已经不错了哦)。
我们现在可以看一下go1.5所做的优化orz。大神好厉害。orz orz orz。

三色标记的基本逻辑:
- 起初所有对象都是白色。
- 扫描找出所有可达对象标记为灰色,翻入待处理队列。
- 从队列中提取灰色对象,将其引用的对象标记为灰色放入队列。自身标记为黑色。
- 写屏障件事所有对象内存修改,重新标色或放回队列。

初始化
在schedinit里面的gcinit()初始化
启动,在申请新内存时的函数newobject()的末尾就会检查一下,如果达到一定的量就触发。
最终调用gc函数启动。

首先先来看雨痕大大给的gc的标记清理的主流程:
这里写图片描述

这里的主要牛b的代码在并发扫描和并发清理:

并发扫描gcBgMarkStartWorkers,为每个p绑定一个worker,每个p的worker会消耗gcw里面的任务进行循环标记(一共会进行两次大的标记,都由这个逗b负责),它自己还有好多模式,专门标记模式和普通模式。

初始化喂这些gcw是一个叫gcscan_m (通过parfosetup&parfordo框架)调用的markroot->scang->scanblock->扫描所有的灰色对象喂入第一批的灰色任务到gcw。。。

并发清理如果是同步清理那直接调用sweepone->依次遍历找出所有的work的spans(work.spans),然后,逐个回收spans(回收部分在02.01提到了)。
如果是并发清理则每调用一次gosweepone就重新gosched一次避免无限堵塞,同时申请新的内存在mcentral阶段也会考虑帮着sweepone一下。

至于其他细节 parfo框架和gcw队列只能未完待续了。。。。


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:bairongdong1

查看原文:跟雨痕看go源码02.02- 并发清理与三色标记(未完待续)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2926 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传