(上图中的 struct 和函数都做了精简)
GM 模型及 GPM 模型
有了协程的这种执行流形式, 那待运行的协程放在哪呢在 Go1.0 的时候:
调度队列 schedt 是全局的, 对该队列的操作均需要竞争同一把锁...协作式抢占
go 目前(1.12)还没有实现非协作的抢占. 基本流程是 sysmon 协程标记某个协程运行过久, 需要切换出去, 该协程在运行函数时会检查栈标记, 然后进行切换....图展示的是一个简单的原理.有几个问题可以思考一下:
并发情况下, 会不会漏标记对象对象的三色状态存放在哪如何根据一个对象来找到它引用的对象
写屏障
GC 最基本的就是正确性: 不漏标记对象, 程序还在用的对象都被清除了...如何解决这个问题? go 使用了写屏障, 这里的写屏障是指由编译器生成的一小段代码....GC 结束后, 会根据这一次 GC 的情况来进行负反馈计算, 计算下一次 GC 开始的阈值.
如何保证按时完成 GC 呢?