线程在sheduled()->execute()->gogo()->业务方法->goexit()中循环,前三个方法的状态记录在g0栈中,后两者记录在协程自己的栈中.
sheduled 在各种队列(本地,全局,其他线程那边拿)中拿到一个协程,然后用execute函数给一些g结构体字段赋值,跳转到gogo方法.
gogo方法是汇编方法,传递gobuf指针(其中包括栈指针和程序计数器),在协程栈中插入goexit栈帧,用于协程结束后退出.同时跳转到程序计数器指示位置执行代码.
g 协程执行结束,栈帧一个个退出直到退出到goexit栈帧.
goexit函数执行mcall(g0exit)切换到g0 stack,执行g0exit函数设置协程状态,然后重新执行sheduled方法