先来看看goroutine调度器相关重要结构体,位于Go源代码下runtime/runtime2.go。
因其成员变量极多,细节极其复杂,所以只看与调度器相关的成员变量。
stack:记录goroutine使用的栈信息,包括栈顶和栈底的位置信息。
// Stack describes a Go execution stack.// The bounds of the stack are exactly [lo, hi),// with no implicit data structures on either side.//用于记录goroutine使用的栈的起始和结束位置type stack struct {lo uintptr // 栈顶,指向内存低地址hi uintptr // 栈底,指向内存高地址}
gobuf:保存goroutine的调度信息,主要是CPU几个寄存器的值。
type gobuf struct {// The offsets of sp, pc, and g are known to (hard-coded in) libmach.//// ctxt is unusual with respect to GC: it may be a// heap-allocated funcval, so GC needs to track it, but it// needs to be set and cleared from assembly, where it's// difficult to have write barriers. However, ctxt is really a// saved, live register, and we only ever exchange it between// the real register and the gobuf. Hence, we treat it as a// root during stack scanning, which means assembly that saves// and restores it doesn't need write barriers. It's still// typed as a pointer so that any other writes from Go get// write barriers.sp uintptr // 保存CPU的rsp寄存器的值pc uintptr // 保存CPU的rip寄存器的值g guintptr // 记录当前这个gobuf对象属于哪个goroutinectxt unsafe.Pointer// 保存系统调用的返回值,因为从系统调用返回之后如果p被其它工作线程抢占,// 则这个goroutine会被放入全局运行队列被其它工作线程调度,其它线程需要知道系统调用的返回值。ret sys.Uintreglr uintptr// 保存CPU的rip寄存器的值bp uintptr // for GOEXPERIMENT=framepointer}
g:用于代表一个goroutine,保存了goroutine的所有信息,包括栈。
// 前文所说的g结构体,它代表了一个goroutinetype g struct {// Stack parameters.// stack describes the actual stack memory: [stack.lo, stack.hi).<

最低0.47元/天 解锁文章
1720

被折叠的 条评论
为什么被折叠?



