我翻译了Goroutine Scheduler Revealed: Never See Goroutines the Same Way Again, 这篇文章发表于1月2号,作者在文章最后说:在接下来的部分,我们将更深入地探讨抢占式调度,并分析调度程序在运行期间所采取的每一步骤。接下来快三个月了,也没有下文了,貌似鸽了。为了不让读者等待,我接下来把相关的内容补上。当然,Go的调度器也在演化之中,你看几年前的代码,或者几年后的代码,可能就没有办法一一对应了,我们以1.21.1版本讲解。schedule 函数函数schedule执行一次调度器循环,找到一个可运行的goroutine并执行它。这个函数永不返回。当一个goroutine执行完毕,它会再次调用schedule函数来选择下一个要执行的goroutine。这就是为什么schedule函数看起来像是永不返回:它总是在选择和执行goroutine,除非没有更多的goroutine可以执行。schedule函数并不是通过常规的函数调用栈来调度goroutine的。当一个goroutine结束执行,它并不是通过返回到schedule函数来调度下一个goroutine,而是通过一种称为 "栈切换" 的技术。在具体实现上,每个goroutine都有自己的栈,当它开始执行时,运行时系统会将当前的栈指针切换到这个goroutine的栈,当它结束
...
继续阅读
(129)