经过前面的知识,我们已经知道一个m启动后会调用schedule
进行一轮调度,那经过这一轮调度后这个m还会再进行下一轮调度么?答案是的,那我们来看一下schedule
是怎么做到循环调度的。
在分析goroutine创建代码newproc
时我们已经知道,一个gouroutine执行完后会调用goexit
,那我们来看一下是不是goexit
实现了循环调度的功能呢?先看代码
//asm_amd64.s
TEXT runtime·goexit(SB),NOSPLIT,$0-0
BYTE $0x90 // NOP
CALL runtime·goexit1(SB) // does not return
// traceback from goexit1 must hit code range of goexit
BYTE $0x90 // NOP
goexit
由汇编实现,可以看到调用了goexit1
,那我们接着看goexit1
代码