文章目录
引言
这部分需要把go的runtime弄明白
走完进阶后的一个最大感受是能把调度做好很难,跟现实中高级工程师一样,站在工程的角度看待设计、处理问题和调度资源。
这里只是搬过来,详细的描述请移步到他们的公众号或者博客,谢谢。
【go程序是怎么跑起来的】
【饶神公众号关于调度的十个系列】
第一、调度-GPM
-
M:N 模型
-
什么是scheduler
-
为什么需要scheduler以及它是怎么做到的
目标:For scheduling goroutines onto kernel threads.
核心思想是:
1.reuse threads;
2.限制同时运行(不包含阻塞)的线程数为 N,N 等于 CPU 的核心数目;
3.线程私有的 runqueues,并且可以从其他线程 stealing goroutine 来运行,线程阻塞后,可以将 runqueues 传递给其他线程。
核心内容主要包括:
1、GPM 的初始化
2、M 是怎样一步步找工作
3、用户栈和 g0 栈的切换
4、schedule 的调度循环是怎样运转的
5、监控线程( sysmon)做了什么
-
抢占处于系统调用的 P,让其他 m 接管它,以运行其他的 goroutine。
-
将运行时间过长的 goroutine 调度出去,给其他 goroutine 运行的机会。
6、宏观状态转换
- G:
- P:
- M: