Go高级看这一篇就够了
程序员文章站
2022-07-10 16:14:45
...
引言
走完进阶后的一个最大感受是能把调度做好很难,跟现实中高级工程师一样,站在工程的角度看待设计、处理问题和调度资源。
这里只是搬过来,详细的描述请移步到他们的公众号或者博客,谢谢。
【饶神公众号关于调度的十个系列】
铺垫
- 三个角度区别goroutine和线程:内存消耗、创建与销毀、切换
- 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:
小结
他的系列文章中看的最明白的是1和10,因为中间的编译分析大多没看懂。基本思想理解了,主要是想参看源码是怎么从代码的角度去实现这种思想的。
【欧神出版对go源码的解读】
【曹神出版从plan9对源码】
上一篇: 跨域与JSONP
下一篇: 弄懂this,看这一篇就够了!