请点击上方蓝字TonyBai订阅公众号!
你好,我是Tony Bai。
欢迎来到【Go并发调度艺术】微专栏的最后一篇。在前两篇中,我们跟随Dmitry Vyukov的思路,见证了Go调度器如何从应对并发初心的M:N模型,逐步演进到高度可伸缩且高效的M:P:N(GMP)模型。通过引入P(Processor)、本地运行队列(LRQ)和工作窃取等机制,GMP模型成功地破解了早期全局锁的瓶颈,并优雅地处理了系统调用带来的复杂性。
然而,一个卓越的调度器,仅仅做到高效和可伸缩是不够的。它还需要在更细微之处展现其“艺术与匠心”,例如:如何保证所有goroutine
都有机会执行,即公平性 (Fairness)?如何兑现为开发者提供逻辑上“无限”栈 (Infinite Stacks) 的承诺?以及,如何在必要时优雅地抢占 (Preemption) 长时间运行的goroutine
,以保证系统的整体响应性和GC等关键操作的顺利进行?
今天,我们将聚焦于GMP模型之上的这些“品质”打磨,看看Dmitry Vyukov和Go团队是如何在这些方面进行精妙设计和权衡的。
好的,我们来按照您的新思路调整和优化“公平性的‘氧气’哲学:避免Goroutine饿死”这一小节的内容。我们将从具体问题出发,引出Go调度器的多层次公平性保障机制是如何建立起来的。