前言本文原创,著作权归WGrape所有,未经授权,严禁转载一、说明为方便阅读,“线程”、“协程”、“子程序”虽然是有区别的,但在本文中不做区分,存在混用的情况文章虽然以Go语言为主题,但很多原理和思想对于其他语言都是通用的,可举一反三内容尽量浅尝辄止,不过于广泛或细节而偏离主题的
在主 goroutine 里,先用 GoMAXPROCS 函数拿到 CPU 的逻辑核心数 threads。它会切到 g0 栈执行 gopreempt_m,自然它也会保存 goroutine 的执行进度,其实就是 SP、BP、PC 寄存器的值,当 goroutine 再次被调度执行时,就会从原来的执行流断点处继续执行下去。
如果你在GOPATH中设置了多个工作区,那么这种查找会以从左到右的顺序在这些工作区中进行。其中的程序实体可以帮助我们记录程序中各个 goroutine 的状态、各种系统调用的状态,与 GC 有关的各种事件,以及内存相关和 CPU 相关的变化,等等。